MySQL基础之SQL基础2

DML 语句

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

1.插入记录

-- 表创建好后,就可以往里插入记录了。

-- 向表 emp 中插入以下记录,即 ename 为 zzx1, hiredate 为2000-01-01,sal为2000,deptno为1:

mysql> insert into emp (ename,hiredate,sal,deptno) values('zzx1','2000-01-01','2000',1);

-- 也可以不用指定字段名称,但是 values 后面的顺序应该和字段的排列顺序一致:

mysql> insert into emp values('lisa','2003-02-01','3000',2);

-- 只对表中的 ename 和 sal 字段显式插入值:

mysql> insert into emp (ename,sal) values('dony',1000);

-- 查看一下实际插入值:
mysql> select * from emp;

插入记录 01.png

-- 在 MySQL 中,insert 语句还有一个很好的特性,可以一次性插入多条记录。

-- 下面的例子中,对表 dept 一次插入两条记录:

mysql> create table dept(deptno int,deptname varchar(10));

mysql> insert into dept values(5,'dept5'),(6,'dept6');

mysql> select * from dept;

插入记录2 02.png

2.更新记录

-- 表里的记录值可以通过 update 命令进行更改

-- 例如,将表 emp 中 ename 为 “lisa” 的薪水(sal)从3000更改为4000:

mysql> update emp set sal=4000 where ename='lisa';

更新记录 03.png

-- 在MySQL中,update 命令可以同时更新多个表中的数据

-- 在下例中,同时更新表 emp 中的字段 sal 和表 dept 中的字段 deptname

--个人先调整自己的数据表
mysql> update emp set ename='zzx' where ename='zzx1';
mysql> update emp set sal=100 where ename='zzx';
mysql> update emp set sal=200 where ename='lisa';
mysql> delete from emp where ename='dony';
mysql> insert into emp values('bjguan','2004-04-02','100',1),('dony','2005-02-05','2000',4);

mysql> delete from dept;
mysql> insert into dept values(1,'tech'),(2,'sale'),(5,'fin');

--书本上的测试

mysql> select * from emp;

mysql> select * from dept;

mysql> update emp a,dept b set a.sal=a.sal*b.deptno,b.deptname=a.ename where a.deptno=b.deptno;

mysql> select * from emp;

mysql> select * from dept;

更新记录2 04.png

更新记录3 05.png

3.删除记录

-- 如果记录不再需要,则可以用 delect 命令进行删除

-- 例如,在 emp 中将 ename为 "dony" 的记录全部删除

mysql> delete from emp where ename='dony';

删除记录 06.png

-- 在 MySQL 中可以一次删除多个表的数据

--个人先调整自己的数据表

mysql> insert into emp values('bzshen','2005-04-01','300',3),('dony','2005-02-05','2000',4);

mysql> insert into dept values(3,'hr');

-- 在下面例子中,同时删除表 emp 和 dept 中 deptno 为3的记录

mysql> select * from emp;

mysql> select * from dept;

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

mysql> select * from emp;

mysql> select * from dept;


07.png

4.查询记录

-- 数据插入到数据库中后,就可以用 select 命令进行各种各样的查询,使得输出的结果符合用户的要求。

-- 查询最简单的方式是将记录全部选出。

-- 以下两个查询是等价的:

mysql> select * from emp;
mysql> select ename,hiredate,sal,deptno from emp;

查询记录 08.png

a.查询不重复的记录
-- 有时需要将表中的记录去掉重复后显示出来,可以用 distinct 关键字来实现:

mysql> select ename,hiredate,sal,deptno from emp;

mysql> select distinct deptno from emp;

查询不重复的记录 09.png

b.条件查询
-- 用户不需要查询所有记录,只是需要根据限定条件来查询一部分数据,用 where 关键字可以实现

-- 例如,需要查询所有 deptno 为1的记录:

mysql> select * from emp;
mysql> select * from emp where deptno=1;

条件查询 10.png

