MySQL学习笔记(2) - DML语句

简介

DML(Data Manipulation Language)数据操纵语言:用于对数据库记录进行增添、删除、更改、查询,并检查数据完整性等操作。常用的关键字有insert(插入)、delete(删除)、update(更新)、select(查询)等。

具体步骤

插入记录

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

表中字段:
在这里插入图片描述
例 如, 向 表 emp 中 插 入 以 下 记 录: ename 为 llw1, hiredate 为 2020-01-01, sal 为 20000, 命 令 执 行 如 下:

mysql>insert into emp (ename, hiredate, sal, deptno) values('llw1', '2020-01-01', '20000', 1);

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

mysql>insert into emp values('lw', '2018-01-01', '30000', 2);

也可以只对表中的“ename”、“sal”字段显式插入:

mysql>insert into emp (ename, sal) values('llw2', '20000');

结果显示:
在这里插入图片描述
这些没写的字段可以自动设置为NULL、默认值、自增的下一个数字,这样在某些情况下可以大大缩短SQL语句的复杂性。

一次性插入多条:

INSERT INTO tablename (field1, field2, …, fieldn)
VALUES
(record1_value1, record1_value2, …, record1_valuesn),
(record2_value1, record2_value2, …, record2_valuesn),

(recordn_value1, recordn_value2, …, recordn_valuesn);

例如:

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

结果显示:
在这里插入图片描述

更新记录

表里的记录值可以通过update命令进行更改,语法如下:

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

例如,将表emp中ename为“llw1”的薪水(sal)从20000更改为10000:

mysql> update emp set sal = 10000 where ename='llw1';

结果显示:
在这里插入图片描述
update命令还可以同时更新多个表中数据,语法如下:

UPDATE t1,t2,…,tn set t1.field1=expr1,tn.fieldn=exprn [WHERE CONDITION]

例如:

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

结果显示:
在这里插入图片描述

删除记录

如果记录不再需要,可以用delete命令进行删除,语法如下:

DELETE FROM tablename [WHERE CONDITION]

例如:

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

在MySQL中可以一次删除多个表的数据,语法如下:

DELETE t1,t2,…,tn FROM t1,t2,…,tn [WHERE CONDITION]

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

结果显示:
在这里插入图片描述

查询记录

SELECT的语法很复杂,这里只介绍最基本的语法:

SELECT * FROM tablename [WHERE CONDITION]

mysql>select * from emp;

在这里插入图片描述
其中“*”表示要将所有的记录都显示出来,也可以用逗号分割的所有字段来代替,例如:

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

查询不重复的记录

distinct关键字可以实现不重复记录显示,例如:

mysql>select distinct ename from emp;

结果显示:
在这里插入图片描述

条件查询

显示“deptno”为“1”的记录:

mysql>select * from emp where deptno = 1;

结果显示:
在这里插入图片描述
上面的例子中,where后面的条件是一个字段的=比较,除了 = 外,还可以使用 ><>=<=!= 等比较运算符;多个条件之间还可以使用 orand 等逻辑运算符进行多条件联合查询

结果显示:
在这里插入图片描述

排序和限制

如果想要显示按某个字段排序后的结果,可以用关键字order by来实现,语法如下:

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

其中,DESC和ASC是排序顺序关键字,DESC表示按照字段进行降序排列,ASC则表示升序排列,如果不写此关键字默认是升序排列。ORDER BY后面可以跟多个不同的排序字段,并且每个排序字段可以有不同的排序顺序。

例如:

mysql>select * from emp order by sal desc;

实现记录按照sal降序显示,结果如下:
在这里插入图片描述
如果排序字段的值一样,则值相同的字段按照第二个排序字段进行排序,依次类推。如果只有一个排序字段,则这些字段相同的记录将会随机排列。

记录排好序后,如果只想要显示一部分记录,可以用limit关键字来实现,语法如下:

SELECT …[LIMIT offset_start,row_count]

例如:

mysql>select * from emp order by sal desc limit 3;

只显示前3条记录,结果如下:
在这里插入图片描述
显示第m到n条记录。

例如,显示第2到第3条记录:

mysql>select * from emp order by sal desc limit 1, 2;

结果如下:
在这里插入图片描述

聚合

很多情况下,用户都需要进行一些汇总操作,比如统计整个公司的人数或者统计每个部门的人数,这时就要用到SQL的聚合操作。

聚合操作的语法如下:

SELECT [field1,field2,…,fieldn]
fun_name FROM tablename
[WHERE here_contition]
[GROUP BY field1,field2,…,fieldn [WITH ROLLUP]]
[HAVING where_contition]

对其参数进行以下说明:

fun_name 表示要做的聚合操作,也就是聚合函数,常用的有 sum(求和)、count(*) (记录数)、max(最大值)、min(最小值)。
GROUP BY关键字表示要进行分类聚合的字段,比如要按照部门分类统计员工数量,部门就应该写在 group by后面。
WITH ROLLUP是可选语法,表明是否对分类聚合后的结果进行再汇总。
HAVING关键字表示对分类后的结果再进行条件的过滤。

注意:

having和where的区别在于,having是对聚合后的结果进行条件的过滤,而where是在聚合前就对记录进行过滤,如果逻辑允许,我们尽可能用where先过滤记录,这样因为结果集减小,将对聚合的效率大大提高,最后再根据逻辑看是否用having进行再过滤。

当前表中记录如下:
在这里插入图片描述
例如,在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 with rollup;

在这里插入图片描述
统计人数大于1人的部门:

mysql> select deptno,count(1) from emp group by deptno having count(1) > 1;

在这里插入图片描述
统计公司所有员工的薪水总额、最高和最低薪水:

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

在这里插入图片描述

表连接

当需要同时显示多个表中的字段时,就可以用表连接来实现这样的功能。从大类上分,表连接分为内连接 和外连接 ,它们之间的最主要区别是,内连接仅选出两张表中互相匹配的记录,而外连接会选出其他不匹配的记录。

当前表中记录如下:
在这里插入图片描述
在这里插入图片描述
我们最常用的是内连接。例如,查询出所有雇员的名字和所在部门名称:

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

在这里插入图片描述
外连接又分为左连接和右连接 ,具体定义如下。

左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。
右连接:包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录。

例如,查询dept中所有部门名称和对应的雇员名称:

mysql> select ename, deptname from emp right join dept on emp.deptno = dept.deptno;

emp记录中没有雇员对应到“lw”部门,结果显示如下:
在这里插入图片描述

子查询

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

当前emp表中的所有记录:
在这里插入图片描述
dept表中的记录:
在这里插入图片描述
例如,从emp表中查询出所有部门在dept表中的所有记录:

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

在这里插入图片描述
因为“llw5”所在的部门在dept表中无记录,所以不显示。

子查询可以转化为表连接,例如将上面的语句用表连接表示:

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

在这里插入图片描述

注意: 子查询和表连接之间的转换主要应用在两个方面。
MySQL 4.1以前的版本不支持子查询,需要用表连接来实现子查询的功能。
表连接在很多情况下用于优化子查询。

记录联合

将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示出来,这个时候,就需要用 union和union all关键字来实现这样的功能,具体语法如下:
SELECT * 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表中的部门编号的集合显示出来:

mysql> select deptno from emp union all select deptno from dept;

结果如下:
在这里插入图片描述
去掉重复记录:

mysql> select deptno from emp union select deptno from dept;

结果如下:
在这里插入图片描述

发布了2 篇原创文章 · 获赞 2 · 访问量 36

猜你喜欢

转载自blog.csdn.net/weixin_43587255/article/details/105464583