2023年6月21日发(作者:)

sql语句进阶教程(学习sql这⼀篇就够了)最近从图书馆借了本介绍SQL的书,打算复习⼀下基本语法,记录⼀下笔记,整理⼀下思路,以备⽇后复习之⽤。PS:本⽂适⽤SQL Server2008语法。⼀、关系型数据库和SQL实际上准确的讲,SQL是⼀门语⾔,⽽不是⼀个数据库。什么是SQL呢?简⽽⾔之,SQL就是维护和使⽤关系型数据库中的的数据的⼀种标准的计算机语⾔。1.1 SQL语⾔主要有3个主要的组成部分。1. DML(Data Manipulation Language)数据操纵语⾔。这个模块可以让我们检索、修改、增加、删除数据库中的数据。2. DDL(Data Definition Language)数据定义语⾔。是的我们能够创建和修改数据库本⾝。如:DDL提供ALTER语句,他让我们可以修改数据库中表的设计。3. DCL(Data Control Language)数据控制语⾔,⽤于维护数据库的安全。在SQL术语中,记录(record)和字段(field)实际上就称为⾏(row)和列(column)。1.2 主键和外键主键之所以有必要:⾸先使你唯⼀标识表中单独的⼀⾏。主键确保了唯⼀性。可以很容易的将⼀个表和另⼀个表关联。主键⼀般就会⾃动默认创建索引,提⾼了查询速度。外键就是说A表中的某个字段,同时是B中的主键,那么这个字段就是A表中的外键。希望A表中的这个外键的值必须是B中已经存在的值。1.3 数据类型⼀般来讲,有3中重要的数据类型:1. 数字(Numeric)2. 字符(Character)3. 以及⽇期/时间(Date/Time)bit是数字型,它只允许两个值,0和1。类型charncharvarcharnvarchar长度固定长度固定长度可变长度可变长度说明处理unicode数据类型(所有的字符使⽤两个字节表⽰)效率没char⾼ 灵活处理unicode数据类型(所有的字符使⽤两个字节表⽰)1字节=8位bit就是位,也叫⽐特位,是计算机表⽰数据最⼩的单位。byte就是字节,1byte=8bit,1byte就是1B;⼀个字符=2字节;1.3 空值空值不等于空格或空⽩。使⽤NULL表⽰空值。⼆、简单增删改查2.1 查(列名有空格的情况)12SELECTlast nameFROM⽤⽅括号将有空格的列名括起来。PS: MySql中⽤重⾳符`(~)按键。Oracle⽤双引号。查询顺序,SQL执⾏顺序:12345612distinct3 1 2 3 4 62.2 增123456columnlistRowValues1RowValues2repeat2.3 改123UPDATE tableSETrepeat any number ofWHERE2.4 删123DELETEFROM tableWHERE删除前可以验证⼀下:1234SELECT

COUNTFROM tableWHERE如果想要删除所有的⾏,可以:1DELETE FROM table或者1TRUNCATE TABLE tableTRUNCATE TABLE优势在于速度更快,但是不提供记录事务的结果。另外⼀个不同点是,TRUNCATE TABLE重新设置了⽤于⾃增型的列的当前值,DELETE不会。三、别名关键字:AS3.1 计算字段使⽤计算字段可以做如下的事情:选择特定的单词或者数值对单个或者多个列进⾏计算把列和直接量组合在⼀起。3.2 直接量这个直接量和表中的数据没有任何关系,就是为了说明所⽤,下⾯这种类型的表达式就叫做直接量(literal value)。12SELECT '直接量' AS `类型`FROM `customers`如图,结果中直接量就在⼀列中了。3.3 算数运算例⼦1:12SELECT numASFROM例⼦2:12SELECT' 'AS 'fullname'FROM users在MySql中连接要是⽤CONCAT函数:123SELECTCONCAT' 'AS 'fullname'FROM3.4 别名1)列的别名12SELECTASFROM2) 表的别名12SELECTFROMAS说明:1. 列的别名是为了显⽰⽤的,别名会作为查询结果的表头,不能在WHERE中使⽤列的别名,会出错2. 表的别名确实是为了⽅便操作⽤的,可以在WHERE中使⽤列的别名进⾏!四、使⽤函数函数要有⼀组圆括号跟在关键字后边,圆括号告诉我们,这是⼀个函数!4.1 字符函数LEFT&RIGHTLEFT(CharacterValue,NumberOfCharacters)含义:选择CharacterValue字段的左边NumberOfCharacters⼏个字符。ps:RIGHT是右边⼏个字符。LTRIM&RTRIMLTRIM(CharacterValue)可以删除左边开始的空格。RTRIM作⽤类似。SUBSTRINGSUBSTRING(CharacterValue,StartPositon,NumberOfCharacters)含义:选择从开始位置(包括),N个长度的字符。12SELECT

SUBSTRING'thewhitegoat'45AS 'The Answer'返回:white4.2 ⽇期/时间函数GETDATE1GETDATE()返回当前⽇期和时间。PS:在MySql中,等价函数是NOW,在Oracle中是CURRENT_DATE。DATEPART能够分析具体的⽇期,并且返回诸如该⽇期是该⽉中的第⼏天,或者该年份中的第⼏周等信息。1DATEPART(datepart,DateValue)datepart可以是许多不同的值,如下都是有效值:yearquartermonthdayofyeardayweekweekdayhourminutesecondDATEDIFF可以让我们得到任意两个⽇期之间相差的天数(或周数、⽉数等)。1DATEDIFF(datepart1,startdate1,startdate2)DATEDIFF Function ExpressionDATEDIFF(day,’7/8/2009’,’8/14/2009’)DATEDIFF(week,’7/8/2009’,’8/14/2009’)DATEDIFF(month,’7/8/2009’,’8/14/2009’)DATEDIFF(year,’7/8/2009’,’8/14/2009’)Resulting Value37510PS:MySql中,DATEDIFF函数只允许我们计算两个⽇期之间的天数,如果想要得到⼀个正数,结束的⽇期通常要作为第⼀个参数:1DATEDIFF(enddate,startdate)Oracle中没有等价函数4.3 数值函数ROUND允许我们四舍五⼊。1ROUND(numericvalue,decimalpalaces)RAND⽤来产⽣随机数1RAND([seed])没有参数时,它会返回0-1之间的⼀个随机数。1SELECT RANDAS 'Random Value'可选参数seed有的情况下,每次将返回相同的值。这让我想起了Python中的Random包。看来很多时候,⼀些东西是共通的啊。PIPI()函数如果想要对它保留两位⼩数,可以通过复合函数进⾏:1PI2将会返回:3.144.4 转换函数CAST函数允许我们把数据从⼀种类型转换成另⼀种类型。1CAST(expression AS DateType)例⼦:123SELECT

'2009-04-11' AS 'Original Date'CAST'2009--04-11' ASAS 'Converted Date'ISNULL函数,很有⽤可以把NULL值转换成⼀个有意义的值。123SELECTISNULL'Unknown'AS 'Color'FROM五、排序函数5.1 添加排序123SELECTFROMORDER BY默认是升序,ASC,因此,上⾯等价于:123SELECTFROMORDER BYASC5.2 降序使⽤DESC关键字:123SELECTFROMORDER BYDESC5.3 根据多列12345SELECT

FROMORDER BY注意:列的顺序很重要,⾸先按照LastName排序,然后按照FirstName排序。5.4 根据计算字段123SELECT','AS 'Name'FROMORDER BY Name因此,从这⼉可以知道,列别名不可以⽤在WHERE中,但可以⽤在ORDER BY中。例⼦123SELECTFROMORDER BYAS 'Name'5.5 排序补充内容当数据升序时,出现顺序是如下:NULL->数字->字符注意:此时,该列中的数字其实是按照字符来算的,因此,升序时,23也是排在5之前的。六、基于列的逻辑-CASE6.1 IF-THEN-ELSE逻辑包含列和CASE表达式的SELECT语句,⼤概如下:12345SELECT

FROM table6.2 CASE-简单格式1234567SELECT

CASEWHENTHENWHENTHENrepeat WHENTHEN any number ofELSEENDCASE表达式对于把不好理解的值转换成有意义的描述是很有⽤的。12345678SELECT

CASEWHEN 'F' THEN 'Fruit'WHEN 'V' THEN 'Vegetable'ELSE 'other'END AS 'Category'As 'Description'FROM6.3 CASE-查询格式1234567SELECT

CASE

WHENTHENWHENTHENrepeat WHENTHEN any number ofELSEEND这种格式允许在关键字WHEN后边放置较为复杂的条件表达式。相关问题:七、基于⾏的逻辑7.1 应⽤查询条件终于派到WHERE出场了,注意写法顺序,再写⼀遍:12345612distinct3 1 2 3 4 67.2 限制⾏-TOP1234SELECT

Number

FROM table7.3 TOP和ORDER BY结合关键字TOP的另⼀个⽤途是,把它和ORDER BY⼦句结合起来,基于特定分类,得到带有最⼤值的⼀定数量的⾏。假设你想看到Shakespeare所著的销量最多的书。1234567SELECT

AS 'Book Title'AS 'Quantuty Sold'FROMWHERE'Shakespeare'ORDER BYDESCps: 学会利⽤google搜索,例如,我想要知道oracle中类似top作⽤的关键字是什么,可以:⼋、布尔逻辑关键字:AND/OR/NOT/BETWEEN/IN/IS/NULL8.1 OROR⼦句意味着,如果确定任意条件为真,那么就该选中该⾏。1234SELECTnameFROM usersWHERE18OR608.2 使⽤圆括号1234567SELECTFROMWHERE'IL'OR'CA'AND8本来想要的结果是对来⾃IL或者CA的客户,同时,只看数量⼤于8的订单。但是上⾯执⾏的结果不是这样的,因为,SQL总是会先处理AND操作符然后才会处理OR操作符。所以,上述语句中,先看到AND并执⾏如下的条件12'CA'AND8因此,要⽤括号来规定顺序:1234567SELECTFROMWHERE'IL'OR'CA'AND88.3 NOT操作符NOT操作符表⽰对后边的内容否定或者取反。123SELECTFROMWHERE NOT'IL' OR'NY'这个其实可以⽤AND改写的NOT操作符在逻辑上不是必须的。8.4 BETWEEN操作符12345SELECTFROMWHEREBETWEEN 8 AND 108.5 IN操作符假设你想看到IL或者NY的⾏:1234SELECTFROMWHERE'IL'OR'CA'可以改写成:123SELECTFROMWHEREIN'IL''CA'8.9 布尔逻辑-IS NULL为了将某字段NULL值的⾏或0的⾏包括进来:1234SELECTFROMWHERE0ORIS NULL或者123SELECTFROMWHERE ISNULL00九、模糊匹配9.1 LIKE和%搭配%通配符可以表⽰任意的字符,它可以表⽰0个,1个,任意多个字符。9.2 通配符除了%以外,还有下划线(_)、⽅括号起来的characterlist,以及⽤⽅括号括起来的脱字符号(^)加上characterlist。下划线表⽰⼀个字符[characterlist]表⽰括号中字符的任意⼀个[^characterlist]表⽰不能是括号中字符的任意⼀个例⼦:12345SELECT

FROMWHERELIKE '[CM]ARY'检索以C或者M开头并以ARY结尾的所有⾏。9.3 按照读⾳匹配SOUNDEX和DIFFERENCE⼗、汇总数据10.1消除重复使⽤DISTINCT12SELECTnameFROM users如果age不同,即使name相同,那么这⼀⾏就不会被删除重复。10.2 聚合函数COUNTSUMAVGMINMAX,他们提供了对分组数据进⾏计数、求和、取平均值、取最⼩值和最⼤值等⽅法。12345SELECT

AVGAS 'Average Quiz Score'MINAS 'Minimum Quiz Score'FROMWHERE'Quiz'COUNT函数可以有3中不同⽅式使⽤它。函数可以⽤来返回所有选中⾏的数⽬,⽽不管任何特定列的值。例如:下⾯语句返回GradeType为’HomeWork’的所有⾏的数⽬:1234SELECT

COUNTAS 'Count of Homework Rows'FROMWHERE'HomeWork'这种⽅式,会计数所有⾏的个数,即使其中有*NULL。2.第⼆种⽅式指定具体的列1234SELECT

COUNTAS 'Count of Homework Rows'FROMWHERE'HomeWork'第⼀种⽅式返回3,这⼀种⽅式返回2,为什么因为,这种⽅式要满⾜Grades这⼀列有值,NULL值的⾏不会计数。3.使⽤关键字DISTINCT。123SELECT

COUNTDISTINCTAS 'Number of Fee Types'FROM这条语句计数了FeeType列唯⼀值的个数。10.3 分组数据-GROUP BY123456SELECTAS 'Grade Type'AVGAS 'Average Grade'FROMGROUP BYORDER BY感觉像EXCEL中的分类汇总功能。如果想把Grade为NULL值的当做0,那么可以⽤:123456SELECTAS 'Grade Type'AVGISNULL0AS 'Average Grade'FROMGROUP BYORDER BYGROUP BY⼦句中的列的顺序是没有意义的;ORDER BY⼦句中的列的顺序是有意义的。10.4 基于聚合查询条件-HAVING当针对带GROUP BY的⼀条SELECT语句应⽤任何查询条件时,⼈们必须要问查询条件是应⽤于单独的⾏还是整个组。实际上,WHERE⼦句是单独的执⾏查询条件。SQL提供了⼀个名为HAVING的关键字,它允许对组级别使⽤查询条件。例⼦:查看选修了类型为选修“A”,平均成绩在70分以上的学⽣姓名,平均成绩。12345678SELECT

NameAVGISNULL0AS 'Average Grades'FROMWHERE'A'GROUP BY NameHAVING AVGISNULL070ORDER BY Name修要修类型为A,那么,这是这对⾏的查询,因此这⾥要⽤WHERE。但是,还要筛选平均成绩,那么,这是⼀个平均值,建⽴在聚合函数上的,并不是单独的⾏,这就需要⽤到关键字HAVING。需要先将Student分组,然后把查询结果应⽤到基于全组的⼀个聚合统计上。WHERE只保证我们选择了GradeType是A的⾏,HAVING保证平均成绩⾄少70分以上。注意:如果想要在结果中添加GradeType的值,如果直接在SELECT后边添加这个列,将会出错。这是因为,所有列都必须要么出现在GROUP BY中,要么包含在⼀个聚合函数中。123456789SELECT

NameAVGISNULL0AS 'Average Grades'FROMWHERE'A'GROUP BY NameHAVING AVGISNULL070ORDER BY Name⼗⼀、组合表11.1 内连接来组合表-Inner Join通过书中的描述,我感觉内连接更像是⽤来将主键表、外键表连接起来的⼯具。例如:A表:userid123namemichaelhhhxiangage262520B表:orderid123userid121num265price365如上表格,那么要连接这两个表格,查询订单1的客户姓名,年龄,订单号:⽅式⼀:1234SELECT nameFROMWHEREAND1⽅式⼆,使⽤现在的内连接实现:12345SELECT nameFROMINNER JOINONAND1ON关键字指定两个表如何准确的连接。内连接中表的顺序:FROM ⼦句指定了A表,INNER JOIN ⼦句指定B表,我们调换A,B顺序,所得到的结果相同的!只是显⽰列的顺序可能会不同⽽已。不建议使⽤⽅式⼀的格式。关键字INNER JOIN ON的优点在于显⽰地表⽰了连接的逻辑,那是它们唯⼀的⽤途。WEHERE的含义不够明显。因为它是条件的意思啊,不是连接的!11.2 外连接外连接分为左连接(LEFT OUTER JOIN)、右连接(RIGHT OUTER JOIN)、全连接(FULL OUTER JOIN)。OUTER是可以省略的。左连接(LEFT JOIN)12345SELECT nameFROMLEFT JOINONAND1外连接的强⼤之处在于,主表中的数据必然都会保留,从表中列没有值的情况,⽤NULL补充。LEFT JOIN 左边的表为主表,右边的表为从表。11.3 ⾃连接⾃连接必然⽤到表的别名。1234SELECTnamename asFROMasLEFT JOINasONid11.4 创建视图123CREATE VIEWASWITH CHECK OPTION视图中不能包含ORDER BY⼦句。[WITH CHECK OPTION]表⽰对视图进⾏UPDATE,INSERT,DELETE操作时任然保证了视图定义时的条件表达式。删除视图:1DROP VIEW修改视图:12ALTER VIEWAS视图的优点1. 简化⽤户的操作2. 使⽤户以多⾓度看待同⼀数据3. 对重构数据库提供了⼀定程度的逻辑独⽴性4. 对机密数据提供安全保护⼗⼆、补充12.1 ⼦查询可以⽤3种主要的⽅式来指定⼦查询,总结如下:当⼦查询是tablelist的⼀部分时,它指定了⼀个数据源。当⼦查询是condition的⼀部分时,它成为查询条件的⼀部分。当⼦查询是columnlist的⼀部分时,它创建了⼀个单个的计算的列。12.2 索引索引是⼀种物理结构,可以为数据库表中任意的列添加索引。索引的⽬的是,当SQL语句中包含该列的是偶,可以加速数据的检索。索引的缺点是,在数据库中,索引需要更多的存储硬盘。另⼀个负⾯因素是,索引通常会降低相关的列数据更新速度。这是因为,任何时候插⼊或者修改⼀⾏记录时,索引都必须重新计算该列中的值的正确的排列顺序。可以对任意的列进⾏索引,但是只能指定⼀个列作为主键。指定⼀个列作为主键意味着两件事情:⾸先这个列成为了索引,其次保证这列包含唯⼀的值。12CREATE INDEXON删除⼀个索引:12DROPON参考:

2023年6月21日发(作者:)

sql语句进阶教程(学习sql这⼀篇就够了)最近从图书馆借了本介绍SQL的书,打算复习⼀下基本语法,记录⼀下笔记,整理⼀下思路,以备⽇后复习之⽤。PS:本⽂适⽤SQL Server2008语法。⼀、关系型数据库和SQL实际上准确的讲,SQL是⼀门语⾔,⽽不是⼀个数据库。什么是SQL呢?简⽽⾔之,SQL就是维护和使⽤关系型数据库中的的数据的⼀种标准的计算机语⾔。1.1 SQL语⾔主要有3个主要的组成部分。1. DML(Data Manipulation Language)数据操纵语⾔。这个模块可以让我们检索、修改、增加、删除数据库中的数据。2. DDL(Data Definition Language)数据定义语⾔。是的我们能够创建和修改数据库本⾝。如:DDL提供ALTER语句,他让我们可以修改数据库中表的设计。3. DCL(Data Control Language)数据控制语⾔,⽤于维护数据库的安全。在SQL术语中,记录(record)和字段(field)实际上就称为⾏(row)和列(column)。1.2 主键和外键主键之所以有必要:⾸先使你唯⼀标识表中单独的⼀⾏。主键确保了唯⼀性。可以很容易的将⼀个表和另⼀个表关联。主键⼀般就会⾃动默认创建索引,提⾼了查询速度。外键就是说A表中的某个字段,同时是B中的主键,那么这个字段就是A表中的外键。希望A表中的这个外键的值必须是B中已经存在的值。1.3 数据类型⼀般来讲,有3中重要的数据类型:1. 数字(Numeric)2. 字符(Character)3. 以及⽇期/时间(Date/Time)bit是数字型,它只允许两个值,0和1。类型charncharvarcharnvarchar长度固定长度固定长度可变长度可变长度说明处理unicode数据类型(所有的字符使⽤两个字节表⽰)效率没char⾼ 灵活处理unicode数据类型(所有的字符使⽤两个字节表⽰)1字节=8位bit就是位,也叫⽐特位,是计算机表⽰数据最⼩的单位。byte就是字节,1byte=8bit,1byte就是1B;⼀个字符=2字节;1.3 空值空值不等于空格或空⽩。使⽤NULL表⽰空值。⼆、简单增删改查2.1 查(列名有空格的情况)12SELECTlast nameFROM⽤⽅括号将有空格的列名括起来。PS: MySql中⽤重⾳符`(~)按键。Oracle⽤双引号。查询顺序,SQL执⾏顺序:12345612distinct3 1 2 3 4 62.2 增123456columnlistRowValues1RowValues2repeat2.3 改123UPDATE tableSETrepeat any number ofWHERE2.4 删123DELETEFROM tableWHERE删除前可以验证⼀下:1234SELECT

