------------恢复内容开始------------
#进阶8:分页查询
应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求
语法:
select 查询列表
from 表
【join type join 表2
on 连接条件
where 筛选条件
group by 分组字段
having 分组后的筛选条件
order by 排序的字段】
limit [offset], size;
offset要显示条目的起始引索(默认从0开始)
size要显示的条目个数
#案例1:查询前五条员工信息
SELECT * FROM employees LIMIT 0,5;
或SELECT * FROM employees LIMIT 5;从0开始可以省略
#案例2:查询第11条-第25
SELECT * FROM employees LIMIT 10,15;
#案例3:有奖金的员工信息,并且工资较高的前10名显示出来
SELECT *
FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY salary DESE
LIMIT 10;
总结特点:
- limit 语句放在查询语句的最后
- 公式:要显示的页数page,每页的条目数size
select 查询列表
from 表
limit (page-1)*size, size;
测试题
一、查询所有学员的邮箱的用户名(@前的字符)
select substr(email,1,instr(email,'@')-1)
from stuinfo;
二、查询男生和女生的个数
select count(*) 个数, sex
from stuinfo
order by sex;
三、查询年龄>18岁的所有学生的姓名和年级名称
select name, gradeName
from stuinfo s
inner join grade g on s.gradeid=g.id
where age>18;
四、查询哪个年纪的学生最小年龄>20
select min(age), gardeid
form stuinfo
group by gradeid
having min(age)>20;
五、试说出查询语句中涉及到的所有的关键字,以及执行先后顺序
select 查询列表 7
from 表 1
连接类型 join 表2 2
on 连接条件 3
where 筛选条件 4
group by 分组列表 5
having 分组后的筛选 6
order by 排序列表 8
limit 偏移,条目数 9
四、sql99语法
1、内连接
语法:
select 查询列表
from 表1 别名
【inner】join 表2 别名
on 连接条件
。。。
特点:
- 表的顺序可以调换
- 内连接的结果=多表的交集
- n表连接至少需要n-1个连接条件
分类:等值连接、非等值连接、自连接
2、外连接
语法:
select 查询列表
from 表1 别名
left/right/full【outer】join 表2 别名
on 连接条件
。。。
特点:
- 查询结果=主表中所有的行,如果从表和他匹配的将显示匹配行,如果从表没有匹配的则显示null
- left join 左边是主表,right join 右边是主表,full join 两边都是主表
- 一般用于查询除了交集部分的剩余的不匹配的行
3、交叉连接
语法:
select 查询列表
from 表1 别名
cross join 表2 别名;
特点:类似于笛卡尔成绩
一、含义
嵌套在其他语句内部的select语句称为子查询或内查询,
外面的语句可以是insert、update、delete、select等,一般select作为外面语句较多
外面如果为select语句,则此语句成为外查询或主查询
二、分类
1、按出现的位置
select后面:仅仅支持标量子查询;from后面:表子查询;
where和having后面:标量子查询、列子查询、行子查询;exists后面:均可
2、按结果集的行列
标量子查询(单行子查询):结果集为一行一列
列子查询(多行子查询):结果集为多行一列
行子查询:结果集为多行多列
表子查询:结果集为多行多列
三、示例
1、标量子查询
where或having后面
案例:查询最低工资的员工姓名和工资
select last_name, salary
from employees
where salary=(
select min(salary)
from employees
);
2、列子查询
案例:查询所有是领导的员工姓名
select last_name
from employees
where employee_id in(
select manager_id
from employees
);
经典案例:
1、查询平均工资最低的部门信息
求出最低平均工资的部门编号
SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1;
查询部门信息
SELECT *
FROM departments
WHERE department_id=(
SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1
);
#进阶9:联合查询
union联合 合并:将多条查询语句的结果合并成一个结果
语法:
查询语句1
union
查询语句2
union
。。。
应用场景:要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致
特点:
- 要求多条查询语句的查询列数是一致的
- 要求多条查询语句的查询的每一列的类型和顺序最好是一致
- union关键字默认去重,如果使用union all 可以包含重复项
DML语言
数据操作语言
- 插入insert
- 修改update
- 删除delete
#一、插入语句
方式一、
语法:
insert into 表名(列名,。。。)
values(值1,。。。)
#1、插入的值的类型要与列的类型一致或兼容
#2、不可以为null的列必须插入值,可以为null的列如何插入值?
#3、列的顺序是否可以调换
#4、列数和值的个数必须一致
#5、可以省略列名,默认所有列,而且列的顺序和表中列的顺序一致
方式二、
语法:
insert into 表名
set 列名=值,列名=值,。。。
两种方式PK
1、方式一支持插入多行,方式二不支持
2、方式一支持子查询,方式二不支持
二、修改语句
1、修改单表的记录
语法;
update 表名 1
set 列=新值,列=新值,。。。 3
where 筛选条件; 2
案例1:修改boys表id号为2的名称为张飞,魅力值10
UPDATE boys SET boyname='张飞‘,usercp=10
WHERE id=2;
2、修改多表的记录【补充】
语法:
sql92 语法:
update 表1 别名,表2 别名
set 列=值,。。。
where 连接条件
and 筛选条件
sql99语法:
update 表1 别名
inner | left | right join 表2 别名
on 连接条件
set 列=值,。。。
where 连接条件
and 筛选条件
案例1:修改张无忌的女朋友的手机号为114
UPDATE boys bo
INNER JOIN beauty b
ON bo.'id'=b.'boyfriend_id'
SET b.'phone'='114'
WHERR bo.boyName='张无忌‘;
三、删除语句
方式一、delete
语法:
1、单表的删除
delete from 表名 where 筛选条件
案例1:删除手机号以9结尾的女神信息
DELETE FROM beauty WHERE phone LIKE '%9';
2、多表的删除
sql92语法:
delete 表1 别名,表2 别名
from 表1 别名,表2 别名
where 连接条件
and 筛选条件
sql99语法:
delete 表1 别名,表2 别名
from 表1 别名 表2 别名
inner | left | right join 表2 别名 on 连接条件
where 筛选条件
案例:删除张无忌女朋友的信息
DELETE b
FROM beauty b
INNER JOIN boys bo ON b.'boyfriend_id'=bo.'id'
WHERE bo.'boyName'='张无忌‘;
方式二:truncate
语法:truncate table 表名
------------恢复内容结束------------