小徐帶你瞭解sql99總結以及相關練習題重點難點

內連接:

在這裏插入圖片描述

內連接特點

在這裏插入圖片描述

外連接

在這裏插入圖片描述

外連接特點

在這裏插入圖片描述

交叉連接

在這裏插入圖片描述

交叉連接特點:

	類似於笛卡爾乘積

子查詢 含義

在這裏插入圖片描述

分類:

在這裏插入圖片描述
在這裏插入圖片描述

示例

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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章