MySQL数据库中的表记录操作(DML)

Data Manipulation Languaege 指对数据库中表记录的操作,主要包括表记录的插入(insert)、更新(update)、删除(delete)和查询(select),是开发人员日常使用最频繁的操作

1、插入记录

INSERT INTO tablename (field1,field2,……fieldn) VALUES(value1,value2,……valuesn)

insert into emp (ename,hiredate,salary,deptno) values('jk001','2018-01-01','2000',1);

insert into emp values('jk001','2018-01-01','2000',1);

# 以下批量操作,节省很多的网络开销,大大提高插入效率
insert into emp values('jk001','2018-01-01','2000',1),('lisa','2018-01-01','2000',2),('dony','2018-01-01','2000',2);

1、在插入数值(整型、浮点)时候 空字符或null 会转换成0 2、使用默认值 填充数据 使用 default

2、更新记录

UPDATE tablename SET field1=value1,field2.=value2,……fieldn=valuen [WHERE CONDITION]

在 MySQL 中,update 命令可以同时更新多个表中数据 UPDATE t1,t2…tn set t1.field1=expr1,tn.fieldn=exprn [WHERE CONDITION]

update emp set salary=4000 where ename='lisa';

update emp a,dept b set a.salary=a.salary*b.deptno,b.deptname=a.ename where 
a.deptno=b.deptno;

3、删除记录

DELETE FROM tablename [WHERE CONDITION]

delete from emp where ename='dony';

delete a,b from emp a,dept b where a.deptno=b.deptno and a.deptno=3;

3.1 清空数据表 并使其自增id从1开始

truncate table 表名

注意:不管是单表还是多表,不加 where 条件将会把表的所有记录删除,所以操作时一定要小心。

4、查询记录

SELECT * FROM tablename [WHERE CONDITION]

*的好处是当需要查询所有字段信息时候,查询语句很简单,但是要只查询部分字段的 时候,必须要将字段一个一个列出来

select * from emp;
select ename,hiredate,salary,deptno from emp;

4.1、查询不重复的记录

select distinct deptno from emp;

4.2、条件查询

select * from emp where deptno=1;
select * from emp where deptno=1 and salary<3000;
# >、<、>=、<=、!=
# or and  逻辑

4.3、排序和限制

SELECT * FROM tablename [WHERE CONDITION] [ORDER BY field1 [DESC|ASC] , field2 
[DESC|ASC],……fieldn [DESC|ASC]]

对于排序后的记录,如果希望只显示一部分,而不是全部,这时,就可以使用 LIMIT 关键字 来实现

SELECT ……[LIMIT offset_start,row_count]
# offset_start 表示记录的起始偏移量,row_count 表示显示的行数。
select * from emp order by salary;
select * from emp order by deptno;
select * from emp order by deptno,salary desc;

select * from emp order by salary limit 3;
select * from emp order by salary limit 1,3;

4.4、聚合

很多情况下,我们需要进行一些汇总操作,比如统计整个公司的人数或者统计每个部门的人数

SELECT [field1,field2,……fieldn] fun_name 
FROM tablename
[WHERE where_contition]
[GROUP BY field1,field2,……fieldn
[WITH ROLLUP]]
[HAVING where_contition]
  • fun_name 表示要做的聚合操作,也就是聚合函数,常用的有 sum(求和)、count(*)(记录数)、max(最大值)、min(最小值)、avg(平均数)

  • GROUP BY 关键字表示要进行分类聚合的字段,比如要按照部门分类统计员工数量,部门 就应该写在 group by 后面

  • WITH ROLLUP 是可选语法,表明是否对分类聚合后的结果进行再汇总

  • HAVING 关键字表示对分类后的结果再进行条件的过滤
要 emp 表中统计公司的总人数
select count(*) from emp where deptno=1;
select count(ename) from emp where deptno=1;
select count(*) as t from emp where deptno=1;
在此基础上,要统计各个部门的人数:
select deptno, count(*) as t from emp group by deptno;
既要统计各部门人数,又要统计总人数
select deptno, count(*) as t from emp group by deptno WITH ROLLUP;
统计人数大于 2 人的部门
select deptno, count(*) as t from emp group by deptno HAVING t >2
最后统计公司所有员工的薪水总额、最高和最低薪水
 select sum(salary),max(salary),min(salary) from emp;

4.5、表连接

1、内连接
select ename,deptname from emp,dept where emp.deptno=dept.deptno;
2、外连接

外连接有分为左连接和右连接

  • 左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录
  • 右连接:包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录
select ename,deptname from emp left join dept on emp.deptno=dept.deptno;
select ename,deptname from dept right join emp on dept.deptno=emp.deptno;

select * from dept d left join emp e on e.deptno=d.deptno

4.6、子查询

当我们查询的时候,需要的条件是另外一个 select 语句的结果,这个时候,就 要用到子查询。用于子查询的关键字主要包括 in、not in、=、!=、exists、not exists 等

select * from emp where deptno in(select deptno from dept);
select * from emp where deptno in (select deptno from dept where deptno>2);

某些情况下,子查询可以转化为表连接

select emp.* from emp ,dept where emp.deptno=dept.deptno;

表连接在很多情况下用于优化子查询

4.7、记录联合

将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示出来,这个时候,就需要用 union 和 union all 关键字来实现这样的功能

ELECT * FROM t1
UNION|UNION ALL
SELECT * FROM t2
……
UNION|UNION ALL
SELECT * FROM tn;

UNION 和 UNION ALL 的主要区别是 UNION ALL 是把结果集直接合并在一起,而 UNION 是将UNION ALL 后的结果进行一次 DISTINCT,去除重复记录后的结果

#将 emp 和 dept 表中的部门编号的集合显示出来
 select deptno from emp 
 union all
 select deptno from dept;

#去重
 select deptno from emp 
 union
 select deptno from dept;

五、语句执行顺序问题

sql执行顺序 
(1) from   
(2) on 
(3) join 
(4) where 
(5) group by 
(6) avg,sum.... 
(7) having 
(8) select 
(9) distinct 
(10) order by             

也就是说,我们每次执行的SQL语句,都是从FROM开始的。