COUNTFROM tableWHERE如果想要删除所有的⾏,可以:1DELETE FROM table或者1TRUNCATE TABLE tableTRUNCATE TABLE优势在于速度更快,但是不提供记录事务的结果。另外⼀个不同点是,TRUNCATE TABLE重新设置了⽤于⾃增型的列的当前值,DELETE不会。三、别名关键字:AS3.1 计算字段使⽤计算字段可以做如下的事情:选择特定的单词或者数值对单个或者多个列进⾏计算把列和直接量组合在⼀起。3.2 直接量这个直接量和表中的数据没有任何关系,就是为了说明所⽤,下⾯这种类型的表达式就叫做直接量(literal value)。12SELECT '直接量' AS `类型`FROM `customers`如图,结果中直接量就在⼀列中了。3.3 算数运算例⼦1:12SELECT numASFROM例⼦2:12SELECT' 'AS 'fullname'FROM users在MySql中连接要是⽤CONCAT函数:123SELECTCONCAT' 'AS 'fullname'FROM3.4 别名1)列的别名12SELECTASFROM2) 表的别名12SELECTFROMAS说明:1. 列的别名是为了显⽰⽤的,别名会作为查询结果的表头,不能在WHERE中使⽤列的别名,会出错2. 表的别名确实是为了⽅便操作⽤的,可以在WHERE中使⽤列的别名进⾏!四、使⽤函数函数要有⼀组圆括号跟在关键字后边,圆括号告诉我们,这是⼀个函数!4.1 字符函数LEFT&RIGHTLEFT(CharacterValue,NumberOfCharacters)含义:选择CharacterValue字段的左边NumberOfCharacters⼏个字符。ps:RIGHT是右边⼏个字符。LTRIM&RTRIMLTRIM(CharacterValue)可以删除左边开始的空格。RTRIM作⽤类似。SUBSTRINGSUBSTRING(CharacterValue,StartPositon,NumberOfCharacters)含义:选择从开始位置(包括),N个长度的字符。12SELECT

