2020 5/9
十九、分页查询
应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求
语法:(执行顺序已标出)
SELECT 查询列表 ⑦每执行一步都会生成一个虚拟的结果集
FROM 表名 ①
[join type join 表2 ②
on 连接条件 ③
where 筛选条件 ④
group by 分组字段 ⑤
having 分组后的筛选条件 ⑥
order by 排序的字端] ⑧
limit offet,size; ⑨
(offset->要显示条目的索引(起始索引从0开始),size->显示的条数)
特点:
① limit语句放在查询语句的最后面
② 若不加offset(索引),则默认起始索引为0
③ 公式:要显示的页数pags,每页的条数size
select 查询列表 from 表名 limit (page-1)*size,size;
#案例1:查询前五条员工信息
SELECT * FROM employees LIMIT 0,5;
SELECT * FROM employees LIMIT 5;
#案例2:查询第11条-第25条
SELECT * FROM employees LIMIT 10,15;
#案例3:查询有奖金的员工信息,并且工资较高的前十名显示出来
SELECT
*
FROM
employees
WHERE
commission_pct IS NOT NULL
ORDER BY
salary DESC
LIMIT 0,
10;
二十、联合查询
关键字:union(联合、合并)->将多条查询结果合并成一个结果
语法:
查询语句1
union
查询语句2
union
……
应用场景:要查询的结果来自于多个表,且多个表中没有直接的连接关系,但查询的信息一致时
特点:
① 要求多条语句查询的查询列数是一致的!
② 要求多条查询语句的查询的每一列的类型和顺序最好一致
③ union关键字默认是带去重的,如果使用union all可以包含重复项
#查询:查询部门编号大于90或邮箱中包含a的员工信息
SELECT * FROM employees WHERE department_id>90 OR email LIKE '%a%';
-------------------------------------------------------------
SELECT * FROM employees WHERE department_id >90
UNION
SELECT * FROM employees WHERE email LIKE '%a%';
以上两种放式等价!!!
#查询女神表中姓名中有‘周’字的女神名以及男朋友ID和男朋友表中名字有‘鹿’的男生的姓名与ID
SELECT NAME,boyfriend_id FROM beauty WHERE name LIKE '%周%'
UNION
SELECT boyname,id FROM boys WHERE boyname LIKE '%鹿%';
二十一、DML语言(数据操纵语言)
分类:
插入:insert
修改:update
删除:delete
#插入语句
语法:(方式一》经典插入)
INSERT INTO FROM 表名(列名、列名…) VALUES(值1、值2…);
#1.插入的值类型要与列的类型一致或兼容(可以隐式的转换)
INSERT INTO beauty(id,name,borndate,phone,photo,boyfriend_id)
VALUES(13,'菜菜','2000-12-28','000000',null,0);(插入一条)
INSERT INTO beauty(id,name,borndate,phone,photo,boyfriend_id)
VALUES(16,'菜菜','2000-12-28','000000',null,0),(14,'MIS詹','2001-5-17','000000',null,0)
,(15,'梦玲','2000-7-24','000000',null,0);(插入多条)
#2.可以为null的列如何插入(不可以为null的列必须插入字段)
#方式一:直接写为null
#方式二:在表名后要修改的列名直接不写
INSERT INTO beauty(id,name,phone,boyfriend_id)
VALUES(17,'汪汪','000000',0);
#列的顺序可以颠倒,但在给值时需要一一对应
#插入时,列数和值得个数必须一一对应
#列名可以省略,默认为所有列,而且列的顺序与表中列的顺序一致
INSERT INTO beauty
VALUES(18,'菜菜','2000-12-28','000000',null,0);
语法:(方式二)
INSERT INTO 表名
SET 列名=值,列名=值…
INSERT INTO beauty
SET id=19,name='hdjk',phone='909090';
插入的两种方式PK
- 方式一支持多行插入,而方式二不支持
- 方式一支持多行子查询,而方式二不支持
如下(子查询)
INSERT INTO beauty(id,name,phone)
SELECT 20,'qqqq','688944';
INSERT INTO beauty(id,name,phone)
SELECT 34,boyname,'688944'
FROM boys
WHERE id =3;
#修改语句
1.修改单表的记录
语法:(执行顺序已标出)
update 表名 ①
set 列名=新值,列名=新值,… ③
where 筛选条件; ②
案例:#修改beauty表中姓唐的女神的电话为0000000
UPDATE beauty
SET phone = '0000000'
WHERE name LIKE '周%';
2.修改多表的记录
语法:(sql92)
update 表1 别名, 表2,别名 ①
set 列名=新值,列名=新值,… ③
where 连接条件 and筛选条件; ②
语法:(sql99)
update 表1 别名
inner|left|right join 表2 别名
on 连接条件
set 列名=新值,列名=新值…
where筛选条件;
(sql99与语法下的)
#案例1:修改张无忌的女朋友的手机号为114[内连接]
UPDATE beauty b
INNER JOIN boys bo
ON b.boyfriend_id = bo.id
SET b.phone = '114'
WHERE bo.boyname='张无忌';
#案例2:修改没有男朋友的女神的男朋友编号都为2号
UPDATE beauty b
LEFT JOIN boys bo
ON b.boyfriend_id = bo.id
SET b.boyfriend_id=2
WHERE bo.id IS NULL;
#删除语句
方式一:delete
1.单表的删除
语法:delete from 表名 where 筛选条件
2.多表的删除
(sql92)
语法:delete 表1别名,表2别名#想删除哪个表的信息就写那个表,都想删除就都写
from 表1 别名,表2 别名
where 连接条件 and 筛选条件;
(sql99)
语法:
delete 表1别名,表2别名 #想删除哪个表的信息就写那个表,都想删除就都写
from 表1 别名
inner|left|right join 表2 别名 on 连接条件
where筛选条件;
(sql99与语法下的)
#删除张无忌的女朋友的信息
DELETE b
FROM beauty b
INNER JOIN boys bo
ON b.boyfriend_id = bo.id
WHERE bo.boyName = '张无忌';
#删除黄晓明的信息以及他女朋友的信息
DELETE b,bo
FROM beauty b
INNER JOIN boys bo
ON b.boyfriend_id = bo.id
WHERE bo.boyName = '黄晓明';
方式二:truncate
语法:
truncate table 表名;(不支持链家筛选条件)
TRUNCATE TABLE boys;(直接清空)
两种删除方式PK
- delete可以加筛选条件,truncate不能加
- truncate删除,效率高一丢丢
- 假如要删除的表中有自增长列,
如果用delete删除后,在插入数据,自增长列的值从断点开始,
而truncate删除后,在插入数据,自增长列值从1开始
- truncate删除后没有返回值,而delete有(即是否显示表中有几行收到影响,若是truncate,则都是0)
- truncate删除不能回滚,而delete删除可以回滚