c.排序和限制
-- 数据库的排序操作,用关键字 ORDER BY 来实现
-- DESC 表示按照字段进行降序排列,ASC 则表示升序排列,如果不写此关键字默认是升序排列。

-- 例如,把 emp 表中的记录按照工资高低进行显示:
mysql> select * from emp order by sal;

-- 如果排序字段的值一样,则值相同的字段按照第二个排序字段进行排序,依次类推。
-- 例如,把 emp 表中的记录按照部门编号 deptno 字段排序
mysql> select * from emp order by deptno;

-- 对于 deptno 相同的前两条记录,如果要按照工资由高到低排序,可以使用下面命令
mysql> select * from emp order by deptno,sal desc;

排序和限制 11.png

-- 对于排序后的记录,如果希望只显示一部分,而不是全部,则可以使用 LIMIT 关键字来实现。
-- 例如,显示 emp 表中按照 sal 排序后的前3条记录:
mysql> select * from emp order by sal limit 3;

-- 如果要显示 emp 表中按照 sal 排序后从第二条记录开始的3条记录,可以使用以下命令:
mysql> select * from emp order by sal limit 1,3;

排序和限制2 12.png

d.聚合
-- 很多情况下,用户都需要进行一些汇总操作

-- 例如,要在 emp 表中统计公司的总人数:
mysql> select count(1) from emp;

-- 在此基础上,要统计各部门的人数:
mysql> select deptno,count(1) from emp group by deptno;

-- 更细一些,既要统计各部门人数,又要统计总人数:
mysql> select deptno,count(1) from emp group by deptno having count(1)>1;

聚合 13.png

-- 最后统计公司所有员工的薪水总额、最高和最低薪水:

mysql> select * from emp;

mysql> select sum(sal),max(sal),min(sal) from emp;

聚合2 14.png

e.表连接
-- 当需要同时显示多个表中的字段时,可以用表连接来实现。

-- 例如,查询出所有雇员的名字和所在部门名称,因为雇员名称和部门分别存放在表 emp 和 dept 中,因此,需要使用表连接来进行查询:

mysql> select * from emp;
mysql> select * from dept;
mysql> select ename,deptname from emp,dept where emp.deptno=dept.deptno;

表连接 15.png

-- 外连接又分为左连接和右连接

-- 例如,查询 emp 中所有用户名和所在部门名称:
mysql> select * from emp;
mysql> select * from dept;
mysql> select ename,deptname from emp left join dept on emp.deptno= dept.deptno;

-- 右连接和左连接类似
mysql> select ename,deptname from dept right join emp on dept.deptno=emp.deptno;

表连接2 16.png

f.子查询
-- 某些情况下,当进行查询的时候,需要的条件是另外一个 select 语句的结果,这个时候,就要用到子查询。

-- 例如,从 emp 表中查询出所有部门在 dept 表中的所有记录:

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

子查询 17.png

-- 如果子查询记录数唯一,还可以用=代替 in

mysql> select * from emp where deptno = (select deptno from dept);
mysql> select * from emp where deptno = (select deptno from dept limit 1);

-- 某些情况下,子查询可以转化为表连接,例如
mysql> select * from emp where deptno in(select deptno from dept);

-- 转换为表连接后
mysql> select emp.* from emp ,dept where emp.deptno=dept.deptno;

子查询2 18.png

g.记录联合
-- 我们经常会碰到这样的应用,将两个表的数据按照一定的条件查询出来后,将结果合并到一起显示出来。

-- 将 emp 和 dept 表中的部门编号的集合显示出来:
mysql> select * from emp;
mysql> select * from dept;
mysql> select deptno from emp union all select deptno from dept;

-- 将结果去掉重复记录后显示
mysql> select deptno from emp union select deptno from dept;

记录联合 19.png

参考书籍

-- 书名: 深入浅出MySQL	--数据库开发、优化与管理维护(第3版)
    
-- 作者:翟振兴 崔春华 黄荣 董骐铭