SUBSTRING'thewhitegoat'45AS 'The Answer'返回:white4.2 ⽇期/时间函数GETDATE1GETDATE()返回当前⽇期和时间。PS:在MySql中,等价函数是NOW,在Oracle中是CURRENT_DATE。DATEPART能够分析具体的⽇期,并且返回诸如该⽇期是该⽉中的第⼏天,或者该年份中的第⼏周等信息。1DATEPART(datepart,DateValue)datepart可以是许多不同的值,如下都是有效值:yearquartermonthdayofyeardayweekweekdayhourminutesecondDATEDIFF可以让我们得到任意两个⽇期之间相差的天数(或周数、⽉数等)。1DATEDIFF(datepart1,startdate1,startdate2)DATEDIFF Function ExpressionDATEDIFF(day,’7/8/2009’,’8/14/2009’)DATEDIFF(week,’7/8/2009’,’8/14/2009’)DATEDIFF(month,’7/8/2009’,’8/14/2009’)DATEDIFF(year,’7/8/2009’,’8/14/2009’)Resulting Value37510PS:MySql中,DATEDIFF函数只允许我们计算两个⽇期之间的天数,如果想要得到⼀个正数,结束的⽇期通常要作为第⼀个参数:1DATEDIFF(enddate,startdate)Oracle中没有等价函数4.3 数值函数ROUND允许我们四舍五⼊。1ROUND(numericvalue,decimalpalaces)RAND⽤来产⽣随机数1RAND([seed])没有参数时,它会返回0-1之间的⼀个随机数。1SELECT RANDAS 'Random Value'可选参数seed有的情况下,每次将返回相同的值。这让我想起了Python中的Random包。看来很多时候,⼀些东西是共通的啊。PIPI()函数如果想要对它保留两位⼩数,可以通过复合函数进⾏:1PI2将会返回:3.144.4 转换函数CAST函数允许我们把数据从⼀种类型转换成另⼀种类型。1CAST(expression AS DateType)例⼦:123SELECT

