版权声明:本文为博主原创文章,未经博主允许不得转载。
与DDL操作数据库对象不同,DML主要操作数据表里的数据,使用DML可以完成如下三个任务
--->插入新数据
--->修改已有数据
--->删除不需要的数据
DML语句由insert into /update 和deletefrom三个命令组成
insert into用于向指定数据表中插入记录。对于标准SQL语句而言,每次只能插入一条记录。
delete from 语句用于删除指定数据表的数据,使用delete from 删除时不需要指定列名,因为删除总是正行的删除。
delete from 删除可以一次删除多行,删除那些行采用where字句限定,只删除满足where条件的记录。没有where字句将会把表里的记录全部删除
删除全部
使用where条件来限定之删除指定的数据
in关键字 ,使用in比较符时,必须在in后的括号里列出一个或多个值,它要求指定列必须与in括号里任意一个值相等
eg:查询所有老师名字中以“孙”开头的
eg:查处所以名字以下划线开头的老师
is null关键字,用以判断某些值是否为空,判断是否为空不要用=null来判断,因为SQL中null=null返回null。
eg:查询出teacher_name为空的记录
eg:查询出老师名字为两个字符并且teacher_id大于3的所以记录
eg:查询出所有老师名字不以下划线开头的记录
order by 子句
执行查询后的结果,默认按照插入的顺序排序。如果需要查询结果按照某列值的大小进行排序,则可以使用order by字句
降序排列 desc 生序排列 asc(默认排列方式)
eg:按照teacher_id 列的升序排列
如果需要按多列排序,每列的asc,desc必须单独设定。如果指定了多个排序列,则第一个排序列是首要排序列,只有当第一个排序列存在多个相同的值时,第二个排序列才会起作用。
eg:先按teacher_name的降序排列,当teacher_name相同时按student_name升序排列
如果需要对分组进行过滤,则应该时having子句,having子u句后面也是一个条件表达式,只有满足该条件表达式的分组才会被选出。having子句和where子句非常容易混淆,他们都有过滤功能,但它们有如下区别
--->不能在where字句中过滤组,where子句仅用于过滤行。过滤组必须使用having子句
--->不能在where子句中使用组函数,having子句才可使用组函数
多表连接查询和子查询
using 子句的连接
using子句可以指定一列或多列,用于显示指定两个表中同名列作为连接条件。假设两个表中有超过一列的同名列,如果使用natural join则会把所有同名列当成连接条件,使用using子句就可以显示的指定使用那些同名列作为连接条件。
on子句连接
这是最常用的连接方式,SQL99语法的连接条件房子on子句中指定,而且每个on子句之指定一个连接条件。这意味着如果需要进行N表的连接,则需要有N-1个join...on对。
左/右/外连接,3种连接分别使用left[outer] join /right[outer] join 和full[outer] join,这三种外连接的连接条件一样通过on子句来指定。
eg:全外连接
右外连接,连接条件时非等值连接
左外连接,
子查询
子查询就是指在查询语句中嵌套另一个查询,子查询支持多层查询。对于一个普通的子查询而言,子查询可以出现在两个位置
-->出现在from语句后当成数据表,这种用法也被称为行内视图,因为该子查询的实质就是一个临时视图
-->出现在where条件后作为过滤条件的值
使用子查询有如下几个注意点
-->子查询要用括号括起来
-->子查询当成数据表时(出现在from之后,)可以为该子查询起别名,尤其是要作为前缀来限定查询列时,必须给与子查询起别名
-->子查询当过滤条件时,将子查询放在比较运算符的右边,这样可以增强查询的可读性
-->子查询当过滤条件时,单行子查询使用单行运算符,多行子查询使用多行运算符
eg:
eg:
如果子查询返回多个值,则需要使用in/any和all等关键字,in可以单独使用,与前面介绍比较运算符时所介绍的in完全一样,此时可以把子查询返回的多个值当成一个值列表
--->插入新数据
--->修改已有数据
--->删除不需要的数据
DML语句由insert into /update 和deletefrom三个命令组成
insert into用于向指定数据表中插入记录。对于标准SQL语句而言,每次只能插入一条记录。
insert into命令的语法格式如下:
同时插入多个值
update语句用于修改数据,可以一次修改多条。通过使用Where限定修改那些数据
通过Where条件修改
delete from 语句
delete from 语句用于删除指定数据表的数据,使用delete from 删除时不需要指定列名,因为删除总是正行的删除。
delete from 删除可以一次删除多行,删除那些行采用where字句限定,只删除满足where条件的记录。没有where字句将会把表里的记录全部删除
删除全部
使用where条件来限定之删除指定的数据
distinct 关键字除去重复行
between关键字 between val1 and val2 (大于等于val1,且小于等于val2)
in关键字 ,使用in比较符时,必须在in后的括号里列出一个或多个值,它要求指定列必须与in括号里任意一个值相等
like关键字,主要用于模糊查询,例如我们需要查询名字以“孙”开头的所有记录,这就需要用到模糊查询。SQL语句中可以使用两个通配符:下划线(_)和百分号(%),其中下划线可以代表一个任意的字符,百分号可以代表任意多个字符。
eg:查询所有老师名字中以“孙”开头的
eg:查询出名字为两个字符的所有老师
在某些特殊的情况下,我们需要查询的条件里需要使用下划线或百分号,不希望SQL把下划线和百分号当成同配符使用,这需要使用转义字符,MySQL使用反斜线(\)作为转义字符,
eg:查处所以名字以下划线开头的老师
备注:在标准的SQL语句中并没有提供反斜线(\)的转义字符,而是使用escape关键字显示进行转义‘
is null关键字,用以判断某些值是否为空,判断是否为空不要用=null来判断,因为SQL中null=null返回null。
eg:查询出teacher_name为空的记录
如果where字句后有多个条件需要组合,SQL提供了and和or逻辑运算符来组合2个条件,并提供了not来对逻辑表达时求否。
eg:查询出老师名字为两个字符并且teacher_id大于3的所以记录
eg:查询出所有老师名字不以下划线开头的记录
order by 子句
执行查询后的结果,默认按照插入的顺序排序。如果需要查询结果按照某列值的大小进行排序,则可以使用order by字句
降序排列 desc 生序排列 asc(默认排列方式)
eg:按照teacher_id 列的升序排列
如果需要按多列排序,每列的asc,desc必须单独设定。如果指定了多个排序列,则第一个排序列是首要排序列,只有当第一个排序列存在多个相同的值时,第二个排序列才会起作用。
eg:先按teacher_name的降序排列,当teacher_name相同时按student_name升序排列
group by 字句
如果需要对分组进行过滤,则应该时having子句,having子u句后面也是一个条件表达式,只有满足该条件表达式的分组才会被选出。having子句和where子句非常容易混淆,他们都有过滤功能,但它们有如下区别
--->不能在where字句中过滤组,where子句仅用于过滤行。过滤组必须使用having子句
--->不能在where子句中使用组函数,having子句才可使用组函数
多表连接查询和子查询
using 子句的连接
using子句可以指定一列或多列,用于显示指定两个表中同名列作为连接条件。假设两个表中有超过一列的同名列,如果使用natural join则会把所有同名列当成连接条件,使用using子句就可以显示的指定使用那些同名列作为连接条件。
on子句连接
这是最常用的连接方式,SQL99语法的连接条件房子on子句中指定,而且每个on子句之指定一个连接条件。这意味着如果需要进行N表的连接,则需要有N-1个join...on对。
左/右/外连接,3种连接分别使用left[outer] join /right[outer] join 和full[outer] join,这三种外连接的连接条件一样通过on子句来指定。
eg:全外连接
右外连接,连接条件时非等值连接
左外连接,
子查询
子查询就是指在查询语句中嵌套另一个查询,子查询支持多层查询。对于一个普通的子查询而言,子查询可以出现在两个位置
-->出现在from语句后当成数据表,这种用法也被称为行内视图,因为该子查询的实质就是一个临时视图
-->出现在where条件后作为过滤条件的值
使用子查询有如下几个注意点
-->子查询要用括号括起来
-->子查询当成数据表时(出现在from之后,)可以为该子查询起别名,尤其是要作为前缀来限定查询列时,必须给与子查询起别名
-->子查询当过滤条件时,将子查询放在比较运算符的右边,这样可以增强查询的可读性
-->子查询当过滤条件时,单行子查询使用单行运算符,多行子查询使用多行运算符
eg:
把子查询当成where条件中的值,如果子查询返回单行/单列值。则被当成一个标量使用
eg:
如果子查询返回多个值,则需要使用in/any和all等关键字,in可以单独使用,与前面介绍比较运算符时所介绍的in完全一样,此时可以把子查询返回的多个值当成一个值列表
eg:< any只要小于值列表中的最大值即可,> any只要大于值列表中的最小值即可
eg:< all要求小于值列表中的最小值,>all要求大于值列表中的最大值
还有一种子查询可以返回多行多列,此时where子句中应该有对应的数据列,并使用圆括号将多个数据列组合起来