MYSQL分页查询,联合查询
十九、分页查询
应用场景:当要显示的数据,一页显示不全,需要分页提交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删除可以回滚