'2009-04-11' AS 'Original Date'CAST'2009--04-11' ASAS 'Converted Date'ISNULL函数,很有⽤可以把NULL值转换成⼀个有意义的值。123SELECTISNULL'Unknown'AS 'Color'FROM五、排序函数5.1 添加排序123SELECTFROMORDER BY默认是升序,ASC,因此,上⾯等价于:123SELECTFROMORDER BYASC5.2 降序使⽤DESC关键字:123SELECTFROMORDER BYDESC5.3 根据多列12345SELECT

FROMORDER BY注意:列的顺序很重要,⾸先按照LastName排序,然后按照FirstName排序。5.4 根据计算字段123SELECT','AS 'Name'FROMORDER BY Name因此,从这⼉可以知道,列别名不可以⽤在WHERE中,但可以⽤在ORDER BY中。例⼦123SELECTFROMORDER BYAS 'Name'5.5 排序补充内容当数据升序时,出现顺序是如下:NULL->数字->字符注意:此时,该列中的数字其实是按照字符来算的,因此,升序时,23也是排在5之前的。六、基于列的逻辑-CASE6.1 IF-THEN-ELSE逻辑包含列和CASE表达式的SELECT语句,⼤概如下:12345SELECT

FROM table6.2 CASE-简单格式1234567SELECT

