DML数据操纵语句,用于添加、删除、更新和查询数据库记录并检查数据完整性
插入记录
如果不在表名后面加括号写字段名后面的values就会按顺序依次赋值
单条插入
insert into 表名(字段1,字段2,字段3,...,字段n) values(值1,值2,值3,...,值n);
也可以不用指定字段名,但是values后面的顺序应该和字段的排序一致
多条插入
insert into 表名(字段1,字段2,字段3,...,字段n)
values
(值1,值2,值3,...,值n),
(值1,值2,值3,...,值n),
(值1,值2,值3,...,值n)
;
更新记录
更新一个表
update 表名 set 字段1=值1,字段2=值2,...字段n=值n [where 条件];
更新多个表中的数据
update 表1,表2,...表n set 表1.字段1=表达式1,表n.字段n=表达式n [where 条件];
注:多表更新更多的用在根据一个表的字段来动态的更新另外一个表的字段
例子:update t1,t2 set ti.age=2000,t2.age=3000 where t1.id=1 and t2.id=1; 更新T1,T2集ti.age=2000,t2.age=3000,其中t1.id=1,t2.id=1;
删除记录
删除单表中的数据
delete from 表名 [where 条件];
删除多个表中的数据
delete 表1,表2,...表n from 表1,表2,...表n [where 条件];
不管是单表还是多表,不加where条件将会把表中的所有记录删除,所以操作时一定要小心。
查询记录
SELECT 字段1,字段2...或者* FROM 表名 WHERE 条件;
查询不重复的记录
SELECT distinct field1,field2 FROM 表名;
只要field1,field2任何一个字段有不同就会被选择!一般使用distinct,只筛选一个字段!
条件查询
这个where
条件意思是:查找满足后面这个条件的记录
注:条件字段比较符号:
=,<,>,>=,<=,!=等比较运算符
多个条件之间可以使用or and等
排序和限制
SELECT * FROM 表名 WHERE 条件 ORDER BY 字段1 [DESC|ASC],字段2 [DESC|ASC],...字段n [DESC|ASC];
如果排序字段的值一样,则值相同的字段按照第二个排序字段进行排序,依次类推
。如果只有一个排序字段,则这些字段相同的记录都将无序排列!
默认是asc由低到高
DESC表示:由高到低
例如:select * from t1 order by age desc;
ASC表示:由低到高
例如:select * from t1 order by age asc;
对于排序后的数据如果只希望显示一部分,则可以使用 LIMIT 数字1,数字2
来限制
数字1表示从哪个开始(从零开始计数的),数字2表示取出多少个
例如:select * from t1 order by age limit 1,3;
聚合
很多情况下,用户都需要进行一些汇总操作,这是就需要使用到SQL聚合操作
SELECT [field1,field2,...fieldn] fun_name FROM 表名 [WHERE 条件] [GROUP BY field1,field2,...fieldn [WITH ROLLUP]] [HAVING 条件];
fun_name
:聚合操作,聚合函数常用:
-
sum()
:求和:select sum(字段名) from 表名;
-
count(*)
:记录总数:select count(*|字段名) from 表名;
一般就直接写*
-
min() max()
:最值:select max(字段名) from 表名;
select min(字段名) from 表名;
例如:
GROUP BY
关键字表示要进行分类聚合(上面的这些函数)的字段、比如按部门分类统计员工数量,部门就应该写在GROUP BY后面。
先建立一张这样的表:
根据group by 后面的组来分类求和,比如下面的就是把相同的department分到同一组求和
WITH ROLLUP
是可选语法,表明是否对分类聚合后的结果进行再汇总,就是把分了类的再全部求个和
HAVING
关键字表示对分类后的结果
再进行条件的过滤
!
注意:having和where的区别在于,having是对聚合后的结果进行条件过滤
,而where是在聚合前就对记录进行过滤,应该尽可能的对记录进行先过滤!
①直接统计:
格式:select count([列名|*]) from 表名;
举例:select count(*) from a1;//统计表a1中的所有记录
②按某字段进行数据统计:
格式:select field1,count([列名|*]) from 表名 group by field1;
举例:select name,count(*) from a1 group by name;
对表a1中的记录按name字段的值进行分组,并且对每个分组进行数量统计
③按某字段进行数据统计,并且统计总数:
格式:select field1,count([列名|*]) from 表名 group by field1 with rollup;
举例:select name,count(*) from a1 group by name with rollup;
④对统计后的数据进行再筛选
格式:select field1,count([列名|*]) from 表名 group by field1 having count([列名|*])>数值;
举例:select name,count(*) from a1 group by name having count(*)>4;
⑤统计总和和最高最低以及总记录数:
格式:select sum(field1),max(field1),min(field1),count([列名|*]) from 表名;
举例:select sum(id),max(id),min(id),count(*) from a1;
表连接
需求:显示多个表中的字段的时候即可使用表连接
连接分类:
- 内连接:选取两张表中相互匹配的记录
- 外连接:不仅仅选取两张相互匹配的记录,并且会选出其他不匹配的记录
举例: - 内连接
举例:
先建立两张这样的表
命名为employee
命名为employee_record:
进行如下操作:
eid和id和并成了employee的id,表里既有employee的name字段又有employee_record的record字段,连接成了一个表
select 表.字段,... from 表1,表2 where 需要满足的条件(比如:表1.想关联的字段1=dept.想关联的字段2);
- 外连接
左连接
概念:包含左边表中的所有记录(包括右表中没有和它匹配的记录),就以left join为轴,区分左表和右表
例子:
select ename,deptname from emp left join dept on emp.deptno=dept.deptno;
右连接
概念:包含右边表中的所有记录(包括左表中没有和它匹配的记录)
与左连接同理
子查询
需求:一个查询需要另外一个查询的结果参与的时候用于子查询的关键字:
in、not in
语法:select * from 表1 where 某个字段 in(子查询语句);
例子:
建立这两个表:
- 若查询结果唯一可以使用
“=”
代替“in”
select * from 表1 where 某个字段=(子查询语句);
exists、not exits等
语法:select语句1 from exists (select语句2)
判断语句2有没有查询出语句,查出返回TRUE,如果查询出来的结果是NULL也会返回TRUE
记录联合
我们常常会碰到需要将两个表或者多个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示这是就需要用到记录联合多个select 语句用:UNION或者UNION ALL隔开即可实现
语法:select xxx from 表1 union select xxx from 表2;
联合的条件:两个表的字段数(列的数量)应该相等
例子:还是先用上面创建的两个表
UNION和UNION ALL的区别:
前者会将多个查询结果合并后并且进行去除重复后
返回;
后者则直接合并并不去除重复;