SQL语法下
DML语句
DDL主要操作数据库对象,DML主要操作数据库的数据,他可以插入新数据;修改已有数据;删除不需要的数据。
DML语句由insert into、update 和delete from三个命令组成。
insert into语句用于向指定数据表中插入记录,每次只能插入一条记录。
语法:
insert into table_name [ (column [,column…]) ]
values (value [,value…]) ;
外键约束保证被参照的记录必须存在,但并不保证必须有被参照记录,即外键列可以为null。如果想保证每条从表记录必须存在对应的主表记录,则应使用非空、外键两个约束。
带子查询的插入语句甚至不要求查询数据的源表和插入数据的目的表是同一个表,它只要求选择出来的数据列和插入目的表的数据列个数相等、数据类型匹配即可。
MySQL甚至提供了一种扩 展的语法,通过这种扩展的语法也可以一次插入多 条记录。MySQL允许在values后使用多个括号包含多条记录,表示多条记录的多个括号之间以英文逗号(,)隔开。
update语句用于修改数据表的记录
语法:
update table_name
set column1= value1 [,column2 =value2]…
[WHERE condition] ;
(WHERE条件用于特定条件限制)
delete from语句用于删除指定数据表记录
语法:
delete from table_name
[WHERE condition] ;
单表查询
单表查询的select语句的语法格式如下:
select column1, column2…
from数据源
[where condition]
select语句还有算术表达式(+、-、* 、/)
规则:
1.对数值型数据列、变量、常量可以使用算术运算符(+、-、*、/)创建表达式;
2.对日期型数据列、变量、常量可以使用部分算术运算符(+、-)创建表达式,两个日期之间可以进行减法运算,日期和数值之间可以进行加、减运算;
3.运算符不仅可以在列和常量、变量之间进行运算,也可以在两列之间进行运算。
MySQL中没有提供字符串连接运算符,即无法使用加号(+)将字符串常量、字符串变量或字符串列连接起来。MySQL使用concat函数来进行字符串连接运算。
对于MySQL而言,如果在算术表达式中使用null,将会导致整个算术表达式的返回值为null;如果在字符串连接运算中出现null,将会导致连接后的结果也是null。
MySQL允许select后面没有from子句,也可以写select from dual(dual无实意,但是这样更加标准,他们常用于常量的select)
like运算符主要用于进行模糊查询模糊查询中需要使用like关键字。SQL语句中可以使用两个通配符:下画线(_)和百分号(%),其中下画线可以代表一个任意的字符,百分号可以代表任意多个字符。
也可以用括号来改变默认优先级。
数据库函数
根据函数对多行数据的处理方式,函数被分为单行函数和多行函数(多行函数也称为聚集函数、分组函数),单行函数对每行输入值单独计算,每行得到一个计算结果返回给用户;多行函数对多行输入值整体计算,最后只会得到一个结果。
MySQL中单行函数的特点:
1.单行函数的参数可以是变量、常量或数据列。单行函数可以接收多个参数,但只返回一个值。
2.单行函数会对每行单独起作用,每行(可能包含多个参数)返回一个结果。
3.使用单行函数可以改变参数的数据类型。单行函数支持嵌套使用,即内层函数的返回值是外层函数的参数。
其他函数又分为:位函数、流程控制函数、加密解密函数、信息函数。
单行函数的用法例子:
分组和组函数(多行函数)
常用的5个组函数:
1.avg(istintll]lxpr):计算多行expr的平均值,其中,expr 可以是变量、常量或数据列,但其数据类型必须是数值型。还可以在变量、列前使用distinct 或all关键字,如果使用distinct,则表明不计算重复值; all 用和不用的效果完全一样,表明需要计算重复值。
2.count({ [distinctal]expr}):计算多行expr的总条数,其中,expr 可以是变量、常量或数据列,其数据类型可以是任意类型;用星号() 表示统计该表内的记录行数; distinct 表示不计算重复值。
3.max(expr):计算多行expr的最大值,其中expr可以是变量、常量或数据列,其数据类型可以是任意类型。
4.min(expr):计算多行expr的最小值,其中expr可以是变量、常量或数据列,其数据类型可以是任意类型。
5.sum([distinctlall]expr):计算多行expr的总和,其中,expr 可以是变量、常量或数据列,但其数据类型必须是数值型; distinct 表示不计算重复值。
distinct和*不同时使用
在很多数据库中(MySQL除外,如果某个数据列既没有出现在group by之后,也没有使用组函数包起来,则MySQL会输出该列的第一条记录的值)如果查询列表中使用了组函数,或者select语句中使用了group by分组子句,则要求出现在select列表中的字段,要么使用组函数包起来,要么必须出现在group by子句中。
having子句和where子句的区别:
1.不能在where子句中过滤组,where 子句仅用于过滤行。过滤组必须使用having 子句。
2.不能在where子句中使用组函数,having子句才可使用组函数。
多表连接查询
SQL92支持:等值连接、非等值连接、外连接、广义笛卡儿积。
SQL99支持:交叉连接、自然连接、使用using子句的连接、使用on子句的连接、全外连接或者左、右外连接。
SQL92语法:
外连接就是在外连接符所在的表中增加一个“万能行”,这行记录的所有数据都是null,而且该行可以与另一个表中所有不满足条件的记录进行匹配,通过这种方式就可以把另一个表中的所有记录选出来,不管这些记录是否满足连接条件。
SQL99:查询用的多个数据表显式使用xxx join连接,而不是直接依次排列在from之后,from后只需要放一个数据表;连接条件不再放在where之后,而是提供了专门的连接条件子句。
1.交叉连接( cross join):交叉连接效果就是SQL 92中的广义笛卡儿积,所以交叉连接无须任何连接条件
2.自然连接(naturaljoin):自然连接表面上看起来也无须指定连接条件,但自然连接是有连接条件的,自然连接会以两个表中的同名列作为连接条件;如果两个表中没有同名列,则自然连接与交叉连接效果完全一样一因为没有连接条件
3.using子句连接: using 子句可以指定一列或多列, 用于显式指定两个表中的同名列作为连接条件。假设两个表中有超过一-列的同名列, 如果使用natural join,则会把所有的同名列当成连接条件;使用using子句,就可显式指定使用哪些同名列作为连接条件(两个表中必须有同名列)
4.on子句连接:这是最常用的连接方式,SQL 99语法的连接条件放在on子句中指定,而且每个on子句只指定-一个连接条件。这意味着:如果需要进行N表连接,则需要有N-1个join…on对(相当于SQL92中的等值连接、非等值连接)
5.左、右、全外连接:这三种外连接分别使用left [outer] join、right [outer] join和full [outer] join, 这三种外连接的连接条件一样通过on子句来指定,既可以是等值连接条件,也可以是非等值连接条件
子查询
子查询就是指在查询语句中嵌套另一个查询,子查询可以支持多层嵌套。对于一个普通的查询语句而言,子查询可以出现在两个位置:
1.出现在from语句后当成数据表,这种用法也被称为行内视图,因为该子查询的实质就是一个临时视图。
2.出现在where条件后作为过滤条件的值。
使用子查询时要注意如下几点:
1.子查询要用括号括起来。
2.把子查询当成数据表时(出现在from之后),可以为该子查询起别名,尤其是作为前缀来限定数据列时,必须给子查询起别名。
3.把子查询当成过滤条件时,将子查询放在比较运算符的右边,这样可以增强查询的可读性。
4.把子查询当成过滤条件时,单行子查询使用单行运算符,多行子查询使用多行运算符。
如果子查询返回多个值,则需要使用in、any 和all等关键字,in 可以单独使用,与前面介绍比较运算符时所讲的in完全一样, 此时可以把子查询返回的多个值当成一个值列表
any和all可以与>、>=、<、<=、>、=等运算符结合使用,=any的作用与in的作用相同
集合运算
为了对两个结果集进行集合运算,这两个结果集必须满足如下条件:
1.两个结果集所包含的数据列的数量必须相等。
2.两个结果集所包含的数据列的数据类型也必须一一对应。
union运算:select 语句 union select语句
minus运算:select 语句 minus select语句(MySQL不支持,只能通过子查询实现)
intersect运算:select 语句 intersect select语句(MySQL不支持,只能通过多表连接查询实现)