CASEWHENTHENWHENTHENrepeat WHENTHEN any number ofELSEENDCASE表达式对于把不好理解的值转换成有意义的描述是很有⽤的。12345678SELECT

CASEWHEN 'F' THEN 'Fruit'WHEN 'V' THEN 'Vegetable'ELSE 'other'END AS 'Category'As 'Description'FROM6.3 CASE-查询格式1234567SELECT

CASE

WHENTHENWHENTHENrepeat WHENTHEN any number ofELSEEND这种格式允许在关键字WHEN后边放置较为复杂的条件表达式。相关问题:七、基于⾏的逻辑7.1 应⽤查询条件终于派到WHERE出场了,注意写法顺序,再写⼀遍:12345612distinct3 1 2 3 4 67.2 限制⾏-TOP1234SELECT

Number

FROM table7.3 TOP和ORDER BY结合关键字TOP的另⼀个⽤途是,把它和ORDER BY⼦句结合起来,基于特定分类,得到带有最⼤值的⼀定数量的⾏。假设你想看到Shakespeare所著的销量最多的书。1234567SELECT

AS 'Book Title'AS 'Quantuty Sold'FROMWHERE'Shakespeare'ORDER BYDESCps: 学会利⽤google搜索,例如,我想要知道oracle中类似top作⽤的关键字是什么,可以:⼋、布尔逻辑关键字:AND/OR/NOT/BETWEEN/IN/IS/NULL8.1 OROR⼦句意味着,如果确定任意条件为真,那么就该选中该⾏。1234SELECTnameFROM usersWHERE18OR608.2 使⽤圆括号1234567SELECTFROMWHERE'IL'OR'CA'AND8本来想要的结果是对来⾃IL或者CA的客户,同时,只看数量⼤于8的订单。但是上⾯执⾏的结果不是这样的,因为,SQL总是会先处理AND操作符然后才会处理OR操作符。所以,上述语句中,先看到AND并执⾏如下的条件12'CA'AND8因此,要⽤括号来规定顺序:1234567SELECTFROMWHERE'IL'OR'CA'AND88.3 NOT操作符NOT操作符表⽰对后边的内容否定或者取反。123SELECTFROMWHERE NOT'IL' OR'NY'这个其实可以⽤AND改写的NOT操作符在逻辑上不是必须的。8.4 BETWEEN操作符12345SELECTFROMWHEREBETWEEN 8 AND 108.5 IN操作符假设你想看到IL或者NY的⾏:1234SELECTFROMWHERE'IL'OR'CA'可以改写成:123SELECTFROMWHEREIN'IL''CA'8.9 布尔逻辑-IS NULL为了将某字段NULL值的⾏或0的⾏包括进来:1234SELECTFROMWHERE0ORIS NULL或者123SELECTFROMWHERE ISNULL00九、模糊匹配9.1 LIKE和%搭配%通配符可以表⽰任意的字符,它可以表⽰0个,1个,任意多个字符。9.2 通配符除了%以外,还有下划线(_)、⽅括号起来的characterlist,以及⽤⽅括号括起来的脱字符号(^)加上characterlist。下划线表⽰⼀个字符[characterlist]表⽰括号中字符的任意⼀个[^characterlist]表⽰不能是括号中字符的任意⼀个例⼦:12345SELECT

