MySQL[笔记][基础部分八]

进阶8:分页查询 ★

应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求
语法:

select 查询列表
from 表
【join type join 表2
on 连接条件
where 筛选条件
group by 分组字段
having 分组后的筛选
order by 排序的字段】
limit offset,size;

      offset要显示条目的起始索引(起始索引从0开始)
      size  要显示的条目个数

特点:
1 limit语句放在查询语句的最后,执行顺序也是最后
2 公式
要显示的页数 page,每页的条目数size
select 查询列表
from 表
limit (page-1)*10,size;

        size=10
        page
        1  0
        2  10
        3  20

#案例1:查询前五条员工信息

SELECT * FROM employees LIMIT 0,5;

SELECT * FROM employees LIMIT 5;/效果一样/

#案例2:查询第11条-第25条

SELECT * FROM employees LIMIT 10,15;

#案例3:有奖金的员工信息,并且工资较高的前10名显示出来

SELECT * FROM employees
WHERE commission_pct IS NOT NULL
ORDER BY salary DESC
LIMIT 10 ;

#text

#一、查询 所有学员的邮箱的用户名(:邮箱中 @前面的字符)

SELECT SUBSTRING(email,1,INSTR(email,’@’)-1) 用户名
FROM stuinfo

#二、查询男生和女生的个数

SELECT COUNT(*) 个数,sex
FROM stuinfo
GROUP BY sex;

#三、查询年龄>18岁的所有学生的姓名和年纪名称

SELECT NAME,gradeName
FROM stuinfo s
INNER JOIN grade g
ON s.gradeId=g.id
WHERE age>18;

#四、查询哪个年级的学生最小年龄>20岁

SELECT gradeid,MIN(salary)
FROM stuinfo
GROUP BY gradeid
HAVING MIN(salary)>20;

#五、试说出查询语句中涉及到的所有的关键字,以及执行先后顺序

SELECT 查询列表 7
FROM 表 1
连接类型 JOIN 表2 2
ON 连接条件 3
WHERE 筛选条件 4
GROUP BY 分组列表 5
HAVING 分组后的筛选 6
ORDER BY 排序列表 8
LIMIT 偏移,条目数; 9

GO OVER

#sql99语法

#1、内连接
#语法:

SELECT 查询列表
FROM 表1 别名
【inner】 JOIN 表2 别名 ON 连接条件
WHERE 筛选条件
GROUP BY 分组列表
HAVING 分组后的筛选
ORDER BY 排序列表
LIMIT 子句;

特点:
1、表的顺序可以调换
2、内连接的结果=多表的交集
3、n表连接至少需要n-1个连接条件

分类:
等值连接

非等值连接

自连接

#2、外连接
语法:

SELECT 查询列表
FROM 表1 别名
LEFT|RIGHT|full【outer】 JOIN 表2 别名 ON 连接条件
WHERE 筛选条件
GROUP BY 分组列表
HAVING 分组后的筛选
ORDER BY 排序列表
LIMIT 子句;

特点:
1、查询的结果=主表中所有的行,其中从表和它匹配的将显示匹配行,如果从表没有匹配的则显示null
2、left join左边的就是主表,right join 右边的就是主表
full join 两边都是主表
3、一般用于查询除了交集部分的剩余的不匹配的行

#3、交叉连接

语法
SELECT 查询列表
FROM 表1 别名
CROSS JOIN 表2 别名;

特点:
类似于笛卡尔乘积

子查询
一、含义

嵌套在其他语句内部的select语句称为子查询或内查询,

外面的语句可以是insert、update、delets、select等,一般select作为外面语句较多

外面如果为select语句,则此语句称为外查询或主查询

二、分类
1、按出现位置
select 后面:

仅仅支持标量子查询

from后面:

表子查询

where或having后面: √

标量子查询 √
列子查询 √
行子查询

exists后面:(ture、false就看有没有值)

标量子查询
列子查询
行子查询
表子查询

2、按结果集的行列
标量子查询(单行子查询):结果集为一行一列 √

列子查询(多行子查询):结果集为行一列 √

行子查询:结果集为多行多列

表子查询:结果集为多行多列

三、实例

where或having后面

1、标量子查询

案例:查询最低工资的员工姓名和工资

select min(salary)
from employees

select last_name,salary
from employees
where salary=
(
select min(salary)
from employees
)

2、列子查询

#案例:查询所有是领导的员工姓名

1查询所有员工的manager_id

select manager_id
from employees

2查询姓名,employee_id属于1列表的一个

select last_name
from employees
where employee_id in
(
select manager_id
from employees
)

#TEXT

#1、查询工资最低的员工信息:last_name,salary

SELECT MIN(salary)
FROM employees

SELECT last_name,salary
FROM employees
WHERE salary =
(
SELECT MIN(salary)
FROM employees
)

#2、查询平均工资最低的部门信息 tantac->ou

#1、各部门的平均工资
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id

#把1当成一个表
SELECT MIN(ag)
FROM (
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id
) ag_dep

#easy way
SELECT department_id
FROM employees
GROUP 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;
)

