三天学会MySQL - MySQL数据库章节练习
MySQL數(shù)據(jù)庫章節(jié)練習
講師:宋紅康
微博:尚硅谷-宋紅康
第1節(jié) 選擇與過濾
【題目】 # 1.查詢員工12個月的工資總和,并起別名為ANNUAL SALARY# 2.查詢employees表中去除重復的job_id以后的數(shù)據(jù)# 3.查詢工資大于12000的員工姓名和工資# 4.查詢員工號為176的員工的姓名和部門號# 5.選擇工資不在5000到12000的員工的姓名和工資# 6.選擇在20或50號部門工作的員工姓名和部門號# 7.選擇公司中沒有管理者的員工姓名及job_id# 8.選擇公司中有獎金的員工姓名,工資和獎金級別# 9.選擇員工姓名的第三個字母是a的員工姓名# 10.選擇姓名中有字母a和e的員工姓名1.查詢員工12個月的工資總和,并起別名為ANNUAL SALARY
SELECT employee_id , last_name, salary * 12 "ANNUAL SALARY" FROM employees;2.查詢employees表中去除重復的job_id以后的數(shù)據(jù)
SELECT DISTINCT job_id FROM employees;3.查詢工資大于12000的員工姓名和工資
SELECT last_name, salary FROM employees WHERE salary > 12000;4.查詢員工號為176的員工的姓名和部門號
SELECT last_name, department_id FROM employees WHERE employee_id = 176;5.選擇工資不在5000到12000的員工的姓名和工資
SELECT last_name, salary FROM employees WHERE salary < 5000 OR salary > 12000; SELECT last_name, salary FROM employees WHERE salary NOT BETWEEN 5000 AND 12000;6.選擇在20或50號部門工作的員工姓名和部門號
SELECT last_name, department_id FROM employees WHERE department_id = 20 OR department_id = 50; SELECT last_name, department_id FROM employees WHERE department_id IN(20, 50);7.選擇公司中沒有管理者的員工姓名及job_id
SELECT last_name, job_id FROM employees WHERE manager_id IS NULL;8.選擇公司中有獎金的員工姓名,工資和獎金級別
SELECT last_name, salary, commission_pct FROM employees WHERE commission_pct IS NOT NULL;9.選員工姓名的第三個字母是a的員工姓名
SELECT last_name FROM employees WHERE last_name LIKE '__a%';10.選擇姓名中有字母a和e的員工姓名
SELECT last_name FROM employees WHERE last_name LIKE '%a%e%' OR last_name LIKE '%e%a%';第2節(jié) 多表查詢-1
【題目】 # 1.顯示所有員工的姓名,部門號和部門名稱。# 2.查詢90號部門員工的job_id和90號部門的location_id# 3.選擇所有有獎金的員工的 last_name , department_name , location_id , city# 4.選擇city在Toronto工作的員工的 last_name , job_id , department_id , department_name # 5.選擇指定員工的姓名,員工號,以及他的管理者的姓名和員工號,結(jié)果類似于下面的格式 employees Emp# manager Mgr# kochhar 101 king 1001.顯示所有員工的姓名,部門號和部門名稱。
SELECT last_name, e.department_id, department_name FROM employees e LEFT OUTER JOIN departments d ON e.`department_id` = d.`department_id`;2.查詢90號部門員工的job_id和90號部門的location_id
SELECT job_id, location_id FROM employees e, departments d WHERE e.`department_id` = d.`department_id` AND e.`department_id` = 90;或
SELECT job_id, location_id FROM employees e JOIN departments d ON e.`department_id` = d.`department_id` WHERE e.`department_id` = 90;3.選擇所有有獎金的員工的 last_name , department_name , location_id , city
SELECT last_name , department_name , d.location_id , city FROM employees e LEFT OUTER JOIN departments d ON e.`department_id` = d.`department_id` LEFT OUTER JOIN locations l ON d.`location_id` = l.`location_id` WHERE commission_pct IS NOT NULL;4.選擇city在Toronto工作的員工的 last_name , job_id , department_id , department_name
SELECT last_name , job_id , e.department_id , department_name FROM employees e, departments d, locations l WHERE e.`department_id` = d.`department_id` AND d.`location_id` = l.`location_id` AND city = 'Toronto';或
SELECT last_name , job_id , e.department_id , department_name FROM employees e JOIN departments d ON e.`department_id` = d.`department_id` JOIN locations l ON l.`location_id` = d.`location_id` WHERE l.`city` = 'Toronto';5.選擇指定員工的姓名,員工號,以及他的管理者的姓名和員工號,結(jié)果類似于下面的格式
employees Emp# manager Mgr#
kochhar 101 king 100
第2節(jié) 多表查詢-2
儲備:建表操作: CREATE TABLE `t_dept` (`id` INT(11) NOT NULL AUTO_INCREMENT,`deptName` VARCHAR(30) DEFAULT NULL,`address` VARCHAR(40) DEFAULT NULL,PRIMARY KEY (`id`) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;CREATE TABLE `t_emp` (`id` INT(11) NOT NULL AUTO_INCREMENT,`name` VARCHAR(20) DEFAULT NULL,`age` INT(3) DEFAULT NULL,`deptId` INT(11) DEFAULT NULL, empno int not null,PRIMARY KEY (`id`),KEY `idx_dept_id` (`deptId`)#CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REFERENCES `t_dept` (`id`) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;INSERT INTO t_dept(deptName,address) VALUES('華山','華山'); INSERT INTO t_dept(deptName,address) VALUES('丐幫','洛陽'); INSERT INTO t_dept(deptName,address) VALUES('峨眉','峨眉山'); INSERT INTO t_dept(deptName,address) VALUES('武當','武當山'); INSERT INTO t_dept(deptName,address) VALUES('明教','光明頂'); INSERT INTO t_dept(deptName,address) VALUES('少林','少林寺'); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('風清揚',90,1,100001); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('岳不群',50,1,100002); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('令狐沖',24,1,100003); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('洪七公',70,2,100004); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('喬峰',35,2,100005); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('滅絕師太',70,3,100006); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('周芷若',20,3,100007); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('張三豐',100,4,100008); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('張無忌',25,5,100009); INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('韋小寶',18,null,100010);【題目】 #1.所有有門派的人員信息 ( A、B兩表共有)#2.列出所有用戶,并顯示其機構(gòu)信息 (A的全集)#3.列出所有門派 (B的全集)#4.所有不入門派的人員 (A的獨有)#5.所有沒人入的門派 (B的獨有)#6.列出所有人員和機構(gòu)的對照關(guān)系 (AB全有) #MySQL Full Join的實現(xiàn) 因為MySQL不支持FULL JOIN,下面是替代方法 #left join + union(可去除重復數(shù)據(jù))+ right join#7.列出所有沒入派的人員和沒人入的門派 (A的獨有+B的獨有)1. 所有有門派的人員信息
( A、B兩表共有)
select * from t_emp a inner join t_dept b on a.deptId = b.id;2. 列出所有用戶,并顯示其機構(gòu)信息
(A的全集)
select * from t_emp a left join t_dept b on a.deptId = b.id;3. 列出所有門派
(B的全集)
select * from t_dept b;4. 所有不入門派的人員
(A的獨有)
select * from t_emp a left join t_dept b on a.deptId = b.id where b.id is null;5. 所有沒人入的門派
(B的獨有)
select * from t_dept b left join t_emp a on a.deptId = b.id where a.deptId is null;6. 列出所有人員和機構(gòu)的對照關(guān)系
(AB全有)
#MySQL Full Join的實現(xiàn) 因為MySQL不支持FULL JOIN,下面是替代方法 #left join + union(可去除重復數(shù)據(jù))+ right joinSELECT * FROM t_emp A LEFT JOIN t_dept B ON A.deptId = B.id UNION SELECT * FROM t_emp A RIGHT JOIN t_dept B ON A.deptId = B.id7. 列出所有沒入派的人員和沒人入的門派
(A的獨有+B的獨有)
SELECT * FROM t_emp A LEFT JOIN t_dept B ON A.deptId = B.id WHERE B.`id` IS NULL UNION SELECT * FROM t_emp A RIGHT JOIN t_dept B ON A.deptId = B.id WHERE A.`deptId` IS NULL;第3節(jié) 單行函數(shù)
【題目】 # 1.顯示系統(tǒng)時間(注:日期+時間)# 2.查詢員工號,姓名,工資,以及工資提高百分之20%后的結(jié)果(new salary)# 3.將員工的姓名按首字母排序,并寫出姓名的長度(length)# 4.查詢員工id,last_name,salary,并作為一個列輸出,別名為OUT_PUT# 5.做一個查詢,產(chǎn)生下面的結(jié)果 <last_name> earns <salary> monthly but wants <salary*3> Dream SalaryKing earns 24000 monthly but wants 72000# 6.使用case-when,按照下面的條件: job grade AD_PRES A ST_MAN B IT_PROG C SA_REP D ST_CLERK E產(chǎn)生下面的結(jié)果 Last_name Job_id Grade king AD_PRES A1.顯示系統(tǒng)時間(注:日期+時間)
SELECT NOW() FROM DUAL;2.查詢員工號,姓名,工資,以及工資提高百分之20%后的結(jié)果(new salary)
SELECT employee_id, last_name, salary, salary * 1.2 "new salary" FROM employees;3.將員工的姓名按首字母排序,并寫出姓名的長度(length)
SELECT last_name, LENGTH(last_name) FROM employees ORDER BY last_name DESC;4.查詢員工id,last_name,salary,并作為一個列輸出,別名為OUT_PUT
SELECT CONCAT(employee_id, ',' , last_name , ',', salary) OUT_PUT FROM employees;5.做一個查詢,產(chǎn)生下面的結(jié)果
– <last_name> earns <salary> monthly but wants <salary*3>
– Dream Salary
– King earns 24000 monthly but wants 72000
6.使用case-when,按照下面的條件:
– job grade
– AD_PRES A
– ST_MAN B
– IT_PROG C
– SA_REP D
– ST_CLERK E
– 產(chǎn)生下面的結(jié)果
– Last_name Job_id Grade
– king AD_PRES A
第4節(jié) 分組函數(shù)
【題目】 #1.where子句可否使用組函數(shù)進行過濾? #2.查詢公司員工工資的最大值,最小值,平均值,總和#3.查詢各job_id的員工工資的最大值,最小值,平均值,總和#4.選擇具有各個job_id的員工人數(shù)# 5.查詢員工最高工資和最低工資的差距(DIFFERENCE)# 6.查詢各個管理者手下員工的最低工資,其中最低工資不能低于6000,沒有管理者的員工不計算在內(nèi)# 7.查詢所有部門的名字,location_id,員工數(shù)量和工資平均值#1.where子句可否使用組函數(shù)進行過濾?
No!#2.查詢公司員工工資的最大值,最小值,平均值,總和
SELECT MAX(salary), MIN(salary), AVG(salary), SUM(salary) FROM employees;#3.查詢各job_id的員工工資的最大值,最小值,平均值,總和
SELECT job_id, MAX(salary), MIN(salary), AVG(salary), SUM(salary) FROM employees GROUP BY job_id;#4.選擇具有各個job_id的員工人數(shù)
SELECT job_id, COUNT(*) FROM employees GROUP BY job_id;5.查詢員工最高工資和最低工資的差距(DIFFERENCE)
SELECT MAX(salary), MIN(salary), MAX(salary) - MIN(salary) DIFFERENCE FROM employees;6.查詢各個管理者手下員工的最低工資,其中最低工資不能低于6000,沒有管理者的員工不計算在內(nèi)
#select min(salary) #from employees #group by manager_id #having min(salary) > 6000 #and manager_id is not null;SELECT manager_id, MIN(salary) FROM employees WHERE manager_id IS NOT NULL GROUP BY manager_id HAVING MIN(salary) > 6000;7.查詢所有部門的名字,location_id,員工數(shù)量和工資平均值
SELECT department_name, location_id, COUNT(employee_id), AVG(salary) FROM employees e RIGHT JOIN departments d ON e.`department_id` = d.`department_id` GROUP BY department_name, location_id;第5節(jié) 子查詢
【題目】 #1.查詢和Zlotkey相同部門的員工姓名和工資#2.查詢工資比公司平均工資高的員工的員工號,姓名和工資。#3.查詢各部門中工資比本部門平均工資高的員工的員工號, 姓名和工資(難)#4.查詢和姓名中包含字母u的員工在相同部門的員工的員工號和姓名#5.查詢在部門的location_id為1700的部門工作的員工的員工號#6.查詢管理者是King的員工姓名和工資#7.查詢工資最低的員工信息: last_name, salary#8.查詢平均工資最低的部門信息#9.查詢平均工資最低的部門信息和該部門的平均工資(難)#10.查詢平均工資最高的 job 信息#11.查詢平均工資高于公司平均工資的部門有哪些?#12.查詢出公司中所有 manager 的詳細信息.#13.各個部門中 最高工資中最低的那個部門的 最低工資是多少?#14.查詢平均工資最高的部門的 manager 的詳細信息: last_name, department_id, email, salary1.查詢和Zlotkey相同部門的員工姓名和工資
SELECT last_name, salary FROM employees WHERE department_id = (SELECT department_idFROM employeesWHERE last_name = 'Zlotkey' )2.查詢工資比公司平均工資高的員工的員工號,姓名和工資
SELECT employee_id, last_name, salary FROM employees WHERE salary > (SELECT AVG(salary)FROM employees )3.查詢各部門中工資比本部門平均工資高的員工的員工號, 姓名和工資(難)
方式一:相關(guān)子查詢
SELECT employee_id,last_name,salary FROM employees e1 WHERE salary > (# 查詢某員工所在部門的平均SELECT AVG(salary)FROM employees e2WHERE e2.department_id = e1.`department_id`);方式二:
SELECT employee_id,last_name,salary FROM employees e1, (SELECT department_id,AVG(salary) avg_sal FROM employees e2 GROUP BY department_id ) dept_avg_sal WHERE e1.`department_id` = dept_avg_sal.department_id AND e1.`salary` > dept_avg_sal.avg_sal;4.查詢和姓名中包含字母u的員工在相同部門的員工的員工號和姓名
SELECT employee_id, last_name FROM employees WHERE department_id = ANY(SELECT DISTINCT department_idFROM employeesWHERE last_name LIKE '%u%' )5.查詢在部門的location_id為1700的部門工作的員工的員工號
SELECT employee_id FROM employees WHERE department_id IN (SELECT department_idFROM departmentsWHERE location_id = 1700 )6.查詢管理者是King的員工姓名和工資
SELECT last_name, salary FROM employees WHERE manager_id IN (SELECT employee_idFROM employeesWHERE last_name = 'King' )7. 查詢工資最低的員工信息: last_name, salary
SELECT last_name,salary FROM employees WHERE salary = (SELECT MIN(salary)FROM employees);8. 查詢平均工資最低的部門信息
#方式一:
SELECT * FROM departments WHERE department_id = (SELECT department_idFROM employeesGROUP BY department_idHAVING AVG(salary) = (SELECT MIN(dept_avgsal)FROM (SELECT AVG(salary) dept_avgsalFROM employeesGROUP BY department_id) avg_sal));#方式二:
SELECT * FROM departments WHERE department_id = (SELECT department_idFROM employeesGROUP BY department_idHAVING AVG(salary) <= ALL(SELECT AVG(salary) avg_salFROM employeesGROUP BY department_id));#方式三:
SELECT * FROM departments WHERE department_id = (SELECT department_idFROM employeesGROUP BY department_idHAVING AVG(salary) = (SELECT AVG(salary) avg_salFROM employeesGROUP BY department_idORDER BY avg_salLIMIT 0,1) )#方式四:
SELECT d.* FROM departments d,(SELECT department_id,AVG(salary) avg_salFROM employeesGROUP BY department_idORDER BY avg_salLIMIT 0,1) dept_avg_sal WHERE d.department_id = dept_avg_sal.department_id9.查詢平均工資最低的部門信息和該部門的平均工資(難)
#方式一:
SELECT d.*,(SELECT AVG(salary) FROM employees WHERE department_id = d.department_id) avg_sal FROM departments d WHERE department_id = (SELECT department_idFROM employeesGROUP BY department_idHAVING AVG(salary) = (SELECT MIN(dept_avgsal)FROM (SELECT AVG(salary) dept_avgsalFROM employeesGROUP BY department_id) avg_sal));#方式二:
SELECT d.*,(SELECT AVG(salary) FROM employees WHERE department_id = d.`department_id`) avg_sal FROM departments d WHERE department_id = (SELECT department_idFROM employeesGROUP BY department_idHAVING AVG(salary) <= ALL(SELECT AVG(salary) avg_salFROM employeesGROUP BY department_id));#方式三:
SELECT d.*,(SELECT AVG(salary) FROM employees WHERE department_id = d.department_id) avg_sal FROM departments d WHERE department_id = (SELECT department_idFROM employeesGROUP BY department_idHAVING AVG(salary) = (SELECT AVG(salary) avg_salFROM employeesGROUP BY department_idORDER BY avg_salLIMIT 0,1) )#方式四:
SELECT d.*,dept_avg_sal.avg_sal FROM departments d,(SELECT department_id,AVG(salary) avg_salFROM employeesGROUP BY department_idORDER BY avg_salLIMIT 0,1) dept_avg_sal WHERE d.department_id = dept_avg_sal.department_id10. 查詢平均工資最高的 job 信息
#方式一:
SELECT * FROM jobs WHERE job_id = (SELECT job_idFROM employeesGROUP BY job_id HAVING AVG(salary) = (SELECT MAX(avg_sal)FROM(SELECT AVG(salary) avg_salFROM employeesGROUP BY job_id) job_avgsal));#方式二:
SELECT * FROM jobs WHERE job_id = (SELECT job_idFROM employeesGROUP BY job_idHAVING AVG(salary) >= ALL(SELECT AVG(salary) FROM employeesGROUP BY job_id));#方式三:
SELECT * FROM jobs WHERE job_id = (SELECT job_idFROM employeesGROUP BY job_idHAVING AVG(salary) = (SELECT AVG(salary) avg_salFROM employeesGROUP BY job_idORDER BY avg_sal DESCLIMIT 0,1));#方式四:
SELECT j.* FROM jobs j,(SELECT job_id,AVG(salary) avg_salFROM employeesGROUP BY job_idORDER BY avg_sal DESCLIMIT 0,1 ) job_avg_sal WHERE j.job_id = job_avg_sal.job_id11. 查詢平均工資高于公司平均工資的部門有哪些?
SELECT department_id FROM employees WHERE department_id IS NOT NULL GROUP BY department_id HAVING AVG(salary) > (SELECT AVG(salary)FROM employees);12. 查詢出公司中所有 manager 的詳細信息.
#方式1:
SELECT employee_id,last_name,salary FROM employees WHERE employee_id IN (SELECT DISTINCT manager_idFROM employees);#方式2:
SELECT DISTINCT e1.employee_id, e1.last_name, e1.salary FROM employees e1 JOIN employees e2 WHERE e1.employee_id = e2.manager_id;#方式3:
SELECT employee_id, last_name, salary FROM employees e1 WHERE EXISTS ( SELECT 'X'FROM employees e2WHERE e2.manager_id = e1.employee_id);13. 各個部門中 最高工資中最低的那個部門的 最低工資是多少?
#方式一
SELECT MIN(salary) FROM employees WHERE department_id = (SELECT department_idFROM employeesGROUP BY department_idHAVING MAX(salary) = (SELECT MIN(max_sal)FROM (SELECT MAX(salary) max_salFROM employeesGROUP BY department_id) dept_max_sal));SELECT * FROM employees WHERE department_id = 10;#方式二
SELECT MIN(salary) FROM employees WHERE department_id = (SELECT department_idFROM employeesGROUP BY department_idHAVING MAX(salary) <= ALL( SELECT MAX(salary) max_salFROM employeesGROUP BY department_id));#方式三:
SELECT MIN(salary) FROM employees WHERE department_id = (SELECT department_idFROM employeesGROUP BY department_idHAVING MAX(salary) = (SELECT MAX(salary) max_salFROM employeesGROUP BY department_idORDER BY max_salLIMIT 0,1))#方式四:
SELECT employee_id,MIN(salary) FROM employees e, (SELECT department_id,MAX(salary) max_sal FROM employees GROUP BY department_id ORDER BY max_sal LIMIT 0,1) dept_max_sal WHERE e.department_id = dept_max_sal.department_id14. 查詢平均工資最高的部門的 manager 的詳細信息: last_name, department_id, email, salary
方式一:
SELECT employee_id,last_name, department_id, email, salary FROM employees WHERE employee_id IN (SELECT DISTINCT manager_idFROM employeesWHERE department_id = (SELECT department_idFROM employeesGROUP BY department_idHAVING AVG(salary) = (SELECT MAX(avg_sal)FROM(SELECT AVG(salary) avg_salFROM employeesGROUP BY department_id) dept_sal)));方式二:
SELECT employee_id,last_name, department_id, email, salary FROM employees WHERE employee_id IN (SELECT DISTINCT manager_idFROM employeesWHERE department_id = (SELECT department_idFROM employees eGROUP BY department_idHAVING AVG(salary)>=ALL(SELECT AVG(salary)FROM employeesGROUP BY department_id)));#方式三:
SELECT * FROM employees WHERE employee_id IN (SELECT DISTINCT manager_idFROM employees e,(SELECT department_id,AVG(salary) avg_salFROM employeesGROUP BY department_idORDER BY avg_sal DESCLIMIT 0,1) dept_avg_salWHERE e.department_id = dept_avg_sal.department_id)#總結(jié):
分類:相關(guān)子查詢 (第3題) vs 非相關(guān)子查詢格式上:子查詢比較靈活。可以出現(xiàn)在where、from、select、order by ...書寫技巧上: ①從外向里寫 ②從里向外寫第6節(jié) 創(chuàng)建和管理表
1. books表相關(guān)操作
案例:
1、創(chuàng)建數(shù)據(jù)庫test01_library
2、創(chuàng)建表格books
| b_id | 書編號 | int(11) | 否 | 是 |
| b_name | 書名 | varchar(50) | 否 | 否 |
| authors | 作者 | varchar(100) | 否 | 否 |
| price | 價格 | float | 否 | 否 |
| pubdate | 出版日期 | year | 否 | 否 |
| note | 說明 | varchar(100) | 是 | 否 |
| num | 庫存 | int(11) | 否 | 否 |
3、向books表中插入記錄
1) 指定所有字段名稱插入第一條記錄
2)不指定字段名稱插入第二記錄
3)同時插入多條記錄(剩下的所有記錄)
| 1 | Tal of AAA | Dickes | 23 | 1995 | novel | 11 |
| 2 | EmmaT | Jane lura | 35 | 1993 | joke | 22 |
| 3 | Story of Jane | Jane Tim | 40 | 2001 | novel | 0 |
| 4 | Lovey Day | George Byron | 20 | 2005 | novel | 30 |
| 5 | Old land | Honore Blade | 30 | 2010 | law | 0 |
| 6 | The Battle | Upton Sara | 30 | 1999 | medicine | 40 |
| 7 | Rose Hood | Richard haggard | 28 | 2008 | cartoon | 28 |
4、將小說類型(novel)的書的價格都增加5。
5、將名稱為EmmaT的書的價格改為40。
6、刪除庫存為0的記錄
#創(chuàng)建數(shù)據(jù)庫test01_library CREATE DATABASE test01_library;#指定使用哪個數(shù)據(jù)庫 USE test01_library;#創(chuàng)建表格books CREATE TABLE books(b_id INT,b_name VARCHAR(50),`authors` VARCHAR(100),price FLOAT,pubdate YEAR,note VARCHAR(100),num INT );#指定所有字段名稱插入第一條記錄 INSERT INTO books (b_id,b_name,`authors`,price,pubdate,note,num) VALUES(1,'Tal of AAA','Dickes',23,1995,'novel',11);#不指定字段名稱插入第二記錄 INSERT INTO books VALUE(2,'EmmaT','Jane lura',35,1993,'Joke',22);#同時插入多條記錄(剩下的所有記錄)。 INSERT INTO books VALUES (3,'Story of Jane','Jane Tim',40,2001,'novel',0), (4,'Lovey Day','George Byron',20,2005,'novel',30), (5,'Old land','Honore Blade',30,2010,'Law',0), (6,'The Battle','Upton Sara',30,1999,'medicine',40), (7,'Rose Hood','Richard haggard',28,2008,'cartoon',28);#將小說類型(novel)的書的價格都增加5。 UPDATE books SET price=price+5 WHERE note = 'novel';#將名稱為EmmaT的書的價格改為40。 UPDATE books SET price=40 WHERE b_name='EmmaT';#刪除庫存為0的記錄 DELETE FROM books WHERE num=0;2. customers表相關(guān)操作
1、創(chuàng)建數(shù)據(jù)庫test02_market
2、創(chuàng)建表格customers
| c_num | int(11) |
| c_name | varchar(50) |
| c_contact | varchar(50) |
| c_city | varchar(50) |
| c_birth | date |
**要求3:**將c_contact字段移動到c_birth字段后面
**要求4:**將c_name字段數(shù)據(jù)類型改為 varchar(70)
**要求5:**將c_contact字段改名為c_phone
**要求6:**增加c_gender字段到c_name后面,數(shù)據(jù)類型為char(1)
**要求7:**將表名改為customers_info
**要求8:**刪除字段c_city
#1、創(chuàng)建數(shù)據(jù)庫Market,進入進行操作 CREATE DATABASE test02_market;#指定對哪個數(shù)據(jù)庫進行操作 USE test02_market;#2、創(chuàng)建數(shù)據(jù)表 customers, CREATE TABLE customers(c_num INT ,c_name VARCHAR(50),c_contact VARCHAR(50),c_city VARCHAR(50),c_birth DATE );#3、將c_contact字段插入到c_birth字段后面 ALTER TABLE customers MODIFY c_contact VARCHAR(50) AFTER c_birth;#4、將c_name字段數(shù)據(jù)類型改為 varchar(70). ALTER TABLE customers MODIFY c_name VARCHAR(70);#5、將c_contact字段改名為c_phone. ALTER TABLE customers CHANGE c_contact c_phone VARCHAR(50);#6、增加c_gender字段,數(shù)據(jù)類型為char(1) ALTER TABLE customers ADD c_gender CHAR(1) AFTER c_name; #默認在最后一列 #加first,加在第一列 #如果要指定在哪列后面,加after 那列的名稱#7、將表名改為customers_info ALTER TABLE customers RENAME customers_info;#8、刪除字段c_city ALTER TABLE customers_info DROP c_city ;3. offices表相關(guān)操作
1、創(chuàng)建數(shù)據(jù)庫company
2、創(chuàng)建表格offices
| officeCode | int |
| city | varchar(30) |
| address | varchar(50) |
| country | varchar(50) |
| postalCode | varchar(25) |
3、創(chuàng)建表格employees
| empNum | int(11) |
| lastName | varchar(50) |
| firstName | varchar(50) |
| mobile | varchar(25) |
| code | int |
| jobTitle | varchar(50) |
| birth | date |
| Note | varchar(255) |
| Sex | varchar(5) |
**要求4:**將表employees的mobile字段修改到code字段后面。
**要求5:**將表employees的birth字段改名為birthday;
**要求6:**修改sex字段,數(shù)據(jù)類型為char(1)。
**要求7:**刪除字段note;
**要求8:**增加字段名favoriate_activity,數(shù)據(jù)類型為varchar(100);
**要求9:**將表employees的名稱修改為 employees_info
#創(chuàng)建數(shù)據(jù)庫test03_company CREATE DATABASE test03_company;#指定使用哪個數(shù)據(jù)庫,即下面的sql語句是針對哪個數(shù)據(jù)庫的 USE test03_company;CREATE TABLE offices(officeCode INT,city VARCHAR(30),address VARCHAR(50),country VARCHAR(50) ,postalcode VARCHAR(25) ); CREATE TABLE employees(empNum INT(11),lastName VARCHAR(50),firstName VARCHAR(50),mobile VARCHAR(25),`code` INT ,jobtitle VARCHAR(50),birth DATE,note VARCHAR(255),sex VARCHAR(5) );#4、將表employees的mobile字段修改到code字段后面。 ALTER TABLE employees MODIFY mobile VARCHAR(25)AFTER CODE;#5、將表employees的birth字段改名為birthday; ALTER TABLE employees CHANGE birth birthday DATE NOT NULL;#6、修改sex字段,數(shù)據(jù)類型為char(1) ALTER TABLE employees MODIFY sex CHAR(1) ;#7、刪除字段note; ALTER TABLE employees DROP note;#8、增加字段名favoriate_activity,數(shù)據(jù)類型為varchar(100); ALTER TABLE employees ADD COLUMN favoriate_activity VARCHAR(100);#9、將表employees的名稱修改為 employees_info ALTER TABLE employees RENAME employees_info;第7節(jié) 數(shù)據(jù)處理之增刪改
1. employee表相關(guān)操作
1、創(chuàng)建數(shù)據(jù)庫test01db
2、創(chuàng)建表格employee,并添加記錄
| 10001 | 張一一 | 男 | 13456789000 | 廣東韶關(guān) | 1001.58 |
| 10002 | 劉小紅 | 女 | 13454319000 | 廣東江門 | 1201.21 |
| 10003 | 李四 | 男 | 0751-1234567 | 廣東佛山 | 1004.11 |
| 10004 | 劉小強 | 男 | 0755-5555555 | 廣東深圳 | 1501.23 |
| 10005 | 王艷 | 女 | 020-1232133 | 廣東廣州 | 1405.16 |
**要求3:**查詢出薪資在1200~1300之間的員工信息。
**要求4:**查詢出姓“劉”的員工的工號,姓名,家庭住址。
**要求5:**將“李四”的家庭住址改為“廣東韶關(guān)”
**要求6:**查詢出名字中帶“小”的員工
-- 創(chuàng)建數(shù)據(jù)庫test01db CREATE DATABASE test01db;-- 使用test01db數(shù)據(jù)庫 USE test01db;#創(chuàng)建employee表 CREATE TABLE employee(id INT,`name` VARCHAR(20),sex VARCHAR(20),tel VARCHAR(20),addr VARCHAR(50),salary FLOAT );#添加信息 INSERT INTO employee(id,`name`,sex,tel,addr,salary)VALUES (10001,'張一一','男','13456789000','廣東韶關(guān)',1001.58), (10002,'劉小紅','女','13454319000','廣東江門',1201.21), (10003,'李四','男','0751-1234567','廣東佛山',1004.11), (10004,'劉小強','男','0755-5555555','廣東深圳',1501.23), (10005,'王艷','男','020-1232133','廣東廣州',1405.16);#要求3:查詢出薪資在1200~1300之間信息。 SELECT * FROM employee WHERE salary BETWEEN 1200 AND 1300;#要求4:查詢出姓“劉”的員工的工號,姓名,家庭住址。 SELECT id,addr FROM employee WHERE `name` LIKE '劉%';#要求5:將“李四”的家庭住址改為“廣東韶關(guān)” UPDATE employee SET addr='廣東韶關(guān)' WHERE `name`='李四';#要求6:查詢出名字中帶“小”的員工。 SELECT * FROM employee WHERE `name` LIKE '%小%';2.pet表相關(guān)操作
1、創(chuàng)建數(shù)據(jù)庫test02db
2、創(chuàng)建表格pet
| name | 寵物名稱 | varchar(20) |
| owner | 寵物主人 | varchar(20) |
| species | 種類 | varchar(20) |
| sex | 性別 | char(1) |
| birth | 出生日期 | year |
| death | 死亡日期 | year |
3、添加記錄
| Fluffy | harold | Cat | f | 2003 | 2010 |
| Claws | gwen | Cat | m | 2004 | |
| Buffy | Dog | f | 2009 | ||
| Fang | benny | Dog | m | 2000 | |
| bowser | diane | Dog | m | 2003 | 2009 |
| Chirpy | Bird | f | 2008 |
4、 添加字段主人的生日owner_birth。
5、 將名稱為Claws的貓的主人改為kevin
6、 將沒有死的狗的主人改為duck
7、 查詢沒有主人的寵物的名字;
8、 查詢已經(jīng)死了的cat的姓名,主人,以及去世時間;
9、 刪除已經(jīng)死亡的狗
10、查詢所有寵物信息
-- 創(chuàng)建數(shù)據(jù)庫test02db CREATE DATABASE test02db;-- 指定使用哪個數(shù)據(jù)庫 USE test02db;-- 在market中創(chuàng)建數(shù)據(jù)表customers, CREATE TABLE pet(`name` VARCHAR(20),`owner` VARCHAR(20),species VARCHAR(20),sex CHAR(1),birth YEAR,death YEAR ); -- 3、添加數(shù)據(jù) INSERT INTO pet VALUES('Fluffy','harold','Cat','f','2013','2010'); INSERT INTO pet(`name`,`owner`,species,sex,Birth) VALUES('Claws','gwen','Cat','m','2014'); INSERT INTO pet(`name`,species,sex,Birth) VALUES('Buffy','Dog','f','2009'); INSERT INTO pet(`name`,`owner`,species,sex,Birth) VALUES('Fang','benny','Dog','m','2000'); INSERT INTO pet VALUES('bowser','diane','Dog','m','2003','2009'); INSERT INTO pet(`name`,species,sex,birth) VALUES('Chirpy','Bird','f','2008');#4、添加字段主人的生日owner_birth。 ALTER TABLE pet ADD COLUMN owner_birth DATE;#5、將名稱為Claws的貓的主人改為kevin UPDATE pet SET `owner`='kevin' WHERE `name`='Claws' AND species='Cat';#6、將沒有死的狗的主人改為duck UPDATE pet SET `owner`='duck' WHERE species='Dog' AND death IS NULL;#7、查詢沒有主人的寵物的名字; SELECT `name` FROM pet WHERE `owner` IS NULL;#8、查詢已經(jīng)死了的cat的姓名,主人,以及去世時間; SELECT `name`,`owner`,death FROM pet WHERE death IS NOT NULL;#9、刪除已經(jīng)死亡的狗 DELETE FROM pet WHERE death IS NOT NULL;#10、查詢所有寵物信息 SELECT * FROM pet;第8節(jié) 約束
1. books表相關(guān)操作
案例:
1、創(chuàng)建數(shù)據(jù)庫test_library
2、創(chuàng)建表格books
| b_id | 書編號 | int(11) |
| b_name | 書名 | varchar(50) |
| authors | 作者 | varchar(100) |
| price | 價格 | float |
| pubdate | 出版日期 | year |
| note | 說明 | varchar(100) |
| num | 庫存 | int(11) |
3、使用alter語句給books按如下要求增加相應的約束
| b_id | 書編號 | int(11) | 是 | 否 | 是 | 是 | 是 |
| b_name | 書名 | varchar(50) | 否 | 否 | 是 | 否 | 否 |
| authors | 作者 | varchar(100) | 否 | 否 | 是 | 否 | 否 |
| price | 價格 | float | 否 | 否 | 是 | 否 | 否 |
| pubdate | 出版日期 | year | 否 | 否 | 是 | 否 | 否 |
| note | 說明 | varchar(100) | 否 | 否 | 否 | 否 | 否 |
| num | 庫存 | int(11) | 否 | 否 | 是 | 否 | 否 |
4、向books表中插入記錄
1) 指定所有字段名稱插入第一條記錄
2)不指定字段名稱插入第二記錄
3)同時插入多條記錄(剩下的所有記錄)
| 1 | Tal of AAA | Dickes | 23 | 1995 | novel | 11 |
| 2 | EmmaT | Jane lura | 35 | 1993 | joke | 22 |
| 3 | Story of Jane | Jane Tim | 40 | 2001 | novel | 0 |
| 4 | Lovey Day | George Byron | 20 | 2005 | novel | 30 |
| 5 | Old land | Honore Blade | 30 | 2010 | law | 0 |
| 6 | The Battle | Upton Sara | 30 | 1999 | medicine | 40 |
| 7 | Rose Hood | Richard haggard | 28 | 2008 | cartoon | 28 |
5、統(tǒng)計書名中包含a字母的書
6、統(tǒng)計書名中包含a字母的書的數(shù)量和庫存總量
7、找出“novel”類型的書,按照價格降序排列
8、查詢圖書信息,按照庫存量降序排列,如果庫存量相同的按照note升序排列
9、按照note分類統(tǒng)計書的數(shù)量
10、按照note分類統(tǒng)計書的庫存量,顯示庫存量超過30本的
11、查詢所有圖書,每頁顯示5本,顯示第二頁
12、按照note分類統(tǒng)計書的庫存量,現(xiàn)在庫存量最多的
13、查詢書名達到10個字符的書,不包括里面的空格
14、查詢書名和類型,其中
? note值為novel顯示小說,law顯示法律,medicine顯示醫(yī)藥,cartoon顯示卡通,joke顯示笑話
15、查詢書名、庫存,其中
? num值超過30本的,顯示滯銷,大于0并低于10的,顯示暢銷,為0的顯示需要無貨
16、統(tǒng)計每一種note的庫存量,并合計總量
17、統(tǒng)計每一種note的數(shù)量,并合計總量
18、統(tǒng)計庫存量前三名的圖書
19、找出最早出版的一本書
20、找出novel中最高的一本書
21、找出書名中字數(shù)最多的一本書,不含空格
#創(chuàng)建數(shù)據(jù)庫test_library CREATE DATABASE test_library;#使用test_library USE test_library;#創(chuàng)建表格books CREATE TABLE books(b_id INT,b_name VARCHAR(50),`authors` VARCHAR(100),price FLOAT,pubdate YEAR,note VARCHAR(100),num INT );#給b_id增加主鍵約束 ALTER TABLE books ADD PRIMARY KEY(b_id);#給b_id字段增加自增約束 ALTER TABLE books MODIFY b_id INT AUTO_INCREMENT;#給b_name等字段增加非空約束 ALTER TABLE books b_name VARCHAR(50) NOT NULL; ALTER TABLE books `authors` VARCHAR(100) NOT NULL; ALTER TABLE books price FLOAT NOT NULL; ALTER TABLE books pubdate DATE NOT NULL; ALTER TABLE books num INT NOT NULL;#指定所有字段名稱插入第一條記錄 INSERT INTO books (b_id,b_name,`authors`,price,pubdate,note,num) VALUES(1,'Tal of AAA','Dickes',23,1995,'novel',11);#不指定字段名稱插入第二記錄 INSERT INTO books VALUE(2,'EmmaT','Jane lura',35,1993,'Joke',22);#同時插入多條記錄(剩下的所有記錄)。 INSERT INTO books VALUES (3,'Story of Jane','Jane Tim',40,2001,'novel',0), (4,'Lovey Day','George Byron',20,2005,'novel',30), (5,'Old land','Honore Blade',30,2010,'Law',0), (6,'The Battle','Upton Sara',30,1999,'medicine',40), (7,'Rose Hood','Richard haggard',28,2008,'cartoon',28);#查詢書名中包含a字母的書 SELECT * FROM books WHERE b_name LIKE '%a%';#統(tǒng)計書名中包含a字母的書的數(shù)量和庫存總量 SELECT COUNT(*),SUM(num) FROM books WHERE b_name LIKE '%a%';#找出“novel”類型的書,按照價格降序排列 SELECT * FROM books WHERE note = 'novel' ORDER BY price DESC;#查詢圖書信息,按照庫存量降序排列,如果庫存量相同的按照note升序排列 SELECT * FROM books ORDER BY num DESC,note ASC;#按照note分類統(tǒng)計書的數(shù)量 SELECT note,COUNT(*) FROM books GROUP BY note;#按照note分類統(tǒng)計書的庫存量,顯示庫存量超過30本的 SELECT note,SUM(num) FROM books GROUP BY note HAVING SUM(num)>30;#查詢所有圖書,每頁顯示5本,顯示第二頁 SELECT * FROM books LIMIT 5,5;#按照note分類統(tǒng)計書的庫存量,現(xiàn)在庫存量最多的 SELECT note,SUM(num) FROM books GROUP BY note ORDER BY SUM(num) DESC LIMIT 0,1;#查詢書名達到10個字符的書,不包括里面的空格 SELECT * FROM books WHERE CHAR_LENGTH(REPLACE(b_name,' ',''))>=10;/* 查詢書名和類型,其中 ?note值為novel顯示小說,law顯示法律,medicine顯示醫(yī)藥,cartoon顯示卡通,joke顯示笑話 */ SELECT b_name AS "書名" ,note, CASE note WHEN 'novel' THEN '小說'WHEN 'law' THEN '法律'WHEN 'medicine' THEN '醫(yī)藥'WHEN 'cartoon' THEN '卡通'WHEN 'joke' THEN '笑話'END AS "類型" FROM books;/* 查詢書名、庫存,其中 num值超過30本的,顯示滯銷,大于0并低于10的,顯示暢銷,為0的顯示需要無貨,其他的顯示正常 */ SELECT b_name,num,CASE WHEN num>30 THEN '滯銷'WHEN num>0 AND num<10 THEN '暢銷'WHEN num=0 THEN '無貨'ELSE '正常'END AS "庫存狀態(tài)" FROM books;#統(tǒng)計每一種note的庫存量,并合計總量 SELECT IFNULL(note,'合計總庫存量') AS note,SUM(num) FROM books GROUP BY note WITH ROLLUP;#統(tǒng)計每一種note的數(shù)量,并合計總量 SELECT IFNULL(note,'合計總數(shù)') AS note,COUNT(*) FROM books GROUP BY note WITH ROLLUP;#統(tǒng)計庫存量前三名的圖書 SELECT * FROM books ORDER BY num DESC LIMIT 0,3;#找出最早出版的一本書 SELECT * FROM books ORDER BY pubdate ASC LIMIT 0,1;#找出novel中最高的一本書 SELECT * FROM books WHERE note = 'novel' ORDER BY price DESC LIMIT 0,1;#找出書名中字數(shù)最多的一本書 SELECT * FROM books ORDER BY CHAR_LENGTH(REPLACE(b_name,' ','')) DESC LIMIT 0,1;2. department等表的相關(guān)操作
1、創(chuàng)建數(shù)據(jù)庫:test_company
2、在此數(shù)據(jù)庫下創(chuàng)建如下3表,數(shù)據(jù)類型,寬度,是否為空根據(jù)實際情況自己定義。
A. 部門表(department):部門編號(depid),部門名稱(depname),部門簡介(deinfo);其中部門編號為主鍵。
B. 雇員表(emoloyee):雇員編號(empid),姓名(name),性別(sex),職稱(title),出生日期(birthday),所在部門編號(depid);其中
- ? 雇員編號為主鍵;
- ? 部門編號為外鍵,外鍵約束等級為(on update cascade 和on delete set null);
- ? 性別默認為男;
C. 工資表(salary):雇員編號(empid),基本工資(basesalary),職務工資(titlesalary),扣除(deduction)。其中雇員編號為主鍵。
3、給工資表(salary)的雇員編號(empid)增加外鍵約束,外鍵約束等級為(on update cascade 和on delete cascade)
4、添加數(shù)據(jù)如下:
部門表:
| 111 | 生產(chǎn)部 | Null |
| 222 | 銷售部 | Null |
| 333 | 人事部 | 人力資源管理 |
雇員表:
| 1001 | 張三 | 男 | 高級工程師 | 1975-1-1 | 111 |
| 1002 | 李四 | 女 | 助工 | 1985-1-1 | 111 |
| 1003 | 王五 | 男 | 工程師 | 1978-11-11 | 222 |
| 1004 | 張六 | 男 | 工程師 | 1999-1-1 | 222 |
工資表:
| 1001 | 2200 | 1100 | 200 |
| 1002 | 1200 | 200 | NULL |
| 1003 | 2900 | 700 | 200 |
| 1004 | 1950 | 700 | 150 |
5、查詢出每個雇員的雇員編號,姓名,職稱,所在部門名稱,應發(fā)工資(基本工資+職務工資),實發(fā)工資(基本工資+職務工資-扣除)。
6、查詢銷售部門的雇員姓名及其基本工資
7、查詢姓“張”且年齡小于40的員工的全部信息和年齡
8、查詢所有男員工的基本工資和職務工資
9、查詢基本工資低于2000的員工姓名和職稱、所在部門名稱
10、查詢員工總數(shù)
11、查詢部門總數(shù)
12、查詢應發(fā)工資的平均工資和最高工資、最低工資
13、按照部門統(tǒng)計應發(fā)工資的平均工資
14、找出部門基本工資的平均工資低于2000的
15、按照員工編號、姓名、基本工資、職務工資、扣除,并按照職務升序排列,如果職務工資相同,再按照基本工資升序排列
16、查詢員工編號、姓名,出生日期,及年齡段,其中
? 如果80年之前出生的,定為”老年“;80后定為”中年“,90后定為”青壯年“
17、查詢所有的員工信息,和他所在的部門名稱
18、查詢所有部門信息,和該部門的員工信息
19、查詢所有職位中含“工程師”的男員工的人數(shù)
20、查詢每個部門的男生和女生的人數(shù)和平均基本工資
#創(chuàng)建數(shù)據(jù)庫:test_company CREATE DATABASE test_company;#使用數(shù)據(jù)庫test_company USE test_company;#創(chuàng)建部門表(department) CREATE TABLE department(depid INT PRIMARY KEY,depname VARCHAR(20) NOT NULL,deinfo VARCHAR(50) );#創(chuàng)建雇員表(emoloyee) CREATE TABLE employee(empid INT PRIMARY KEY,`name` VARCHAR(20) NOT NULL,sex CHAR NOT NULL DEFAULT '男',title VARCHAR(20) NOT NULL,birthday DATE,depid INT,FOREIGN KEY(depid) REFERENCES department(depid) ON UPDATE CASCADE ON DELETE SET NULL );#創(chuàng)建工資表(salary) CREATE TABLE salary(empid INT PRIMARY KEY,basesalary DOUBLE,titlesalary DOUBLE,deduction DOUBLE );#給工資表(salary)的雇員編號(empid)增加外鍵約束,外鍵約束等級為(on update cascade 和on delete cascade) ALTER TABLE salary ADD FOREIGN KEY empid REFERENCES employee(empid) ON UPDATE CASCADE ON DELETE CASCADE;#添加部門表數(shù)據(jù) INSERT INTO department VALUES (111,'生產(chǎn)部',NULL), (222,'銷售部',NULL), (333,'人事部','人力資源管理');#添加雇員表 INSERT INTO employee VALUES (1001,'張三',DEFAULT,'高級工程師','1975-1-1',111), (1002,'李四','女','助工','1985-1-1',111), (1003,'王五','男','工程師','1978-11-11',222), (1004,'張六',DEFAULT,'工程師','1999-1-1',222);#添加工資表 INSERT INTO salary VALUES (1001,2200,1100,200), (1002,1200,200,NULL), (1003,2900,700,200), (1004,1950,700,150);/* 查詢出每個雇員的雇員編號,姓名,職稱,所在部門名稱, 應發(fā)工資(基本工資+職務工資), 實發(fā)工資(基本工資+職務工資-扣除)。 */ SELECT employee.empid,`name`,title,depname, basesalary+titlesalary AS "應發(fā)工資", basesalary+titlesalary-IFNULL(deduction,0) AS "實發(fā)工資" FROM department INNER JOIN employee INNER JOIN salary ON department.depid = employee.depid AND employee.empid = salary.empid;#查詢銷售部門的雇員姓名及其基本工資 SELECT `name`,basesalary FROM department INNER JOIN employee INNER JOIN salary ON department.depid = employee.depid AND employee.empid = salary.empid WHERE department.depname = '銷售部';#查詢姓“張”且年齡小于40的員工的全部信息和年齡 SELECT *,YEAR(CURRENT_DATE())-YEAR(birthday) AS "年齡" FROM employee WHERE `name` LIKE '張%' AND YEAR(CURRENT_DATE())-YEAR(birthday)<40;#查詢所有男員工的基本工資和職務工資 SELECT basesalary,titlesalary FROM employee INNER JOIN salary ON employee.empid = salary.empid WHERE employee.sex = '男';#查詢基本工資低于2000的員工姓名和職稱、所在部門名稱 SELECT `name`,title,depname FROM department INNER JOIN employee INNER JOIN salary ON department.depid = employee.depid AND employee.empid = salary.empid WHERE basesalary < 2000;#查詢員工總數(shù) SELECT COUNT(*) FROM employee;#查詢部門總數(shù) SELECT COUNT(*) FROM department;#查詢應發(fā)工資的平均工資和最高應發(fā)工資、最低應發(fā)工資 SELECT AVG(basesalary+titlesalary) AS "平均應發(fā)工資",MAX(basesalary+titlesalary) AS "最高應發(fā)工資",MIN(basesalary+titlesalary) AS "最低應發(fā)工資" FROM salary;#按照部門統(tǒng)計應發(fā)工資的平均工資 SELECT depid,AVG(basesalary+titlesalary) FROM employee INNER JOIN salary ON employee.`empid` = salary.`empid` GROUP BY employee.`depid`;#找出部門基本工資的平均工資低于2000的 SELECT depid,AVG(basesalary) FROM employee INNER JOIN salary ON employee.`empid` = salary.`empid` GROUP BY employee.`depid` HAVING AVG(basesalary)<2000;#按照員工編號、姓名、基本工資、職務工資、扣除, #并按照職務升序排列,如果職務工資相同,再按照基本工資升序排列 SELECT emp.empid,`name`,basesalary,titlesalary,deduction FROM employee emp INNER JOIN salary ON emp.`empid` = salary.`empid` ORDER BY emp.`title` ASC , basesalary ASC;#查詢員工編號、姓名,出生日期,及年齡段,其中 ?#如果80年之前出生的,定為”老年“;80后定為”中年“,90后定為”青壯年“ SELECT empid,`name`,birthday,CASE WHEN YEAR(birthday)<1980 THEN '老年'WHEN YEAR(birthday)<1990 THEN '中年'ELSE '青壯年' END "年齡段" FROM employee;#查詢所有的員工信息,和他所在的部門名稱 SELECT emp.*,depname FROM employee emp LEFT JOIN department dep ON emp.`depid` = dep.`depid`;#查詢所有部門信息,和該部門的員工信息 SELECT dep.*,emp.* FROM employee emp RIGHT JOIN department dep ON emp.`depid` = dep.`depid`;#查詢所有職位中含“工程師”的男員工的人數(shù) SELECT COUNT(*) FROM employee WHERE sex='男' AND title LIKE '%工程師%';#查詢每個部門的男生和女生的人數(shù)和平均基本工資 SELECT dep.depid,sex,COUNT(*),AVG(basesalary) FROM department dep INNER JOIN employee INNER JOIN salary ON dep.depid = employee.depid AND employee.empid = salary.empid GROUP BY dep.depid,sex;3. department表相關(guān)操作
1、創(chuàng)建一個數(shù)據(jù)庫:test_school
2、創(chuàng)建如下表格
表1 Department表的定義
| DepNo | 部門號 | int(10) | 是 | 否 | 是 | 是 |
| DepName | 部門名稱 | varchar(20) | 否 | 否 | 是 | 否 |
| DepNote | 部門備注 | Varchar(50) | 否 | 否 | 否 | 否 |
表2 Teacher表的定義
| Number | 教工號 | int | 是 | 否 | 是 | 是 |
| Name | 姓名 | varchar(30) | 否 | 否 | 是 | 否 |
| Sex | 性別 | varchar(4) | 否 | 否 | 否 | 否 |
| Birth | 出生日期 | date | 否 | 否 | 否 | 否 |
| DepNo | 部門號 | int | 否 | 是 | 否 | 否 |
| Salary | 工資 | float | 否 | 否 | 否 | 否 |
| Address | 家庭住址 | varchar(100) | 否 | 否 | 否 | 否 |
3、添加記錄
| 601 | 軟件技術(shù)系 | 軟件技術(shù)等專業(yè) |
| 602 | 網(wǎng)絡技術(shù)系 | 多媒體技術(shù)等專業(yè) |
| 603 | 藝術(shù)設計系 | 廣告藝術(shù)設計等專業(yè) |
| 604 | 管理工程系 | 連鎖經(jīng)營管理等專業(yè) |
| 2001 | Tom | 女 | 1970-01-10 | 602 | 4500 | 四川省綿陽市 |
| 2002 | Lucy | 男 | 1983-12-18 | 601 | 2500 | 北京市昌平區(qū) |
| 2003 | Mike | 男 | 1990-06-01 | 604 | 1500 | 重慶市渝中區(qū) |
| 2004 | James | 女 | 1980-10-20 | 602 | 3500 | 四川省成都市 |
| 2005 | Jack | 男 | 1975-05-30 | 603 | 1200 | 重慶市南岸區(qū) |
4、用SELECT語句查詢Teacher表的所有記錄。
5、找出所有其家庭地址中含有“北京”的教師的教工號及部門名稱,要求顯示結(jié)果中各列標題用中文別名表示。
6、獲得Teacher表中工資最高的教工號和姓名。
7、找出所有收入在2500~4000之間的教工號。
8、查找在網(wǎng)絡技術(shù)系工作的教師的姓名、性別和工資。
#創(chuàng)建一個數(shù)據(jù)庫:test_school CREATE DATABASE test_school;#使用數(shù)據(jù)庫 USE test_school;#創(chuàng)建表格 -- 部門信息表Department CREATE TABLE Department(DepNo INT(10) PRIMARY KEY,DepName VARCHAR(20) NOT NULL,DepNote VARCHAR(50) ); -- 創(chuàng)建數(shù)據(jù)表Teacher CREATE TABLE Teacher(Number INT PRIMARY KEY,`Name` VARCHAR(30) UNIQUE,Sex VARCHAR(4),Birth DATE,DepNo INT,Salary FLOAT,Address VARCHAR(100),FOREIGN KEY (DepNo) REFERENCES Department(DepNo) ); -- 將表4的內(nèi)容插入Department表中 INSERT INTO Department VALUES (601,'軟件技術(shù)系','軟件技術(shù)等專業(yè)'); INSERT INTO Department VALUES (602,'網(wǎng)絡技術(shù)系','多媒體技術(shù)等專業(yè)'); INSERT INTO Department VALUES (603,'藝術(shù)設計系','廣告藝術(shù)設計等專業(yè)'); INSERT INTO Department VALUES (604,'管理工程系','連鎖經(jīng)營管理等專業(yè)'); -- 將表3的內(nèi)容插入Teacher表中。 INSERT INTO Teacher VALUES(2001,'Tom','女','1970-01-10',602,4500,'四川省綿陽市'); INSERT INTO Teacher VALUES(2002,'Lucy','男','1983-12-18',601,2500,'北京市昌平區(qū)'); INSERT INTO Teacher VALUES(2003,'Mike','男','1990-06-01',604,1500,'重慶市渝中區(qū)'); INSERT INTO Teacher VALUES(2004,'James','女','1980-10-20',602,3500,'四川省成都市'); INSERT INTO Teacher VALUES(2005,'Jack','男','1975-05-30',603,1200,'重慶市南岸區(qū)');#用SELECT語句查詢Teacher表的所有記錄。 SELECT * FROM teacher;#找出所有其家庭地址中含有“北京”的教師的教工號及部門名稱,要求顯示結(jié)果中各列標題用中文表示。 SELECT number AS 教工號,Teacher.depno AS 部門名稱 FROM Teacher INNER JOIN Department ON Teacher.DepNo = Department.DepNo WHERE address LIKE '%北京%';#獲得Teacher表中工資最高的教工號和姓名。 SELECT number,`name` FROM teacher WHERE salary = (SELECT MAX(salary) FROM teacher); SELECT number,`name` FROM teacher ORDER BY salary DESC LIMIT 0,1;#找出所有收入在2500~4000之間的教工號。 SELECT number FROM teacher WHERE salary BETWEEN 2500 AND 4000;#查找在網(wǎng)絡技術(shù)系工作的教師的姓名、性別和工資。 SELECT `name`,sex,salary FROM teacher WHERE depno=(SELECT depno FROM department WHERE depname='網(wǎng)絡技術(shù)系');SELECT `name`,sex,salary FROM teacher INNER JOIN department ON teacher.depno = department.depno WHERE depname ='網(wǎng)絡技術(shù)系';4. student表相關(guān)操作
案例:
1、建立數(shù)據(jù)庫test_student
2、建立以下三張表,并插入記錄
Table:Classes
| 計算機網(wǎng)絡 | 1班 | 張三 | 男 | 8 |
| 軟件工程 | 2班 | 李四 | 男 | 12 |
| 計算機維護 | 1班 | 王五 | 男 | 9 |
| 計算機網(wǎng)絡 | 2班 | LILY | 女 | 15 |
| 軟件工程 | 1班 | 小強 | 男 | 20 |
| 計算機維護 | 1班 | CoCo | 女 | 18 |
Table:Score
| 張三 | 65 | 75 | 98 |
| 李四 | 87 | 45 | 86 |
| 王五 | 98 | 85 | 65 |
| LILY | 75 | 86 | 87 |
| 小強 | 85 | 60 | 58 |
| CoCo | 96 | 87 | 70 |
Table: Records
| 小強 | 遲到 |
| 小強 | 事假 |
| 李四 | 曠課 |
| 李四 | 曠課 |
| 李四 | 遲到 |
| CoCo | 病假 |
| LILY | 事假 |
要求3:寫出將張三的語文成績修改為88的SQL語句。
要求4:搜索出計算機維護1班各門課程的平均成績。
要求5:搜索科目有不及格的人的名單。
要求6:查詢記錄2次以上的學生的姓名和各科成績。
#建立數(shù)據(jù)庫test_student CREATE DATABASE test_student;#使用數(shù)據(jù)庫 USE test_student;#創(chuàng)建表格并添加記錄 CREATE TABLE Classes(Pro_name VARCHAR(20) NOT NULL,Grade VARCHAR(10) NOT NULL,`name` VARCHAR(10) NOT NULL,sex VARCHAR(4) NOT NULL,seat INT(10) NOT NULL UNIQUE ); CREATE TABLE Score(`name` VARCHAR(10) NOT NULL,En_score INT(10) NOT NULL,Ma_score INT(10) NOT NULL,Ch_score INT(10) NOT NULL ); CREATE TABLE Records(`name` VARCHAR(10) NOT NULL,record VARCHAR(10) );-- 向classes中添加數(shù)據(jù) INSERT INTO classes VALUES('計算機網(wǎng)絡','1班','張三','男',8); INSERT INTO classes VALUES('軟件工程','2班','李四','男',12); INSERT INTO classes VALUES('計算機維護','1班','王五','男',9); INSERT INTO classes VALUES('計算機網(wǎng)絡','2班','LILY','女',15); INSERT INTO classes VALUES('軟件工程','1班','小強','男',20); INSERT INTO classes VALUES('計算機維護','1班','CoCo','女',18);-- 向score中添加數(shù)據(jù) INSERT INTO Score VALUES('張三',65,75,98); INSERT INTO Score VALUES('李四',87,45,86); INSERT INTO Score VALUES('王五',98,85,65); INSERT INTO Score VALUES('LILY',75,86,87); INSERT INTO Score VALUES('小強',85,60,58); INSERT INTO Score VALUES('CoCo',96,87,70);-- 向records中添加數(shù)據(jù) INSERT INTO records VALUES('小強','遲到'); INSERT INTO records VALUES('小強','事假'); INSERT INTO records VALUES('李四','曠課'); INSERT INTO records VALUES('李四','曠課'); INSERT INTO records VALUES('李四','遲到'); INSERT INTO records VALUES('CoCo','病假'); INSERT INTO records VALUES('LILY','事假');#要求3:寫出將張三的語文成績修改為88的SQL語句。 UPDATE score SET ch_score=88 WHERE `name`='張三';#要求4:搜索出計算機維護1班各門課程的平均成績。 SELECT AVG(en_score),AVG(ma_score),AVG(ch_score) FROM score WHERE `name` IN (SELECT `name` FROM classes WHERE Pro_name='計算機維護' AND grade='1班');#要求5:搜索科目有不及格的人的名單。 SELECT `name` FROM score WHERE en_score<60 OR ma_score<60 OR ch_score<60;#要求6:查詢記錄2次以上的學生的姓名和各科成績。 SELECT * FROM score INNER JOIN (SELECT `name`,COUNT(*) FROM Records GROUP BY `name` HAVING COUNT(*)>2) temp ON score.name = temp.name;5. student等表的相關(guān)操作
1、建立數(shù)據(jù)庫:test_xuankedb
2、建立如下三張表:
學生表Student由學號(Sno)、姓名(Sname)、性別(Ssex)、年齡(Sage)、所在系(Sdept)五個字段,Sno 為關(guān)鍵字。
課程表Course由課程號(Cno)、課程名(Cname)、選修課號(Cpno)、學分(Ccredit)四個字段,Cno為關(guān)鍵字。
成績表SG由學號(Sno)、課程號(Cno)、成績(Grade)三個字段,(SNO, CNO)為關(guān)鍵字。
3、向Student表增加“入學時間(Scome)”列,其數(shù)據(jù)類型為日期型。
4、查詢選修了3號課程的學生的學號及其成績,查詢結(jié)果按分數(shù)的降序排列。
5、查詢學習1號課程的學生最高分數(shù)、平均成績。
6、查詢與“李洋”在同一個系學習的學生。
7、將計算機系全體學生的成績置零。
8、刪除學生表中學號為05019的學生記錄。
9、刪除計算機系所有學生的成績記錄。
-- 創(chuàng)建一個數(shù)據(jù)庫:test_xuankedb CREATE DATABASE test_xuankedb;-- 使用數(shù)據(jù)庫 USE test_xuankedb;-- 創(chuàng)建學生表 CREATE TABLE student(sno INT(10) PRIMARY KEY,sname VARCHAR(10),ssex VARCHAR(10),sage INT(10),sdept VARCHAR(40) );-- 創(chuàng)建課程表 CREATE TABLE course(cno INT(10) PRIMARY KEY,cname VARCHAR(20),cpno VARCHAR(40),ccredit INT(20) );-- 創(chuàng)建成績表 CREATE TABLE sg(sno INT(10),cno INT(10),grade INT(3),PRIMARY KEY(sno,cno),CONSTRAINT stu_s_sno_fk FOREIGN KEY (sno) REFERENCES student(sno),CONSTRAINT cou_s_sno_fk FOREIGN KEY (cno) REFERENCES course(cno) );#3.向Student表增加“入學時間(Scome)”列,其數(shù)據(jù)類型為日期型。 ALTER TABLE student ADD COLUMN scome DATE;#4.查詢選修了3號課程的學生的學號及其成績,查詢結(jié)果按分數(shù)的降序排列。 SELECT sno,grade FROM sg WHERE cno=3 ORDER BY grade DESC;#5.查詢學習1號課程的學生最高分數(shù)、平均成績。 SELECT MAX(grade),AVG(grade) FROM sg WHERE cno=1;#6.查詢與“李洋”在同一個系學習的學生。 SELECT * FROM student WHERE sdept=(SELECT sdept FROM student WHERE sname='李洋');#7.將計算機系全體學生的成績置零。 UPDATE sg SET grade=0 WHERE sno IN (SELECT sno FROM student WHERE sdept='計算機系')#8.刪除學生表中學號為05019的學生記錄。 DELETE FROM student WHERE sno=05019;#9.刪除計算機系所有學生的成績記錄。 DELETE FROM sg WHERE sno IN (SELECT sno FROM student WHERE sdept='計算機系');6. press等表的相關(guān)操作
1、建立數(shù)據(jù)庫:test_library
2、建立如下三個表:
表一:press 出版社
屬性:編號pressid(int)、名稱pressname(varchar)、地址address(varchar)
表二:sort 種類
屬性:編號sortno(int)、數(shù)量scount(int)
表二:book圖書
屬性:編號bid(int)、名稱 bname(varchar)、種類bsortno(int)、出版社編號pressid(int)
3、給sort表中添加一列屬性:描述describes(varchar)
4、向三個表中各插入幾條數(shù)據(jù)
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-2WuNn3x2-1631281610414)(MySQL數(shù)據(jù)庫章節(jié)練習.assets/1566490682634.png)]
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-hr5JvOYq-1631281610417)(MySQL數(shù)據(jù)庫章節(jié)練習.assets/1566490720312.png)]
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-352TBoHI-1631281610418)(MySQL數(shù)據(jù)庫章節(jié)練習.assets/1566490751669.png)]
5、查詢出版社id為100的書的全部信息
6、查詢出版社為外研社的書的全部信息
7、查詢圖書數(shù)量(scount)大于100的種類
8、查詢圖書種類最多的出版社信息
-- 建立數(shù)據(jù)庫:test_library CREATE DATABASE test_library;-- 使用數(shù)據(jù)庫 USE test_library;-- 創(chuàng)建出版社表 CREATE TABLE press(pressid INT(10) PRIMARY KEY,pressname VARCHAR(30),address VARCHAR(50) );-- 創(chuàng)建一個種類表 CREATE TABLE sort(sortno INT(10) PRIMARY KEY,scount INT(10) );-- 創(chuàng)建圖書表 CREATE TABLE book(bid INT(10) PRIMARY KEY,bname VARCHAR(40),bsortno INT(10),pressid INT(10),CONSTRAINT p_b_pid_fk FOREIGN KEY (pressid) REFERENCES press(pressid),CONSTRAINT s_b_sno_fk FOREIGN KEY (bsortno) REFERENCES sort(sortno) );-- 添加一列屬性 ALTER TABLE sort ADD COLUMN describes VARCHAR(30);-- 添加數(shù)據(jù) INSERT INTO press VALUES(100,'外研社','上海'); INSERT INTO press VALUES(101,'北大出版社','北京'); INSERT INTO press VALUES(102,'教育出版社','北京');-- 添加數(shù)據(jù) INSERT INTO sort(sortno,scount,describes)VALUES(11,50,'小說'); INSERT INTO sort(sortno,scount,describes)VALUES(12,300,'科幻'); INSERT INTO sort(sortno,scount,describes)VALUES(13,100,'神話');-- 添加數(shù)據(jù) INSERT INTO book VALUES(1,'紅與黑',11,100); INSERT INTO book VALUES(2,'幻城',12,102); INSERT INTO book VALUES(3,'希臘神話',13,102); INSERT INTO book VALUES(4,'一千零一夜',13,102);#5.查詢出版社id為100的書的全部信息 SELECT * FROM book WHERE pressid=100;#6.查詢出版社為外研社的書的全部信息 SELECT * FROM book WHERE pressid=(SELECT pressid FROM press WHERE pressname='外研社');#7.查詢圖書數(shù)量(scount)大于100的種類 SELECT * FROM sort WHERE scount>100;#8.查詢圖書種類最多的出版社信息 SELECT * FROM press WHERE pressid=(SELECT temp.pressid FROM (SELECT pressid,MAX(t.c) FROM (SELECT pressid,COUNT(*) AS c FROM book GROUP BY pressid ORDER BY c DESC ) AS t) AS temp);SELECT * FROM press WHERE pressid=( SELECT pressid FROM (SELECT pressid,bsortno FROM book GROUP BY pressid,bsortno) temp GROUP BY pressid ORDER BY COUNT(*) DESC LIMIT 0,1)7. agency等表的相關(guān)操作
1、建立數(shù)據(jù)庫:test_tour
2、建立如下兩個表:
agency旅行社表:
| Id | 旅行社編號 | int | no | 主鍵 |
| Name | 旅行社名 | varchar | no | |
| Address | 旅行社地址 | varchar | no | |
| Areaid | 所屬區(qū)域Id | Int | yes |
travel旅行線路表:
| Tid | 旅行線路編號 | int | no | 主鍵 |
| Time | 所需時間 | varchar | no | |
| Position | 目的地 | varchar | no | |
| Money | 花費 | Float | yes | |
| Aid | 所屬旅行社id | Int | no | 外鍵 |
| Count | 報名人數(shù) | Int | yes |
3、添加記錄
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-umK3Yasq-1631281610420)(MySQL數(shù)據(jù)庫章節(jié)練習.assets/1566490822909.png)]
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xE2BlWfk-1631281610421)(MySQL數(shù)據(jù)庫章節(jié)練習.assets/1566490863309.png)]
4、查出旅行線路最多的旅社
5、查出最熱門的旅行線路(也就是查詢出報名人數(shù)最多的線路)
6、查詢花費少于5000的旅行線路
7、找到一次旅行花費最昂貴的旅行社名
8、查出青年旅社所有的旅行線路都玩一遍需要多少時間。
#建立數(shù)據(jù)庫:test_tour CREATE DATABASE test_tour;#使用數(shù)據(jù)庫 USE test_tour;CREATE TABLE agency(id INT PRIMARY KEY NOT NULL,NAME VARCHAR(20) NOT NULL,address VARCHAR(100) NOT NULL,areaid INT );CREATE TABLE trval(tid INT PRIMARY KEY NOT NULL,TIME VARCHAR(50) NOT NULL,POSITION VARCHAR(100) NOT NULL,money FLOAT,aid INT NOT NULL,rcount INT,CONSTRAINT bk_aid FOREIGN KEY trval(aid) REFERENCES agency(id) );INSERT INTO agency(id,NAME,address) VALUES (101,'青年旅行社','北京海淀'); INSERT INTO agency(id,NAME,address) VALUES (102,'天天旅行社','天津海院');INSERT INTO trval(tid,TIME,POSITION,money,aid,rcount) VALUES (1,'5天','八達嶺',3000,101,10); INSERT INTO trval(tid,TIME,POSITION,money,aid,rcount) VALUES (2,'7天','水長城',5000,101,14); INSERT INTO trval(tid,TIME,POSITION,money,aid,rcount) VALUES (3,'8天','水長城',6000,102,11);SELECT * FROM agency; SELECT * FROM trval;#4.查出旅行線路最多的旅社 SELECT * FROM agency INNER JOIN (SELECT t.aid,MAX(t.c) FROM (SELECT aid,COUNT(*) AS c FROM trval GROUP BY aid) AS t)temp ON agency.id = temp.aid#5.查出最熱門的旅行線路(也就是查詢出報名人數(shù)最多的線路) SELECT * FROM trval WHERE rcount=(SELECT MAX(rcount) FROM trval);#6.查詢花費少于5000的旅行線路 SELECT * FROM trval WHERE money<5000;#7.找到一次旅行花費最昂貴的旅行社名 SELECT NAME FROM agency WHERE id = (SELECT aid FROM trval WHERE money =(SELECT MAX(money) FROM trval ));#8.查出青年旅社所有的旅行線路都玩一遍需要多少時間。 SELECT SUM(TIME) FROM trval WHERE aid=(SELECT id FROM agency WHERE NAME='青年旅行社');總結(jié)
以上是生活随笔為你收集整理的三天学会MySQL - MySQL数据库章节练习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软考中项第三章 信息系统集成专业知识
- 下一篇: flink cdc 2.2.1 mysq