FROMWHERELIKE '[CM]ARY'检索以C或者M开头并以ARY结尾的所有⾏。9.3 按照读⾳匹配SOUNDEX和DIFFERENCE⼗、汇总数据10.1消除重复使⽤DISTINCT12SELECTnameFROM users如果age不同,即使name相同,那么这⼀⾏就不会被删除重复。10.2 聚合函数COUNTSUMAVGMINMAX,他们提供了对分组数据进⾏计数、求和、取平均值、取最⼩值和最⼤值等⽅法。12345SELECT

AVGAS 'Average Quiz Score'MINAS 'Minimum Quiz Score'FROMWHERE'Quiz'COUNT函数可以有3中不同⽅式使⽤它。函数可以⽤来返回所有选中⾏的数⽬,⽽不管任何特定列的值。例如:下⾯语句返回GradeType为’HomeWork’的所有⾏的数⽬:1234SELECT

COUNTAS 'Count of Homework Rows'FROMWHERE'HomeWork'这种⽅式,会计数所有⾏的个数,即使其中有*NULL。2.第⼆种⽅式指定具体的列1234SELECT

COUNTAS 'Count of Homework Rows'FROMWHERE'HomeWork'第⼀种⽅式返回3,这⼀种⽅式返回2,为什么因为,这种⽅式要满⾜Grades这⼀列有值,NULL值的⾏不会计数。3.使⽤关键字DISTINCT。123SELECT

