联合查询
union 联合,合并:将多条查询语句的结果合成一个结果
语法:
查询语句1
UNION
查询语句2
…
UNION
查询语句n;
/**查询部门编号>30或邮箱中包含a的信息**/
SELECT * FROM employees WHERE department_id > 30
UNION
SELECT * FROM employees WHERE email LIKE '%a%' ;
表:china
c_id | c_name | c_sex |
---|---|---|
男 |
表forei
f_id | f_name | f_sex |
---|---|---|
male |
/**查询中国用户中所有男性的信息以及外国用户中所有男性的信息**/
SELECT * FROM china WHERE e_sex = '男'
UNION
SELECT * FROM forei WHERE f_sex = 'male'
适用于查询多张表的信息,而且表和表之间没有直接的连接关系,但是查询的信息一致时就可以使用联合查询
注意事项:
- 要求多条查询语句的查询列数一致
- 要求多条查询语句的查询的每一列的类型和顺序最好是一致
- 使用UNIION关键字默认是去重的;如果使用UNION ALL则可以包含重复项
DML语言
DML:数据操作语言。分别涉及了插入(insert)、删除(delete)、修改(update)
注:字符型数据和日期型数据再插入的时候要加单引号
插入语句
语法:
-
插入方法一:
insert into 表名
(列1名,列2名…列n名)
values
(列1值,列2值,…列n值);
插入注意事项:
- 插入的值的类型要和列的类型相一致或者兼容(即可以相互转换)
- 不可以为null的列必须插入值
- 要插入的列数和值一定要一一对应
- 插入的是有也可以省略列名,但这里默认的是插入表中所有列的数据
-
插入方法二:
insert into 表名
set 列1名 = 列1值,
列2名= 列2值
…
列n名= 列n值;
方法一和方法二的区别:
-
方法一支持多行插入但是方法二不支持
给表student插入三行数据:
insert into student
(1,‘张三’,‘男’),
(2,‘李四’,‘男’),
(3,‘王五’,‘男’);
-
方法一支持子查询,方法二不支持
因为先执行select语句,将select语句执行的结果集作为数据插入表student中
insert into student
(id,name,sex)
select (4,‘赵六’,‘男’);
将表boy中id<3的数据插入到student表中
insert into student
(id,name,sex)
select (id,name,sex) from boy where id ❤️;
-
修改语句
修改单表的记录
语法:
更新所有行中包含这些列的数据
update 表名
set 列1名 = 列1值,
列2名= 列2值
…
列n名= 列n值;
更新满足行中包含这些列的数据
update 表名
set 列1名 = 列1值,
列2名= 列2值,
…
列n名= 列n值 //这里没有逗号结尾
WHERE 筛选条件;
UPDATE student
SET
name = 'tom'
WHERE id = 1;
修改多表的记录
sql92语法:
UPDATE 表1 别名,表2 别名
SET 列 = 值
WHERE 连接条件
AND 筛选条件;
sql99语法
UPDATE 表1 别名
[连接类型] JOIN 表2 别名
ON 连接条件
SET 列 = 值
WHERE 筛选条件;
表beauty
id | name | sex | phone | borndate | boyfriend |
---|---|---|---|---|---|
1 | 柳岩 | 女 | 15090833772 | 2018-1-2 | 1 |
2 | AngleBaby | 女 | 19037399002 | 2012-3-2 | 3 |
3 | 赵丽颖 | 女 | 15909877112 | 1998-2-1 | 4 |
4 | 赵敏 | 女 | 15980291854 | 1998-2-3 | 2 |
5 | 周芷若 | 女 | 15892041335 | 1993-12-4 | 2 |
6 | 金星 | 女 | 18390833220 | 1992-1-2 | 9 |
表boy
id | boyname | usercp(魅力值) |
---|---|---|
1 | 大鹏 | 100 |
2 | 张无忌 | 339 |
3 | 黄晓明 | 99 |
4 | 冯绍峰 | 400 |
5 | 男神· | 500 |
案例一:修改张无忌的女朋友的手机号为110
UPDATE FROM beauty bea,boy b
SET phone = '110'
WHERE bea.'boyfriend' = b.'id'
AND b.name = '张无忌';
案例2:修改没有的男朋友的女神的男朋友编号都为5号
注:如果女神的boyfriend在boy中没有找到则视为没有男朋友
分析:
- 找出beauty中有而boy中没有的数据,即采用的是外连接
- 将boyfriend改为5
UPDATE beauty bea
LEFT JOIN boy b
ON bea.'boyfriend' = b.'id'
SET bea.'boyfriend' = 5
WHERE b.id IS NULL;
删除
语法:
单表的删除
-
方式一:delete
删除整张表
delete from 表名;
按照条件删除记录
delete from 表名 where 筛选条件;
-
方式二:truncate
truncate table 表名;
注:truncate后面不可以跟筛选条件,因此是将整张表全部删除
delete和truncate的区别:
-
delete可以添加where条件;truncate不能加
-
truncate效率会更高一些
-
假如要删除的表中有自增长列:如果用delete删除后,在插入数据,自增长列的值从断点处开始;
如果用truncate删除,数字增长列的值则是从1处开始
-
delete删除有返回值;truncate删除没有返回值
-
delete删除可以回滚;truncate删除不能回滚
-
表beauty
id | name | sex | phone | borndate | boyfriend |
---|---|---|---|---|---|
1 | 柳岩 | 女 | 15090833772 | 2018-1-2 | 1 |
2 | AngleBaby | 女 | 19037399002 | 2012-3-2 | 3 |
3 | 赵丽颖 | 女 | 15909877112 | 1998-2-1 | 4 |
4 | 赵敏 | 女 | 15980291854 | 1998-2-3 | 2 |
案例一:删除beauty表中手机号以4结尾的女神信息
DELETE FROM beauty
WHERE phone LIKE '%9';
多表删除
sql92
delete 表1的别名,表2的别名
from 表1 别名,表2 别名
where 连接条件
and 筛选条件
注:delete后面的别名根据自己要删除记录的需求来填写,如果仅需要删除满足条件表1里面的记录删除,那么delete后面只需要写表1的别名即可
sql99
delete 表1的别名,表2的别名
from 表1 别名
[连接类型] join 表2 别名
on 连接条件
where 筛选条件;
案例二:删除张无忌的女朋友的信息
/**sql92**/
DELETE bea
FROM beauty bea,boy b
WHERE bea.'boyfriend' = b.'id'
AND b.name = '张无忌';
/**sql99**/
DELETE bea
FROM beauty bea
INNER JOIN boy b
ON bea.'boyfriend' = b.'id'
WHERE b.name = '张无忌';
案例三:删除黄晓明的信息以及他女朋友的信息
/**sql92**/
DELETE bea,b
FROM beauty bea,boy b
WHERE bea.'boyfriend' = b.'id'
AND b.name = '黄晓明';
/**sql99**/
DELETE bea,b
FROM beauty bea
INNER JOIN boy b
ON bea.'boyfriend' = b.'id'
WHERE b.name = '黄晓明';