內連接:
內連接特點
外連接
外連接特點
交叉連接
交叉連接特點:
類似於笛卡爾乘積
子查詢 含義
分類:
示例
where或having後面1:標量子查詢
查詢最低工資的員工姓名和工資
SELECT last_name, salary FROM employees WHERE salary =( SELECT min( salary ) FROM employees );
查詢所有是領導的員工姓名 重點
SELECT
last_name
FROM
employees
WHERE
manager_id IN ( SELECT employee_id FROM employees );
分頁查詢應用場景
語法:
子查詢經典案例 重點難點
案例一:查詢工資最低的員工信息last_name,salary
SELECT last_name, salary FROM employees WHERE salary =( SELECT MIN( salary ) FROM employees );
案例二:查詢平均工資最低的部門信息 重點難點
#第一種方式使用limit
SELECT * FROM departments WHERE department_id =( SELECT department_id FROM employees GROUP BY department_id ORDER BY avg( salary ) ASC LIMIT 1 );
#第二種方式
SELECT
d.*
FROM
departments d
WHERE
d.department_id =(
SELECT
department_id
FROM
employees
GROUP BY
department_id
HAVING
avg( salary )=(
SELECT
min( ag )
FROM
( SELECT AVG( salary ) ag, department_id FROM employees GROUP BY department_id ) ag_dep
));
案例三:查詢平均工資最低的部門信息和該部門的平均工資 重點難點
SELECT
*
FROM
( SELECT AVG( salary ), department_id id FROM employees GROUP BY department_id ORDER BY AVG( salary ) ASC LIMIT 0, 1 ) avg_temp
INNER JOIN departments ON departments.department_id = avg_temp.id;
案例四:查詢平均工資最高的job信息
SELECT * FROM jobs WHERE job_id =( SELECT job_id FROM employees GROUP BY job_id ORDER BY AVG( salary ) DESC LIMIT 1 );
案例五:查詢平均工資高於公司平均工資的部門有哪些?
SELECT AVG( salary ), department_id FROM employees GROUP BY department_id HAVING AVG( salary ) >( SELECT AVG( salary ) FROM employees );
案例六:查詢公司中所有manager的詳細信息
SELECT
*
FROM
employees e
WHERE
e.employee_id IN ( SELECT DISTINCT manager_id FROM employees );
案例七:各個部門中,最高工資中最低的那個部門的最低工資多少
SELECT min( salary ), department_id FROM employees WHERE department_id =( SELECT department_id FROM employees GROUP BY department_id ORDER BY MAX( salary ) LIMIT 1 );
案例八:查詢平均工資最高的部門的manager的詳細信息,last_name,department_id,email,salary
SELECT
last_name,
d.department_id,
email,
salary
FROM
employees e
INNER JOIN departments d ON e.employee_id = d.manager_id
WHERE
d.department_id =(
SELECT
department_id
FROM
employees
GROUP BY
department_id
ORDER BY
AVG( salary ) DESC
LIMIT 1
);
練習題:
一:查詢每個專業的學生人數
SELECT
majorid,
COUNT(*)
FROM
student
GROUP BY
majorid;
二:查詢參加考試的學生中,每個學生的平均分,最高分
SELECT
AVG( score ),
MAX( score ),
studentno
FROM
result
GROUP BY
studentno;
三:查詢姓張的每個學生的最低分大於60的學號,姓名
SELECT
s.studentno,
s.studentname,
MIN( score )
FROM
student s
JOIN result r ON s.studentno = r.studentno
WHERE
s.studentname LIKE '%張%'
GROUP BY
s.studentno
HAVING
MIN( score )> 60;
四:查詢生日在1988-1-1後的學生姓名,專業名稱
SELECT
studentname,
majorname
FROM
student s
JOIN major m ON s.majorid = m.majorid
WHERE
datediff ( borndate, '1988-1-1' )> 0;
五:查詢每個專業的男生人數和女生人數分別是多少
#方式一
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;
案例六:查詢專業和張翠山一樣的學生的最低分
SELECT MIN( score ) FROM result WHERE studentno IN ( SELECT studentno FROM student WHERE majorid =( SELECT majorid FROM student WHERE studentname = '張翠山' ));
案例七:查詢大於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;
案例八:按郵箱位數分組,查詢每組的學生個數
SELECT
COUNT(*),
LENGTH( email )
FROM
student
GROUP BY
LENGTH( email );
案例九:查詢學生名,專業名,分數
SELECT
studentname,
score,
majorname
FROM
student s
JOIN major m ON m.majorid = s.majorid
JOIN result r ON s.studentno = r.studentno;
案例十:查詢哪個專業沒有學生,分別用左連接和右連接實現
#左連接
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
RIGHT JOIN major m ON m.majorid = s.majorid
WHERE
s.studentno IS NULL;
案例十一:查詢沒有成績的學生人數
SELECT COUNT(*),score
FROM student s
LEFT JOIN result r
on r.studentno=s.studentno WHERE r.id is null;