COUNTDISTINCTAS 'Number of Fee Types'FROM这条语句计数了FeeType列唯⼀值的个数。10.3 分组数据-GROUP BY123456SELECTAS 'Grade Type'AVGAS 'Average Grade'FROMGROUP BYORDER BY感觉像EXCEL中的分类汇总功能。如果想把Grade为NULL值的当做0,那么可以⽤:123456SELECTAS 'Grade Type'AVGISNULL0AS 'Average Grade'FROMGROUP BYORDER BYGROUP BY⼦句中的列的顺序是没有意义的;ORDER BY⼦句中的列的顺序是有意义的。10.4 基于聚合查询条件-HAVING当针对带GROUP BY的⼀条SELECT语句应⽤任何查询条件时,⼈们必须要问查询条件是应⽤于单独的⾏还是整个组。实际上,WHERE⼦句是单独的执⾏查询条件。SQL提供了⼀个名为HAVING的关键字,它允许对组级别使⽤查询条件。例⼦:查看选修了类型为选修“A”,平均成绩在70分以上的学⽣姓名,平均成绩。12345678SELECT

NameAVGISNULL0AS 'Average Grades'FROMWHERE'A'GROUP BY NameHAVING AVGISNULL070ORDER BY Name修要修类型为A,那么,这是这对⾏的查询,因此这⾥要⽤WHERE。但是,还要筛选平均成绩,那么,这是⼀个平均值,建⽴在聚合函数上的,并不是单独的⾏,这就需要⽤到关键字HAVING。需要先将Student分组,然后把查询结果应⽤到基于全组的⼀个聚合统计上。WHERE只保证我们选择了GradeType是A的⾏,HAVING保证平均成绩⾄少70分以上。注意:如果想要在结果中添加GradeType的值,如果直接在SELECT后边添加这个列,将会出错。这是因为,所有列都必须要么出现在GROUP BY中,要么包含在⼀个聚合函数中。123456789SELECT