#3.查询平均工资最低的部门信息和该部门的平均工资

SELECT *
FROM departments

WHERE department_id=(

SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary)
LIMIT 1;
)

#4.查询平均工资最高的job信息

#查询每个job的平均工资

SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id
ORDER BY AVG(salary) DESC #limit - order by
LIMIT 1;

SELECT *
FROM jobs
WHERE job_id=
(
SELECT AVG(salary),job_id
FROM employees
GROUP BY job_id
ORDER BY AVG(salary) DESC #limit - order by
LIMIT 1;
)

#5、查询平均工资高于公司平均工资的部门有哪些?

SELECT AVG(salary)
FROM employees

SELECT AVG(salary)
FROM employees
GROUP BY department_id

筛选2结果集,满足大于1

SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary)>
(
SELECT AVG(salary)
FROM employees
GROUP BY department_id
)

#6查询出公司所有manager的详细信息
SELECT DISTINCT manager_id
FROM employees

SELECT *
FROM employees
WHERE employee_id IN #或者 =ANY 也可以
(
SELECT DISTINCT manager_id
FROM employees
)

#7各个部门中 最高工资中最低的哪个部门的最低工资是多少?

SELECT MAX(salary),department_id
FROM departments
ORDER BY salary
LIMIT 1

SELECT MIN(salary)
FROM employees
WHERE MIN(salary) =
(
SELECT department_id
FROM departments
GROUP BY department_id
ORDER BY MAX(salary)
LIMIT 1

)

查询平均工资最高的部门的manger的相信信息:
last_name,department_id,email,salary

SELECT department_id
FROM departments
GROUP BY department_id
ORDER BY AVG(salary) DESC
LIMIT 1

#将employees和departments连接查询,筛选条件是1
SELECT last_name,department_id,email,salary
FROM employees e
INNER JOIN departments d
ON d.manger_id=e.employee_id
WHERE d.department_id =
(
SELECT department_id
FROM departments
GROUP BY department_id
ORDER BY AVG(salary) DESC
LIMIT 1
);

#text
#1、查询每个专业的学生人数

SELECT majorid,COUNT(*)
FROM student
GROUP BY majorid

2、查询参加考试的学生中,每个学生的平均分、最高分

SELECT AVG(score),MAX(score),studentno
FROM result
GROUP BY studentno;

3、查询姓张的每个学生的最低分大于60的学号、姓名

SELECT s.studentno,s.studentname,MIN(score)
FROM student s
JOIN result r
ON s.studentno = r.studentno
WHERE s.last_naem = ‘张’
GROUP BY s.studentno
HAVING MIN(score)>60

#4查询生日在1988-1-1后的学生姓名、专业名称

SELECT studentname,majorname
FROM students
JOIN major m
ON s.majorid = m.majorid
WHERE DATEDIFF (borndate,‘1988-1-1’)>0 #1-2) 1>2 显示1; 1<2显示0

#5、查询每个专业的男生人数和女生人数分别是多少

SELECT COUNT(*) 个数,sex,majorid
FROM student
GROUP BY sex,majorid;

#方式二
SELECT majorid,
(SELECT COUNT() FROM student WHERE sex = ‘男’ AND majorid=s.majorid)男,
(SELECT COUNT(
) FROM student WHERE sex = ‘女’ AND majorid=s.majorid)女
FROM student s
GROUP BY majorid;

#6、查询专业和张翠山一样的学生的最低分

SELECT majorid
FROM major
WHERE last_name = ‘张翠山’

SELECT MIN(score)
FROM result
WHERE studentno=
(
SELECT studentno
FROM student
WHERE majorid=
(
SELECT majorid
FROM student
WHERE studentname = ‘张翠山’
)
)

#7、查询大于60分的学生的姓名、密码、专业名

SELECT studentname,loginpwd,majorname
FROM student s
JOIN major m
ON s.majorid = m.majorid
JOIN result r
ON s.studentno = r.studentno
WHERE r.score>60;

#8、按邮箱位数分组,查询每组的学生个数

SELECT COUNT(*),LENGTH(email)
FROM student
GROUP BY LENGTH(email);

#9、查询学生名、专业名、分数

SELECT studentname,score,majorname
FROM student s
JOIN major m
ON s.majorid = m.majorid
LEFT JOIN result r
ON s.studentno = r.studentno;

#10、查询哪个专业没有学生,分别用左连接和右链接实现
#左
SELECT m.majorid,m.majorname,s.studentno
FROM major m
LEFT JOIN student s
ON m.majorid = s.majorid
WHERE s.studentno IS NULL;

#右
SELECT m.majorid,m.majorname,s.studentno
FROM student s
LEFT JOIN major m
ON m.majorid = s.majorid
WHERE s.studentno IS NULL;

#11、查询没有成绩的学生人数

SELECT COUNT(*)
FROM student s
LEFT result r
ON s.studentno = r.studentno
WHERE s.studentno IS NULL;

猜你喜欢

转载自blog.csdn.net/SwaeLeeUknow/article/details/107721216