NameAVGISNULL0AS 'Average Grades'FROMWHERE'A'GROUP BY NameHAVING AVGISNULL070ORDER BY Name⼗⼀、组合表11.1 内连接来组合表-Inner Join通过书中的描述,我感觉内连接更像是⽤来将主键表、外键表连接起来的⼯具。例如:A表:userid123namemichaelhhhxiangage262520B表:orderid123userid121num265price365如上表格,那么要连接这两个表格,查询订单1的客户姓名,年龄,订单号:⽅式⼀:1234SELECT nameFROMWHEREAND1⽅式⼆,使⽤现在的内连接实现:12345SELECT nameFROMINNER JOINONAND1ON关键字指定两个表如何准确的连接。内连接中表的顺序:FROM ⼦句指定了A表,INNER JOIN ⼦句指定B表,我们调换A,B顺序,所得到的结果相同的!只是显⽰列的顺序可能会不同⽽已。不建议使⽤⽅式⼀的格式。关键字INNER JOIN ON的优点在于显⽰地表⽰了连接的逻辑,那是它们唯⼀的⽤途。WEHERE的含义不够明显。因为它是条件的意思啊,不是连接的!11.2 外连接外连接分为左连接(LEFT OUTER JOIN)、右连接(RIGHT OUTER JOIN)、全连接(FULL OUTER JOIN)。OUTER是可以省略的。左连接(LEFT JOIN)12345SELECT nameFROMLEFT JOINONAND1外连接的强⼤之处在于,主表中的数据必然都会保留,从表中列没有值的情况,⽤NULL补充。LEFT JOIN 左边的表为主表,右边的表为从表。11.3 ⾃连接⾃连接必然⽤到表的别名。1234SELECTnamename asFROMasLEFT JOINasONid11.4 创建视图123CREATE VIEWASWITH CHECK OPTION视图中不能包含ORDER BY⼦句。[WITH CHECK OPTION]表⽰对视图进⾏UPDATE,INSERT,DELETE操作时任然保证了视图定义时的条件表达式。删除视图:1DROP VIEW修改视图:12ALTER VIEWAS视图的优点1. 简化⽤户的操作2. 使⽤户以多⾓度看待同⼀数据3. 对重构数据库提供了⼀定程度的逻辑独⽴性4. 对机密数据提供安全保护⼗⼆、补充12.1 ⼦查询可以⽤3种主要的⽅式来指定⼦查询,总结如下:当⼦查询是tablelist的⼀部分时,它指定了⼀个数据源。当⼦查询是condition的⼀部分时,它成为查询条件的⼀部分。当⼦查询是columnlist的⼀部分时,它创建了⼀个单个的计算的列。12.2 索引索引是⼀种物理结构,可以为数据库表中任意的列添加索引。索引的⽬的是,当SQL语句中包含该列的是偶,可以加速数据的检索。索引的缺点是,在数据库中,索引需要更多的存储硬盘。另⼀个负⾯因素是,索引通常会降低相关的列数据更新速度。这是因为,任何时候插⼊或者修改⼀⾏记录时,索引都必须重新计算该列中的值的正确的排列顺序。可以对任意的列进⾏索引,但是只能指定⼀个列作为主键。指定⼀个列作为主键意味着两件事情:⾸先这个列成为了索引,其次保证这列包含唯⼀的值。12CREATE INDEXON删除⼀个索引:12DROPON参考: