第01章_数据库概述

1.说说你了解的常见的数据库

  1. OracleMySQlSQL ServerDB2PGSQLRedisMongoDBES.....

2.谈谈你对MySQL历史、特点的理解

  1. 历史:
  2. 由瑞典的MySQL AB 公司创立,1995开发出的MySQL
  3. 2008年,MySQLSUN公司收购
  4. 2009年,Oracle收购SUN公司,进而Oracle就获取了MySQL
  5. 2016年,MySQL8.0.0版本推出
  6. 特点:
  7. 开源的、关系型的数据库
  8. 支持千万级别数据量的存储,大型的数据库

3.说说你对DB、DBMS、SQL的理解

  1. DBdatabase,看做是数据库文件。 (类似于:.doc、.txt、.mp3、.avi、。。。)
  2. DBMS:数据库管理系统。(类似于word工具、wps工具、记事本工具、qq影音播放器等)
  3. MySQL数据库服务器中安装了MySQL DBMS,使用MySQL DBMS 来管理和操作DB,使用的是SQL语言。

4.你知道哪些非关系型数据库的类型呢?(了解)

  1. 键值型数据库:Redis
  2. 文档型数据库:MongoDB
  3. 搜索引擎数据库:ESSolr
  4. 列式数据库:HBase
  5. 图形数据库:InfoGrid

5.表与表的记录之间存在哪些关联关系?

  1. ORM思想。(了解)
  2. 表与表的记录之间的关系:一对一关系、一对多关系、多对多关系、自关联 (了解)

第02章_MySQL环境搭建

1.安装好MySQL之后在windows系统中哪些位置能看到MySQL?

  1. MySQL DBMS软件的安装位置。 D:\develop_tools\MySQL\MySQL Server 8.0
  2. MySQL 数据库文件的存放位置。 C:\ProgramData\MySQL\MySQL Server 8.0\Data
  3. MySQL DBMS 的配置文件。 C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
  4. MySQL的服务(要想通过客户端能够访问MySQL的服务器,必须保证服务是开启状态的)
  5. MySQLpath环境变量

2.卸载MySQL主要卸载哪几个位置的内容?

  1. 使用控制面板的软件卸载,去卸载MySQL DBMS软件的安装位置。
  2. D:\develop_tools\MySQL\MySQL Server 8.0
  3. 手动删除数据库文件。 C:\ProgramData\MySQL\MySQL Server 8.0\Data
  4. MySQL的环境变量
  5. MySQL的服务进入注册表删除。( regedit
  6. 务必重启电脑

3.能够独立完成MySQL8.0、MySQL5.7版本的下载、安装、配置 (掌握)
4.MySQL5.7在配置完以后,如何修改配置文件?

  1. 为什么要修改my.ini文件? 默认的数据库使用的字符集是latin1。我们需要修改为:utf8
  2. 修改哪些信息?
  3. 修改完以后,需要重启服务。

5.熟悉常用的数据库管理和操作的工具

  1. 方式1windows自带的cmd
  2. 方式2mysql数据库自带的命令行窗口
  3. 方式3:图形化管理工具:NavicatSQLyogdbeaver等。
  4. [mysql] #大概在63行左右,在其下添加
  5. ...
  6. default-character-set=utf8 #默认字符集
  7. [mysqld] # 大概在76行左右,在其下添加
  8. ...
  9. character-set-server=utf8
  10. collation-server=utf8_general_ci
  11. net stop mysql服务名;
  12. net start mysql服务名;

第03章_基本的SELECT语句

  1. 【题目】
  2. # 1.查询员工12个月的工资总和,并起别名为ANNUAL SALARY
  3. # 2.查询employees表中去除重复的job_id以后的数据
  4. # 3.查询工资大于12000的员工姓名和工资
  5. # 4.查询员工号为176的员工的姓名和部门号
  6. # 5.显示表 departments 的结构,并查询其中的全部数据
  1. 1.查询员工12个月的工资总和,并起别名为ANNUAL SALARY
  2. SELECT employee_id , last_name,salary * 12 "ANNUAL SALARY"
  3. FROM employees;
  4. SELECT employee_id,last_name,salary * 12 * (1 + IFNULL(commission_pct,0)) "ANNUAL
  5. SALARY"
  6. FROM employees;
  1. 2.查询employees表中去除重复的job_id以后的数据
  2. SELECT DISTINCT job_id
  3. FROM employees;
  1. 3.查询工资大于12000的员工姓名和工资
  2. SELECT last_name, salary
  3. FROM employees
  4. WHERE salary > 12000;
  1. 4.查询员工号为176的员工的姓名和部门号
  2. SELECT last_name, department_id
  3. FROM employees
  4. WHERE employee_id = 176;
  1. 5.显示表 departments 的结构,并查询其中的全部数据
  2. DESC departments;
  3. SELECT * FROM departments;

第04章_运算符

  1. 【题目】
  2. # 1.选择工资不在5000到12000的员工的姓名和工资
  3. # 2.选择在20或50号部门工作的员工姓名和部门号
  4. # 3.选择公司中没有管理者的员工姓名及job_id
  5. # 4.选择公司中有奖金的员工姓名,工资和奖金级别
  6. # 5.选择员工姓名的第三个字母是a的员工姓名
  7. # 6.选择姓名中有字母a和k的员工姓名
  8. # 7.显示出表 employees 表中 first_name 以 'e'结尾的员工信息
  9. # 8.显示出表 employees 部门编号在 80-100 之间的姓名、工种
  10. # 9.显示出表 employees 的 manager_id 是 100,101,110 的员工姓名、工资、管理者id
  1. 1.选择工资不在500012000的员工的姓名和工资
  2. SELECT last_name, salary
  3. FROM employees
  4. WHERE salary < 5000 OR salary > 12000;
  5. SELECT last_name, salary
  6. FROM employees
  7. WHERE salary NOT BETWEEN 5000 AND 12000;
  1. 2.选择在2050号部门工作的员工姓名和部门号
  2. SELECT last_name, department_id
  3. FROM employees
  4. WHERE department_id = 20 OR department_id = 50;
  5. SELECT last_name, department_id
  6. FROM employees
  7. WHERE department_id IN(20, 50);
  1. 3.选择公司中没有管理者的员工姓名及job_id
  2. SELECT last_name, job_id
  3. FROM employees
  4. WHERE manager_id IS NULL;
  1. 4.选择公司中有奖金的员工姓名,工资和奖金级别
  2. SELECT last_name, salary, commission_pct
  3. FROM employees
  4. WHERE commission_pct IS NOT NULL;
  1. 5.选择员工姓名的第三个字母是a的员工姓名
  2. SELECT last_name
  3. FROM employees
  4. WHERE last_name LIKE '__a%';
  1. 6.选择姓名中有字母ak的员工姓名
  2. SELECT last_name
  3. FROM employees
  4. WHERE last_name LIKE '%a%k%' OR last_name LIKE '%k%a%';
  1. 7.显示出表 employees 表中 first_name 'e'结尾的员工信息
  2. SELECT employee_id,first_name,last_name
  3. FROM employees
  4. WHERE first_name LIKE '%e';
  5. SELECT employee_id,first_name,last_name
  6. FROM employees
  7. WHERE first_name REGEXP 'e$';
  1. 8.显示出表 employees 部门编号在 80-100 之间的姓名、工种
  2. SELECT last_name,job_id
  3. FROM employees
  4. #where department_id in (80,90,100);
  5. WHERE department_id BETWEEN 80 AND 100;
  1. 9.显示出表 employees manager_id 100,101,110 的员工姓名、工资、管理者id
  2. SELECT last_name,salary,manager_id
  3. FROM employees
  4. WHERE manager_id IN (100,101,110);

第05章_排序与分页

  1. #1. 查询员工的姓名和部门号和年薪,按年薪降序,按姓名升序显示
  2. #2. 选择工资不在 8000 到 17000 的员工的姓名和工资,按工资降序,显示第21到40位置的数据
  3. #3. 查询邮箱中包含 e 的员工信息,并先按邮箱的字节数降序,再按部门号升序
  1. 答案:
  2. 1. 查询员工的姓名和部门号和年薪,按年薪降序 按姓名升序显示
  3. SELECT last_name,department_id,salary * 12 annual_sal
  4. FROM employees
  5. ORDER BY annual_sal DESC,last_name ASC;
  6. 2. 选择工资不在 8000 17000 的员工的姓名和工资,按工资降序,显示第
  7. 2140位置的数据
  8. SELECT last_name,salary
  9. FROM employees
  10. WHERE salary NOT BETWEEN 8000 AND 17000
  11. ORDER BY salary DESC
  12. LIMIT 20,20;
  13. 3. 查询邮箱中包含 e 的员工信息,并先按邮箱的字节数降序,再按部门号
  14. 升序
  15. SELECT last_name,email,department_id
  16. FROM employees
  17. #where email like '%e%'
  18. WHERE email REGEXP '[e]'
  19. ORDER BY LENGTH(email) DESC,department_id ASC;

第06章_多表查询

多表查询-1

  1. 【题目】
  2. # 1.显示所有员工的姓名,部门号和部门名称。
  3. # 2.查询90号部门员工的job_id和90号部门的location_id
  4. # 3.选择所有有奖金的员工的 last_name , department_name , location_id , city
  5. # 4.选择city在Toronto工作的员工的 last_name , job_id , department_id , department_name
  6. # 5.查询员工所在的部门名称、部门地址、姓名、工作、工资,其中员工所在部门的部门名称为’Executive’
  7. # 6.选择指定员工的姓名,员工号,以及他的管理者的姓名和员工号,结果类似于下面的格式
  8. employees Emp# manager Mgr#
  9. kochhar 101 king 100
  10. # 7.查询哪些部门没有员工
  11. # 8. 查询哪个城市没有部门
  12. # 9. 查询部门名为 Sales 或 IT 的员工信息

# 1.显示所有员工的姓名,部门号和部门名称。

  1. SELECT last_name, e.department_id, department_name
  2. FROM employees e
  3. LEFT OUTER JOIN departments d
  4. ON e.`department_id` = d.`department_id`;

# 2.查询90号部门员工的job_id和90号部门的location_id

  1. SELECT job_id, location_id
  2. FROM employees e, departments d
  3. WHERE e.`department_id` = d.`department_id`
  4. AND e.`department_id` = 90;
  5. or
  6. SELECT job_id, location_id
  7. FROM employees e
  8. JOIN departments d
  9. ON e.`department_id` = d.`department_id`
  10. WHERE e.`department_id` = 90;

# 3.选择所有有奖金的员工的 last_name , department_name , location_id , city

  1. SELECT last_name , department_name , d.location_id , city
  2. FROM employees e
  3. LEFT OUTER JOIN departments d
  4. ON e.`department_id` = d.`department_id`
  5. LEFT OUTER JOIN locations l
  6. ON d.`location_id` = l.`location_id`
  7. WHERE commission_pct IS NOT NULL;

4.选择city在Toronto工作的员工的 last_name , job_id , department_id , department_name

  1. SELECT last_name , job_id , e.department_id , department_name
  2. FROM employees e, departments d, locations l
  3. WHERE e.`department_id` = d.`department_id`
  4. AND d.`location_id` = l.`location_id`
  5. AND city = 'Toronto';
  6. or
  7. SELECT last_name , job_id , e.department_id , department_name
  8. FROM employees e
  9. JOIN departments d
  10. ON e.`department_id` = d.`department_id`
  11. JOIN locations l
  12. ON l.`location_id` = d.`location_id`
  13. WHERE l.`city` = 'Toronto';

5.查询员工所在的部门名称、部门地址、姓名、工作、工资,其中员工所 在部门的部门名称为’Executive’

  1. SELECT department_name, street_address, last_name, job_id, salary
  2. FROM employees e JOIN departments d
  3. ON e.department_id = d.department_id
  4. JOIN locations l
  5. ON d.`location_id` = l.`location_id`
  6. WHERE department_name = 'Executive'

6.选择指定员工的姓名,员工号,以及他的管理者的姓名和员工号,结果 类似于下面的格式

  1. employees Emp# manager Mgr#
  2. kochhar 101 king 100
  3. SELECT emp.last_name employees, emp.employee_id "Emp#", mgr.last_name manager,
  4. mgr.employee_id "Mgr#"
  5. FROM employees emp
  6. LEFT OUTER JOIN employees mgr
  7. ON emp.manager_id = mgr.employee_id

7.查询哪些部门没有员工

  1. #方式1:
  2. SELECT d.department_id
  3. FROM departments d LEFT JOIN employees e
  4. ON e.department_id = d.`department_id`
  5. WHERE e.department_id IS NULL
  6. #方式2:
  7. SELECT department_id
  8. FROM departments d
  9. WHERE NOT EXISTS (
  10. SELECT *
  11. FROM employees e
  12. WHERE e.`department_id` = d.`department_id`
  13. )

8. 查询哪个城市没有部门

  1. SELECT l.location_id,l.city
  2. FROM locations l LEFT JOIN departments d
  3. ON l.`location_id` = d.`location_id`
  4. WHERE d.`location_id` IS NULL

9. 查询部门名为 Sales 或 IT 的员工信息

  1. SELECT employee_id,last_name,department_name
  2. FROM employees e,departments d
  3. WHERE e.department_id = d.`department_id`
  4. AND d.`department_name` IN ('Sales','IT');

多表查询-2

  1. 1. 所有有门派的人员信息
  2. AB两表共有)
  3. INSERT INTO t_dept(deptName,address) VALUES('华山','华山');
  4. INSERT INTO t_dept(deptName,address) VALUES('丐帮','洛阳');
  5. INSERT INTO t_dept(deptName,address) VALUES('峨眉','峨眉山');
  6. INSERT INTO t_dept(deptName,address) VALUES('武当','武当山');
  7. INSERT INTO t_dept(deptName,address) VALUES('明教','光明顶');
  8. INSERT INTO t_dept(deptName,address) VALUES('少林','少林寺');
  9. INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('风清扬',90,1,100001);
  10. INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('岳不群',50,1,100002);
  11. INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('令狐冲',24,1,100003);
  12. INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('洪七公',70,2,100004);
  13. INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('乔峰',35,2,100005);
  14. INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('灭绝师太',70,3,100006);
  15. INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('周芷若',20,3,100007);
  16. INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('张三丰',100,4,100008);
  17. INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('张无忌',25,5,100009);
  18. INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('韦小宝',18,null,100010);
  1. 【题目】
  2. #1.所有有门派的人员信息
  3. AB两表共有)
  4. #2.列出所有用户,并显示其机构信息
  5. A的全集)
  6. #3.列出所有门派
  7. B的全集)
  8. #4.所有不入门派的人员
  9. A的独有)
  10. #5.所有没人入的门派
  11. B的独有)
  12. #6.列出所有人员和机构的对照关系
  13. (AB全有)
  14. #MySQL Full Join的实现 因为MySQL不支持FULL JOIN,下面是替代方法
  15. #left join + union(可去除重复数据)+ right join
  16. #7.列出所有没入派的人员和没人入的门派
  17. A的独有+B的独有)

#1.所有有门派的人员信息 ( A、B两表共有)

  1. select *
  2. from t_emp a inner join t_dept b
  3. on a.deptId = b.id

#2.列出所有用户,并显示其机构信息 (A的全集)

  1. select *
  2. from t_emp a left join t_dept b
  3. on a.deptId = b.id

#3.列出所有门派 (B的全集)

  1. select *
  2. from t_dept b;

#4.所有不入门派的人员 (A的独有)

  1. select *
  2. from t_emp a left join t_dept b
  3. on a.deptId = b.id
  4. where b.id is null;

`#5.所有没人入的门派<br /> (B的独有)

  1. select *
  2. from t_dept b left join t_emp a
  3. on a.deptId = b.id
  4. where a.deptId is null;

#6.列出所有人员和机构的对照关系 (AB全有)

  1. #MySQL Full Join的实现 因为MySQL不支持FULL JOIN,下面是替代方法
  2. #left join + union(可去除重复数据)+ right join
  3. SELECT *
  4. FROM t_emp A LEFT JOIN t_dept B
  5. ON A.deptId = B.id
  6. UNION
  7. SELECT *
  8. FROM t_emp A RIGHT JOIN t_dept B
  9. ON A.deptId = B.id

#7.列出所有没入派的人员和没人入的门派 (A的独有+B的独有)

  1. SELECT *
  2. FROM t_emp A LEFT JOIN t_dept B
  3. ON A.deptId = B.id
  4. UNION
  5. SELECT *
  6. FROM t_emp A RIGHT JOIN t_dept B
  7. ON A.deptId = B.id
  1. select *
  2. from t_emp a inner join t_dept b
  3. on a.deptId = b.id;
  4. 2. 列出所有用户,并显示其机构信息
  5. A的全集)
  6. 3. 列出所有门派
  7. B的全集)
  8. 4. 所有不入门派的人员
  9. A的独有)
  10. 5. 所有没人入的门派
  11. B的独有)
  12. 6. 列出所有人员和机构的对照关系
  13. (AB全有)
  14. 7. 列出所有没入派的人员和没人入的门派
  15. A的独有+B的独有)
  16. select *
  17. from t_emp a left join t_dept b
  18. on a.deptId = b.id;
  19. select *
  20. from t_dept b;
  21. select *
  22. from t_emp a left join t_dept b
  23. on a.deptId = b.id
  24. where b.id is null;
  25. select *
  26. from t_dept b left join t_emp a
  27. on a.deptId = b.id
  28. where a.deptId is null;
  29. #MySQL Full Join的实现 因为MySQL不支持FULL JOIN,下面是替代方法
  30. #left join + union(可去除重复数据)+ right join
  31. SELECT *
  32. FROM t_emp A LEFT JOIN t_dept B
  33. ON A.deptId = B.id
  34. UNION
  35. SELECT *
  36. FROM t_emp A RIGHT JOIN t_dept B
  37. ON A.deptId = B.id
  38. SELECT *
  39. FROM t_emp A LEFT JOIN t_dept B
  40. ON A.deptId = B.id
  41. WHERE B.`id` IS NULL
  42. UNION
  43. SELECT *
  44. FROM t_emp A RIGHT JOIN t_dept B
  45. ON A.deptId = B.id
  46. WHERE A.`deptId` IS NULL;

#第07章_单行函数的课后练习

  1. # 1.显示系统时间(注:日期+时间)
  2. SELECT NOW(),SYSDATE(),CURRENT_TIMESTAMP(),LOCALTIME(),LOCALTIMESTAMP() #大家只需要掌握一个函数就可以了
  3. FROM DUAL;
  4. # 2.查询员工号,姓名,工资,以及工资提高百分之20%后的结果(new salary)
  5. SELECT employee_id,last_name,salary,salary * 1.2 "new salary"
  6. FROM employees;
  7. # 3.将员工的姓名按首字母排序,并写出姓名的长度(length)
  8. SELECT last_name,LENGTH(last_name) "name_length"
  9. FROM employees
  10. #order by last_name asc;
  11. ORDER BY name_length ASC;
  12. # 4.查询员工id,last_name,salary,并作为一个列输出,别名为OUT_PUT
  13. SELECT CONCAT(employee_id,',',last_name,',',salary) "OUT_PUT"
  14. FROM employees;
  15. # 5.查询公司各员工工作的年数、工作的天数,并按工作年数的降序排序
  16. SELECT employee_id,DATEDIFF(CURDATE(),hire_date)/365 "worked_years",DATEDIFF(CURDATE(),hire_date) "worked_days",
  17. TO_DAYS(CURDATE()) - TO_DAYS(hire_date) "worked_days1"
  18. FROM employees
  19. ORDER BY worked_years DESC;
  20. # 6.查询员工姓名,hire_date , department_id,满足以下条件:
  21. #雇用时间在1997年之后,department_id 为80 或 90 或110, commission_pct不为空
  22. SELECT last_name,hire_date,department_id
  23. FROM employees
  24. WHERE department_id IN (80,90,110)
  25. AND commission_pct IS NOT NULL
  26. #and hire_date >= '1997-01-01'; #存在着隐式转换
  27. #and date_format(hire_date,'%Y-%m-%d') >= '1997-01-01'; # 显式转换操作,格式化:日期---> 字符串
  28. #and date_format(hire_date,'%Y') >= '1997'; # 显式转换操作,格式化
  29. AND hire_date >= STR_TO_DATE('1997-01-01','%Y-%m-%d');# 显式转换操作,解析:字符串 ----> 日期
  30. # 7.查询公司中入职超过10000天的员工姓名、入职时间
  31. SELECT last_name,hire_date
  32. FROM employees
  33. WHERE DATEDIFF(CURDATE(),hire_date) >= 10000;
  34. # 8.做一个查询,产生下面的结果
  35. #<last_name> earns <salary> monthly but wants <salary*3>
  36. SELECT CONCAT(last_name,' earns ',TRUNCATE(salary,0), ' monthly but wants ',TRUNCATE(salary * 3,0)) "Dream Salary"
  37. FROM employees;
  38. # 9.使用case-when,按照下面的条件:
  39. /*job grade
  40. AD_PRES A
  41. ST_MAN B
  42. IT_PROG C
  43. SA_REP D
  44. ST_CLERK E
  45. 产生下面的结果:
  46. */
  47. SELECT last_name "Last_name",job_id "Job_id",CASE job_id WHEN 'AD_PRES' THEN 'A'
  48. WHEN 'ST_MAN' THEN 'B'
  49. WHEN 'IT_PROG' THEN 'C'
  50. WHEN 'SA_REP' THEN 'D'
  51. WHEN 'ST_CLERK' THEN 'E'
  52. END "Grade"
  53. FROM employees;
  54. SELECT last_name "Last_name",job_id "Job_id",CASE job_id WHEN 'AD_PRES' THEN 'A'
  55. WHEN 'ST_MAN' THEN 'B'
  56. WHEN 'IT_PROG' THEN 'C'
  57. WHEN 'SA_REP' THEN 'D'
  58. WHEN 'ST_CLERK' THEN 'E'
  59. ELSE "undefined" END "Grade"
  60. FROM employees;

第08章_聚合函数

  1. 【题目】
  2. #1.where子句可否使用组函数进行过滤?
  3. #2.查询公司员工工资的最大值,最小值,平均值,总和
  4. #3.查询各job_id的员工工资的最大值,最小值,平均值,总和
  5. #4.选择具有各个job_id的员工人数
  6. # 5.查询员工最高工资和最低工资的差距(DIFFERENCE)
  7. # 6.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
  8. # 7.查询所有部门的名字,location_id,员工数量和平均工资,并按平均工资降序
  9. # 8.查询每个工种、每个部门的部门名、工种名和最低工资

#1.where子句可否使用组函数进行过滤?

no

#2.查询公司员工工资的最大值,最小值,平均值,总和

  1. SELECT MAX(salary), MIN(salary), AVG(salary), SUM(salary)
  2. FROM employees;

#3.查询各job_id的员工工资的最大值,最小值,平均值,总和

  1. SELECT job_id, MAX(salary), MIN(salary), AVG(salary), SUM(salary)
  2. FROM employees
  3. GROUP BY job_id;

#4.选择具有各个job_id的员工人数

  1. SELECT job_id, COUNT(*)
  2. FROM employees
  3. GROUP BY job_id;

5.查询员工最高工资和最低工资的差距(DIFFERENCE)

  1. SELECT MAX(salary), MIN(salary), MAX(salary) - MIN(salary) DIFFERENCE
  2. FROM employees;

6.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内

  1. SELECT manager_id, MIN(salary)
  2. FROM employees
  3. WHERE manager_id IS NOT NULL
  4. GROUP BY manager_id
  5. HAVING MIN(salary) > 6000;

7.查询所有部门的名字,location_id,员工数量和平均工资,并按平均工资降序

  1. SELECT department_name, location_id, COUNT(employee_id), AVG(salary) avg_sal
  2. FROM employees e RIGHT JOIN departments d
  3. ON e.`department_id` = d.`department_id`
  4. GROUP BY department_name, location_id
  5. ORDER BY avg_sal DESC;

8.查询每个工种、每个部门的部门名、工种名和最低工资

  1. SELECT department_name,job_id,MIN(salary)
  2. FROM departments d LEFT JOIN employees e
  3. ON e.`department_id` = d.`department_id`
  4. GROUP BY department_name,job_id

09章_子查询

  1. 【题目】
  2. #1.查询和Zlotkey相同部门的员工姓名和工资
  3. #2.查询工资比公司平均工资高的员工的员工号,姓名和工资。
  4. #3.选择工资大于所有JOB_ID = 'SA_MAN'的员工的工资的员工的last_name, job_id, salary
  5. #4.查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名
  6. #5.查询在部门的location_id为1700的部门工作的员工的员工号
  7. #6.查询管理者是King的员工姓名和工资
  8. #7.查询工资最低的员工信息: last_name, salary
  9. #8.查询平均工资最低的部门信息
  10. #9.查询平均工资最低的部门信息和该部门的平均工资(相关子查询)
  11. #10.查询平均工资最高的 job 信息
  12. #11.查询平均工资高于公司平均工资的部门有哪些?
  13. #12.查询出公司中所有 manager 的详细信息
  14. #13.各个部门中 最高工资中最低的那个部门的 最低工资是多少?
  15. #14.查询平均工资最高的部门的 manager 的详细信息: last_name, department_id, email, salary
  16. #15. 查询部门的部门号,其中不包括job_id是"ST_CLERK"的部门号
  17. #16. 选择所有没有管理者的员工的last_name
  18. #17.查询员工号、姓名、雇用时间、工资,其中员工的管理者为 'De Haan'
  19. #18.查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资(相关子查询)
  20. #19.查询每个部门下的部门人数大于 5 的部门名称(相关子查询)
  21. #20.查询每个国家下的部门个数大于 2 的国家编号(相关子查询)
  1. # 第09章_子查询的课后练习
  2. #1.查询和Zlotkey相同部门的员工姓名和工资
  3. SELECT last_name,salary
  4. FROM employees
  5. WHERE department_id IN (
  6. SELECT department_id
  7. FROM employees
  8. WHERE last_name = 'Zlotkey'
  9. );
  10. #2.查询工资比公司平均工资高的员工的员工号,姓名和工资。
  11. SELECT employee_id,last_name,salary
  12. FROM employees
  13. WHERE salary > (
  14. SELECT AVG(salary)
  15. FROM employees
  16. );
  17. #3.选择工资大于所有JOB_ID = 'SA_MAN'的员工的工资的员工的last_name, job_id, salary
  18. SELECT last_name,job_id,salary
  19. FROM employees
  20. WHERE salary > ALL(
  21. SELECT salary
  22. FROM employees
  23. WHERE job_id = 'SA_MAN'
  24. );
  25. #4.查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名
  26. SELECT employee_id,last_name
  27. FROM employees
  28. WHERE department_id IN (
  29. SELECT DISTINCT department_id
  30. FROM employees
  31. WHERE last_name LIKE '%u%'
  32. );
  33. #5.查询在部门的location_id为1700的部门工作的员工的员工号
  34. SELECT employee_id
  35. FROM employees
  36. WHERE department_id IN (
  37. SELECT department_id
  38. FROM departments
  39. WHERE location_id = 1700
  40. );
  41. #6.查询管理者是King的员工姓名和工资
  42. SELECT last_name,salary,manager_id
  43. FROM employees
  44. WHERE manager_id IN (
  45. SELECT employee_id
  46. FROM employees
  47. WHERE last_name = 'King'
  48. );
  49. #7.查询工资最低的员工信息: last_name, salary
  50. SELECT last_name,salary
  51. FROM employees
  52. WHERE salary = (
  53. SELECT MIN(salary)
  54. FROM employees
  55. );
  56. #8.查询平均工资最低的部门信息
  57. #方式1:
  58. SELECT *
  59. FROM departments
  60. WHERE department_id = (
  61. SELECT department_id
  62. FROM employees
  63. GROUP BY department_id
  64. HAVING AVG(salary ) = (
  65. SELECT MIN(avg_sal)
  66. FROM (
  67. SELECT AVG(salary) avg_sal
  68. FROM employees
  69. GROUP BY department_id
  70. ) t_dept_avg_sal
  71. )
  72. );
  73. #方式2:
  74. SELECT *
  75. FROM departments
  76. WHERE department_id = (
  77. SELECT department_id
  78. FROM employees
  79. GROUP BY department_id
  80. HAVING AVG(salary ) <= ALL(
  81. SELECT AVG(salary)
  82. FROM employees
  83. GROUP BY department_id
  84. )
  85. );
  86. #方式3: LIMIT
  87. SELECT *
  88. FROM departments
  89. WHERE department_id = (
  90. SELECT department_id
  91. FROM employees
  92. GROUP BY department_id
  93. HAVING AVG(salary ) =(
  94. SELECT AVG(salary) avg_sal
  95. FROM employees
  96. GROUP BY department_id
  97. ORDER BY avg_sal ASC
  98. LIMIT 1
  99. )
  100. );
  101. #方式4:
  102. SELECT d.*
  103. FROM departments d,(
  104. SELECT department_id,AVG(salary) avg_sal
  105. FROM employees
  106. GROUP BY department_id
  107. ORDER BY avg_sal ASC
  108. LIMIT 0,1
  109. ) t_dept_avg_sal
  110. WHERE d.`department_id` = t_dept_avg_sal.department_id
  111. #9.查询平均工资最低的部门信息和该部门的平均工资(相关子查询)
  112. #方式1
  113. SELECT d.*,(SELECT AVG(salary) FROM employees WHERE department_id = d.`department_id`) avg_sal
  114. FROM departments d
  115. WHERE department_id = (
  116. SELECT department_id
  117. FROM employees
  118. GROUP BY department_id
  119. HAVING AVG(salary ) = (
  120. SELECT MIN(avg_sal)
  121. FROM (
  122. SELECT AVG(salary) avg_sal
  123. FROM employees
  124. GROUP BY department_id
  125. ) t_dept_avg_sal
  126. )
  127. );
  128. #方式2:
  129. SELECT d.*,(SELECT AVG(salary) FROM employees WHERE department_id = d.`department_id`) avg_sal
  130. FROM departments d
  131. WHERE department_id = (
  132. SELECT department_id
  133. FROM employees
  134. GROUP BY department_id
  135. HAVING AVG(salary ) <= ALL(
  136. SELECT AVG(salary)
  137. FROM employees
  138. GROUP BY department_id
  139. )
  140. );
  141. #方式3: LIMIT
  142. SELECT d.*,(SELECT AVG(salary) FROM employees WHERE department_id = d.`department_id`) avg_sal
  143. FROM departments d
  144. WHERE department_id = (
  145. SELECT department_id
  146. FROM employees
  147. GROUP BY department_id
  148. HAVING AVG(salary ) =(
  149. SELECT AVG(salary) avg_sal
  150. FROM employees
  151. GROUP BY department_id
  152. ORDER BY avg_sal ASC
  153. LIMIT 1
  154. )
  155. );
  156. #方式4:
  157. SELECT d.*,(SELECT AVG(salary) FROM employees WHERE department_id = d.`department_id`) avg_sal
  158. FROM departments d,(
  159. SELECT department_id,AVG(salary) avg_sal
  160. FROM employees
  161. GROUP BY department_id
  162. ORDER BY avg_sal ASC
  163. LIMIT 0,1
  164. ) t_dept_avg_sal
  165. WHERE d.`department_id` = t_dept_avg_sal.department_id
  166. #10.查询平均工资最高的 job 信息
  167. #方式1:
  168. SELECT *
  169. FROM jobs
  170. WHERE job_id = (
  171. SELECT job_id
  172. FROM employees
  173. GROUP BY job_id
  174. HAVING AVG(salary) = (
  175. SELECT MAX(avg_sal)
  176. FROM (
  177. SELECT AVG(salary) avg_sal
  178. FROM employees
  179. GROUP BY job_id
  180. ) t_job_avg_sal
  181. )
  182. );
  183. #方式2:
  184. SELECT *
  185. FROM jobs
  186. WHERE job_id = (
  187. SELECT job_id
  188. FROM employees
  189. GROUP BY job_id
  190. HAVING AVG(salary) >= ALL(
  191. SELECT AVG(salary)
  192. FROM employees
  193. GROUP BY job_id
  194. )
  195. );
  196. #方式3:
  197. SELECT *
  198. FROM jobs
  199. WHERE job_id = (
  200. SELECT job_id
  201. FROM employees
  202. GROUP BY job_id
  203. HAVING AVG(salary) =(
  204. SELECT AVG(salary) avg_sal
  205. FROM employees
  206. GROUP BY job_id
  207. ORDER BY avg_sal DESC
  208. LIMIT 0,1
  209. )
  210. );
  211. #方式4:
  212. SELECT j.*
  213. FROM jobs j,(
  214. SELECT job_id,AVG(salary) avg_sal
  215. FROM employees
  216. GROUP BY job_id
  217. ORDER BY avg_sal DESC
  218. LIMIT 0,1
  219. ) t_job_avg_sal
  220. WHERE j.job_id = t_job_avg_sal.job_id
  221. #11.查询平均工资高于公司平均工资的部门有哪些?
  222. SELECT department_id
  223. FROM employees
  224. WHERE department_id IS NOT NULL
  225. GROUP BY department_id
  226. HAVING AVG(salary) > (
  227. SELECT AVG(salary)
  228. FROM employees
  229. );
  230. #12.查询出公司中所有 manager 的详细信息
  231. #方式1:自连接 xxx worked for yyy
  232. SELECT DISTINCT mgr.employee_id,mgr.last_name,mgr.job_id,mgr.department_id
  233. FROM employees emp JOIN employees mgr
  234. ON emp.manager_id = mgr.employee_id;
  235. #方式2:子查询
  236. SELECT employee_id,last_name,job_id,department_id
  237. FROM employees
  238. WHERE employee_id IN (
  239. SELECT DISTINCT manager_id
  240. FROM employees
  241. );
  242. #方式3:使用EXISTS
  243. SELECT employee_id,last_name,job_id,department_id
  244. FROM employees e1
  245. WHERE EXISTS (
  246. SELECT *
  247. FROM employees e2
  248. WHERE e1.`employee_id` = e2.`manager_id`
  249. );
  250. #13.各个部门中 最高工资中最低的那个部门的 最低工资是多少?
  251. #方式1:
  252. SELECT MIN(salary)
  253. FROM employees
  254. WHERE department_id = (
  255. SELECT department_id
  256. FROM employees
  257. GROUP BY department_id
  258. HAVING MAX(salary) = (
  259. SELECT MIN(max_sal)
  260. FROM (
  261. SELECT MAX(salary) max_sal
  262. FROM employees
  263. GROUP BY department_id
  264. ) t_dept_max_sal
  265. )
  266. );
  267. SELECT *
  268. FROM employees
  269. WHERE department_id = 10;
  270. #方式2:
  271. SELECT MIN(salary)
  272. FROM employees
  273. WHERE department_id = (
  274. SELECT department_id
  275. FROM employees
  276. GROUP BY department_id
  277. HAVING MAX(salary) <= ALL (
  278. SELECT MAX(salary)
  279. FROM employees
  280. GROUP BY department_id
  281. )
  282. );
  283. #方式3:
  284. SELECT MIN(salary)
  285. FROM employees
  286. WHERE department_id = (
  287. SELECT department_id
  288. FROM employees
  289. GROUP BY department_id
  290. HAVING MAX(salary) = (
  291. SELECT MAX(salary) max_sal
  292. FROM employees
  293. GROUP BY department_id
  294. ORDER BY max_sal ASC
  295. LIMIT 0,1
  296. )
  297. );
  298. #方式4:
  299. SELECT MIN(salary)
  300. FROM employees e,(
  301. SELECT department_id,MAX(salary) max_sal
  302. FROM employees
  303. GROUP BY department_id
  304. ORDER BY max_sal ASC
  305. LIMIT 0,1
  306. ) t_dept_max_sal
  307. WHERE e.department_id = t_dept_max_sal.department_id
  308. #14.查询平均工资最高的部门的 manager 的详细信息: last_name, department_id, email, salary
  309. #方式1:
  310. SELECT last_name, department_id, email, salary
  311. FROM employees
  312. WHERE employee_id = ANY (
  313. SELECT DISTINCT manager_id
  314. FROM employees
  315. WHERE department_id = (
  316. SELECT department_id
  317. FROM employees
  318. GROUP BY department_id
  319. HAVING AVG(salary) = (
  320. SELECT MAX(avg_sal)
  321. FROM (
  322. SELECT AVG(salary) avg_sal
  323. FROM employees
  324. GROUP BY department_id
  325. ) t_dept_avg_sal
  326. )
  327. )
  328. );
  329. #方式2:
  330. SELECT last_name, department_id, email, salary
  331. FROM employees
  332. WHERE employee_id = ANY (
  333. SELECT DISTINCT manager_id
  334. FROM employees
  335. WHERE department_id = (
  336. SELECT department_id
  337. FROM employees
  338. GROUP BY department_id
  339. HAVING AVG(salary) >= ALL (
  340. SELECT AVG(salary) avg_sal
  341. FROM employees
  342. GROUP BY department_id
  343. )
  344. )
  345. );
  346. #方式3:
  347. SELECT last_name, department_id, email, salary
  348. FROM employees
  349. WHERE employee_id IN (
  350. SELECT DISTINCT manager_id
  351. FROM employees e,(
  352. SELECT department_id,AVG(salary) avg_sal
  353. FROM employees
  354. GROUP BY department_id
  355. ORDER BY avg_sal DESC
  356. LIMIT 0,1
  357. ) t_dept_avg_sal
  358. WHERE e.`department_id` = t_dept_avg_sal.department_id
  359. );
  360. #15. 查询部门的部门号,其中不包括job_id是"ST_CLERK"的部门号
  361. #方式1:
  362. SELECT department_id
  363. FROM departments
  364. WHERE department_id NOT IN (
  365. SELECT DISTINCT department_id
  366. FROM employees
  367. WHERE job_id = 'ST_CLERK'
  368. );
  369. #方式2:
  370. SELECT department_id
  371. FROM departments d
  372. WHERE NOT EXISTS (
  373. SELECT *
  374. FROM employees e
  375. WHERE d.`department_id` = e.`department_id`
  376. AND e.`job_id` = 'ST_CLERK'
  377. );
  378. #16. 选择所有没有管理者的员工的last_name
  379. SELECT last_name
  380. FROM employees emp
  381. WHERE NOT EXISTS (
  382. SELECT *
  383. FROM employees mgr
  384. WHERE emp.`manager_id` = mgr.`employee_id`
  385. );
  386. #17.查询员工号、姓名、雇用时间、工资,其中员工的管理者为 'De Haan'
  387. #方式1:
  388. SELECT employee_id,last_name,hire_date,salary
  389. FROM employees
  390. WHERE manager_id IN (
  391. SELECT employee_id
  392. FROM employees
  393. WHERE last_name = 'De Haan'
  394. );
  395. #方式2:
  396. SELECT employee_id,last_name,hire_date,salary
  397. FROM employees e1
  398. WHERE EXISTS (
  399. SELECT *
  400. FROM employees e2
  401. WHERE e1.`manager_id` = e2.`employee_id`
  402. AND e2.last_name = 'De Haan'
  403. );
  404. #18.查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资(相关子查询)
  405. #方式1:使用相关子查询
  406. SELECT last_name,salary,department_id
  407. FROM employees e1
  408. WHERE salary > (
  409. SELECT AVG(salary)
  410. FROM employees e2
  411. WHERE department_id = e1.`department_id`
  412. );
  413. #方式2:在FROM中声明子查询
  414. SELECT e.last_name,e.salary,e.department_id
  415. FROM employees e,(
  416. SELECT department_id,AVG(salary) avg_sal
  417. FROM employees
  418. GROUP BY department_id) t_dept_avg_sal
  419. WHERE e.department_id = t_dept_avg_sal.department_id
  420. AND e.salary > t_dept_avg_sal.avg_sal
  421. #19.查询每个部门下的部门人数大于 5 的部门名称(相关子查询)
  422. SELECT department_name
  423. FROM departments d
  424. WHERE 5 < (
  425. SELECT COUNT(*)
  426. FROM employees e
  427. WHERE d.department_id = e.`department_id`
  428. );
  429. #20.查询每个国家下的部门个数大于 2 的国家编号(相关子查询)
  430. SELECT * FROM locations;
  431. SELECT country_id
  432. FROM locations l
  433. WHERE 2 < (
  434. SELECT COUNT(*)
  435. FROM departments d
  436. WHERE l.`location_id` = d.`location_id`
  437. );
  438. /*
  439. 子查询的编写技巧(或步骤):① 从里往外写 ② 从外往里写
  440. 如何选择?
  441. ① 如果子查询相对较简单,建议从外往里写。一旦子查询结构较复杂,则建议从里往外写
  442. ② 如果是相关子查询的话,通常都是从外往里写。
  443. */

第10章_创建和管理表

练习1

题目:

  1. #1. 创建数据库test01_office,指明字符集为utf8。并在此数据库下执行下述操作
  2. #2. 创建表dept01 /*字段 类型 id INT(7) NAME VARCHAR(25) */
  3. #3. 将表departments中的数据插入新表dept02中
  4. #4. 创建表emp01 /*字段 类型 id INT(7)
  5. first_name VARCHAR (25) last_name VARCHAR(25) dept_id INT(7) */
  6. #5. 将列last_name的长度增加到50
  7. #6. 根据表employees创建emp02
  8. #7. 删除表emp01
  9. #8. 将表emp02重命名为emp01
  10. #9.在表dept02和emp01中添加新列test_column,并检查所作的操作
  11. #10.直接删除表emp01中的列 department_id

答案:

  1. # 第10章_创建和管理表的课后练习
  2. #练习1:
  3. #1. 创建数据库test01_office,指明字符集为utf8。并在此数据库下执行下述操作
  4. CREATE DATABASE IF NOT EXISTS test01_office CHARACTER SET 'utf8';
  5. USE test01_office;
  6. #2. 创建表dept01
  7. /*
  8. 字段 类型
  9. id INT(7)
  10. NAME VARCHAR(25)
  11. */
  12. CREATE TABLE IF NOT EXISTS dept01(
  13. id INT(7),
  14. `name` VARCHAR(25)
  15. );
  16. #3.将表departments中的数据插入新表dept02中
  17. CREATE TABLE dept02
  18. AS
  19. SELECT *
  20. FROM atguigudb.departments;
  21. #4. 创建表emp01
  22. /*
  23. 字段 类型
  24. id INT(7)
  25. first_name VARCHAR (25)
  26. last_name VARCHAR(25)
  27. dept_id INT(7)
  28. */
  29. CREATE TABLE emp01(
  30. id INT(7),
  31. first_name VARCHAR(25),
  32. last_name VARCHAR(25),
  33. dept_id INT(7)
  34. );
  35. #5.将列last_name的长度增加到50
  36. DESC emp01;
  37. ALTER TABLE emp01
  38. MODIFY last_name VARCHAR(50);
  39. #6.根据表employees创建emp02
  40. CREATE TABLE emp02
  41. AS
  42. SELECT *
  43. FROM atguigudb.`employees`;
  44. SHOW TABLES FROM test01_office;
  45. #7.删除表emp01
  46. DROP TABLE emp01;
  47. #8.将表emp02重命名为emp01
  48. #alter table emp02 rename to emp01;
  49. RENAME TABLE emp02 TO emp01;
  50. #9.在表dept02和emp01中添加新列test_column,并检查所作的操作
  51. ALTER TABLE emp01 ADD test_column VARCHAR(10);
  52. DESC emp01;
  53. ALTER TABLE dept02 ADD test_column VARCHAR(10);
  54. DESC dept02;
  55. #10.直接删除表emp01中的列 department_id
  56. ALTER TABLE emp01
  57. DROP COLUMN department_id;
  58. #练习2:
  59. #练习3:

练习2

  1. # 1、创建数据库 test02_market
  2. # 2、创建数据表 customers

练习篇 - 图1

  1. # 3、将 c_contact 字段移动到 c_birth 字段后面
  2. # 4、将 c_name 字段数据类型改为 varchar(70)
  3. # 5、将c_contact字段改名为c_phone
  4. # 6、增加c_gender字段到c_name后面,数据类型为char(1)
  5. # 7、将表名改为customers_info
  6. # 8、删除字段c_city

答案:

  1. # 1、创建数据库 test02_market
  2. CREATE DATABASE IF NOT EXISTS test02_market CHARACTER SET 'utf8';
  3. USE test02_market;
  4. SHOW CREATE DATABASE test02_market;
  5. # 2、创建数据表 customers
  6. CREATE TABLE IF NOT EXISTS customers(
  7. c_num INT,
  8. c_name VARCHAR(50),
  9. c_contact VARCHAR(50),
  10. c_city VARCHAR(50),
  11. c_birth DATE
  12. );
  13. SHOW TABLES;
  14. # 3、将 c_contact 字段移动到 c_birth 字段后面
  15. DESC customers;
  16. ALTER TABLE customers
  17. MODIFY c_contact VARCHAR(50) AFTER c_birth;
  18. # 4、将 c_name 字段数据类型改为 varchar(70)
  19. ALTER TABLE customers
  20. MODIFY c_name VARCHAR(70) ;
  21. # 5、将c_contact字段改名为c_phone
  22. ALTER TABLE customers
  23. CHANGE c_contact c_phone VARCHAR(50);
  24. # 6、增加c_gender字段到c_name后面,数据类型为char(1)
  25. ALTER TABLE customers
  26. ADD c_gender CHAR(1) AFTER c_name;
  27. # 7、将表名改为customers_info
  28. RENAME TABLE customers
  29. TO customers_info;
  30. DESC customers_info;
  31. # 8、删除字段c_city
  32. ALTER TABLE customers_info
  33. DROP COLUMN c_city;

练习3

  1. # 1、创建数据库test03_company # 2、创建表offices

练习篇 - 图2

  1. # 3、创建表employees

练习篇 - 图3

  1. # 4、将表employees的mobile字段修改到code字段后面
  2. # 5、将表employees的birth字段改名为birthday
  3. # 6、修改sex字段,数据类型为char(1)
  4. # 7、删除字段note
  5. # 8、增加字段名favoriate_activity,数据类型为varchar(100)
  6. # 9、将表employees的名称修改为 employees_info

答案:

  1. # 1、创建数据库test03_company
  2. CREATE DATABASE IF NOT EXISTS test03_company CHARACTER SET 'utf8';
  3. USE test03_company;
  4. # 2、创建表offices
  5. CREATE TABLE IF NOT EXISTS offices(
  6. officeCode INT,
  7. city VARCHAR(30),
  8. address VARCHAR(50),
  9. country VARCHAR(50),
  10. postalCode VARCHAR(25)
  11. );
  12. DESC offices;
  13. # 3、创建表employees
  14. CREATE TABLE IF NOT EXISTS employees(
  15. empNum INT,
  16. lastName VARCHAR(50),
  17. firstName VARCHAR(50),
  18. mobile VARCHAR(25),
  19. `code` INT,
  20. jobTitle VARCHAR(50),
  21. birth DATE,
  22. note VARCHAR(255),
  23. sex VARCHAR(5)
  24. );
  25. DESC employees;
  26. # 4、将表employees的mobile字段修改到code字段后面
  27. ALTER TABLE employees
  28. MODIFY mobile VARCHAR(20) AFTER `code`;
  29. # 5、将表employees的birth字段改名为birthday
  30. ALTER TABLE employees
  31. CHANGE birth birthday DATE;
  32. # 6、修改sex字段,数据类型为char(1)
  33. ALTER TABLE employees
  34. MODIFY sex CHAR(1);
  35. # 7、删除字段note
  36. ALTER TABLE employees
  37. DROP COLUMN note;
  38. # 8、增加字段名favoriate_activity,数据类型为varchar(100)
  39. ALTER TABLE employees
  40. ADD favoriate_activity VARCHAR(100);
  41. # 9、将表employees的名称修改为 employees_info
  42. RENAME TABLE employees TO employees_info;
  43. DESC employees_info;

11章_数据处理之增删改

练习1

题目

  1. #1. 创建数据库dbtest11
  2. CREATE DATABASE IF NOT EXISTS dbtest11 CHARACTER SET 'utf8';
  3. #2. 运行以下脚本创建表my_employees
  4. USE dbtest11;
  5. CREATE TABLE my_employees( id INT(10),
  6. first_name VARCHAR(10),
  7. last_name VARCHAR(10),
  8. userid VARCHAR(10),
  9. alary DOUBLE(10,2) );
  10. CREATE TABLE users(
  11. id INT,
  12. userid VARCHAR(10),
  13. department_id INT );
  14. #3. 显示表my_employees的结构
  15. #4. 向my_employees表中插入下列数据
  16. ID FIRST_NAME LAST_NAME USERID SALARY
  17. 1 patel Ralph Rpatel 895
  18. 2 Dancs Betty Bdancs 860
  19. 3 Biri Ben Bbiri 1100
  20. 4 Newman Chad Cnewman 750
  21. 5 Ropeburn Audrey Aropebur 1550
  22. #5. 向users表中插入数据
  23. 1 Rpatel 10
  24. 2 Bdancs 10
  25. 3 Bbiri 20
  26. 4 Cnewman 30
  27. 5 Aropebur 40
  28. #6. 将3号员工的last_name修改为“drelxer”
  29. #7. 将所有工资少于900的员工的工资修改为1000
  30. #8. 将userid为Bbiri的user表和my_employees表的记录全部删除
  31. #9. 删除my_employees、users表所有数据
  32. #10. 检查所作的修正
  33. #11. 清空表my_employees

答案:

  1. #第11章_数据处理之增删改的课后练习
  2. #练习1:
  3. #1. 创建数据库dbtest11
  4. CREATE DATABASE IF NOT EXISTS dbtest11 CHARACTER SET 'utf8';
  5. #2. 运行以下脚本创建表my_employees
  6. USE dbtest11;
  7. CREATE TABLE my_employees(
  8. id INT(10),
  9. first_name VARCHAR(10),
  10. last_name VARCHAR(10),
  11. userid VARCHAR(10),
  12. salary DOUBLE(10,2)
  13. );
  14. CREATE TABLE users(
  15. id INT,
  16. userid VARCHAR(10),
  17. department_id INT
  18. );
  19. #3.显示表my_employees的结构
  20. DESC my_employees;
  21. DESC users;
  22. #4.向my_employees表中插入下列数据
  23. ID FIRST_NAME LAST_NAME USERID SALARY
  24. 1 patel Ralph Rpatel 895
  25. 2 Dancs Betty Bdancs 860
  26. 3 Biri Ben Bbiri 1100
  27. 4 Newman Chad Cnewman 750
  28. 5 Ropeburn Audrey Aropebur 1550
  29. INSERT INTO my_employees
  30. VALUES(1,'patel','Ralph','Rpatel',895);
  31. INSERT INTO my_employees VALUES
  32. (2,'Dancs','Betty','Bdancs',860),
  33. (3,'Biri','Ben','Bbiri',1100),
  34. (4,'Newman','Chad','Cnewman',750),
  35. (5,'Ropeburn','Audrey','Aropebur',1550);
  36. SELECT * FROM my_employees;
  37. DELETE FROM my_employees;
  38. #方式2:
  39. INSERT INTO my_employees
  40. SELECT 1,'patel','Ralph','Rpatel',895 UNION ALL
  41. SELECT 2,'Dancs','Betty','Bdancs',860 UNION ALL
  42. SELECT 3,'Biri','Ben','Bbiri',1100 UNION ALL
  43. SELECT 4,'Newman','Chad','Cnewman',750 UNION ALL
  44. SELECT 5,'Ropeburn','Audrey','Aropebur',1550;
  45. #5.向users表中插入数据
  46. 1 Rpatel 10
  47. 2 Bdancs 10
  48. 3 Bbiri 20
  49. 4 Cnewman 30
  50. 5 Aropebur 40
  51. INSERT INTO users VALUES
  52. (1,'Rpatel',10),
  53. (2,'Bdancs',10),
  54. (3,'Bbiri',20),
  55. (4,'Cnewman',30),
  56. (5,'Aropebur',40)
  57. SELECT * FROM users;
  58. #6. 将3号员工的last_name修改为“drelxer”
  59. UPDATE my_employees
  60. SET last_name = 'drelxer'
  61. WHERE id = 3;
  62. #7. 将所有工资少于900的员工的工资修改为1000
  63. UPDATE my_employees
  64. SET salary = 1000
  65. WHERE salary < 900;
  66. #8. 将userid为Bbiri的users表和my_employees表的记录全部删除
  67. #方式1:
  68. DELETE FROM my_employees
  69. WHERE userid = 'Bbiri';
  70. DELETE FROM users
  71. WHERE userid = 'Bbiri';
  72. #方式2:
  73. DELETE m,u
  74. FROM my_employees m
  75. JOIN users u
  76. ON m.userid = u.userid
  77. WHERE m.userid = 'Bbiri';
  78. SELECT * FROM my_employees;
  79. SELECT * FROM users;
  80. #9. 删除my_employees、users表所有数据
  81. DELETE FROM my_employees;
  82. DELETE FROM users;
  83. #10. 检查所作的修正
  84. SELECT * FROM my_employees;
  85. SELECT * FROM users;
  86. #11. 清空表my_employees
  87. TRUNCATE TABLE my_employees;

练习2

  1. # 1. 使用现有数据库dbtest11
  2. # 2. 创建表格pet
  1. # 3. 添加记录

练习篇 - 图4

  1. # 4. 添加字段:主人的生日owner_birth DATE类型。
  2. # 5. 将名称为Claws的猫的主人改为kevin
  3. # 6. 将没有死的狗的主人改为duck
  4. # 7. 查询没有主人的宠物的名字;
  5. # 8. 查询已经死了的cat的姓名,主人,以及去世时间;
  6. # 9. 删除已经死亡的狗
  7. # 10. 查询所有宠物信息

答案:

  1. #练习2:
  2. # 1. 使用现有数据库dbtest11
  3. USE dbtest11;
  4. # 2. 创建表格pet
  5. CREATE TABLE pet(
  6. NAME VARCHAR(20),
  7. OWNER VARCHAR(20),
  8. species VARCHAR(20),
  9. sex CHAR(1),
  10. birth YEAR,
  11. death YEAR
  12. );
  13. DESC pet;
  14. # 3. 添加记录
  15. INSERT INTO pet VALUES
  16. ('Fluffy','harold','Cat','f','2003','2010'),
  17. ('Claws','gwen','Cat','m','2004',NULL),
  18. ('Buffy',NULL,'Dog','f','2009',NULL),
  19. ('Fang','benny','Dog','m','2000',NULL),
  20. ('bowser','diane','Dog','m','2003','2009'),
  21. ('Chirpy',NULL,'Bird','f','2008',NULL);
  22. SELECT *
  23. FROM pet;
  24. # 4. 添加字段:主人的生日owner_birth DATE类型。
  25. ALTER TABLE pet
  26. ADD owner_birth DATE;
  27. # 5. 将名称为Claws的猫的主人改为kevin
  28. UPDATE pet
  29. SET OWNER = 'kevin'
  30. WHERE NAME = 'Claws' AND species = 'Cat';
  31. # 6. 将没有死的狗的主人改为duck
  32. UPDATE pet
  33. SET OWNER = 'duck'
  34. WHERE death IS NULL AND species = 'Dog';
  35. # 7. 查询没有主人的宠物的名字;
  36. SELECT NAME
  37. FROM pet
  38. WHERE OWNER IS NULL;
  39. # 8. 查询已经死了的cat的姓名,主人,以及去世时间;
  40. SELECT NAME,OWNER,death
  41. FROM pet
  42. WHERE death IS NOT NULL;
  43. # 9. 删除已经死亡的狗
  44. DELETE FROM pet
  45. WHERE death IS NOT NULL
  46. AND species = 'Dog';
  47. # 10. 查询所有宠物信息
  48. SELECT *
  49. FROM pet;

练习3

  1. # 1. 使用已有的数据库dbtest11
  2. # 2. 创建表employee,并添加记录

练习篇 - 图5

  1. # 3. 查询出薪资在1200~1300之间的员工信息。
  2. # 4. 查询出姓“刘”的员工的工号,姓名,家庭住址。
  3. # 5. 将“李四”的家庭住址改为“广东韶关”
  4. # 6. 查询出名字中带“小”的员工

答案:

  1. #练习3:
  2. # 1. 使用已有的数据库dbtest11
  3. USE dbtest11;
  4. # 2. 创建表employee,并添加记录
  5. CREATE TABLE employee(
  6. id INT,
  7. NAME VARCHAR(15),
  8. sex CHAR(1),
  9. tel VARCHAR(25),
  10. addr VARCHAR(35),
  11. salary DOUBLE(10,2)
  12. );
  13. INSERT INTO employee VALUES
  14. (10001,'张一一','男','13456789000','山东青岛',1001.58),
  15. (10002,'刘小红','女','13454319000','河北保定',1201.21),
  16. (10003,'李四','男','0751-1234567','广东佛山',1004.11),
  17. (10004,'刘小强','男','0755-5555555','广东深圳',1501.23),
  18. (10005,'王艳','男','020-1232133','广东广州',1405.16);
  19. SELECT * FROM employee;
  20. # 3. 查询出薪资在1200~1300之间的员工信息。
  21. SELECT *
  22. FROM employee
  23. WHERE salary BETWEEN 1200 AND 1300;
  24. # 4. 查询出姓“刘”的员工的工号,姓名,家庭住址。
  25. SELECT id,NAME,addr
  26. FROM employee
  27. WHERE NAME LIKE '刘%';
  28. # 5. 将“李四”的家庭住址改为“广东韶关”
  29. UPDATE employee
  30. SET addr = '广东韶关'
  31. WHERE NAME = '李四';
  32. # 6. 查询出名字中带“小”的员工
  33. SELECT *
  34. FROM employee
  35. WHERE NAME LIKE '%小%';

第13章_约束

基础练习:

练习1

已经存在数据库

test04_emp,两张表emp2和dept2

  1. CREATE DATABASE test04_emp;
  2. use test04_emp;
  3. CREATE TABLE emp2( id INT, emp_name VARCHAR(15) );
  4. CREATE TABLE dept2( id INT, dept_name VARCHAR(15) );

题目:

  1. #1.向表emp2的id列中添加PRIMARY KEY约束
  2. #2. 向表dept2的id列中添加PRIMARY KEY约束
  3. #3. 向表emp2中添加列dept_id,并在其中定义FOREIGN KEY约束,与之相关联的列是dept2表中的id列。

答案

  1. #1.向表emp2的id列中添加PRIMARY KEY约束
  2. ALTER TABLE emp2 MODIFY COLUMN id INT PRIMARY KEY; ALTER TABLE emp2 ADD PRIMARY KEY(id);
  3. #2. 向表dept2的id列中添加PRIMARY KEY约束
  4. ALTER TABLE dept2 MODIFY COLUMN id INT PRIMARY KEY;
  5. ALTER TABLE dept2 ADD PRIMARY KEY(id);
  6. #3. 向表emp2中添加列dept_id,并在其中定义FOREIGN KEY约束,与之相关联的列是dept2表中的id列。
  7. ALTER TABLE emp2 ADD COLUMN dept_id INT; ALTER TABLE emp2 ADD CONSTRAINT fk_emp2_deptid FOREIGN KEY(dept_id) REFERENCES dept2(id);

练习2

承接《第11章_数据处理之增删改》的综合案例。

  1. # 1、创建数据库test01_library
  2. # 2、创建表 books,表结构如下
  1. # 3、使用ALTER语句给books按如下要求增加相应的约束

答案:

  1. # 1、2、略
  2. # 3、使用ALTER语句给books按如下要求增加相应的约束 #给id增加主键约束
  3. ALTER TABLE books ADD PRIMARY KEY(id); #给id字段增加自增约束
  4. ALTER TABLE books MODIFY id INT AUTO_INCREMENT; #给name等字段增加非空约束
  5. ALTER TABLE books name VARCHAR(50) NOT NULL;
  6. ALTER TABLE books `authors` VARCHAR(100) NOT NULL;
  7. ALTER TABLE books price FLOAT NOT NULL;
  8. ALTER TABLE books pubdate DATE NOT NULL;
  9. ALTER TABLE books num INT NOT NULL;

练习3

题目:

  1. #1. 创建数据库test04_company
  2. #2. 按照下表给出的表结构在test04_company数据库中创建两个数据表offices和employees

offices表:

练习篇 - 图6

employees表:

练习篇 - 图7

  1. #3. 将表employees的mobile字段修改到officeCode字段后面
  2. #4. 将表employees的birth字段改名为employee_birth
  3. #5. 修改sex字段,数据类型为CHAR(1),非空约束
  4. #6. 删除字段note
  5. #7. 增加字段名favoriate_activity,数据类型为VARCHAR(100)
  6. #8. 将表employees名称修改为employees_info

答案:

  1. #1. 创建数据库test04_company
  2. CREATE DATABASE test04_company;
  3. #2. 按照下表给出的表结构在test04_company数据库中创建两个数据表offices和employees
  4. USE test04_company;
  5. CREATE TABLE offices(
  6. officeCode INT(10) ,
  7. city VARCHAR(50) NOT NULL,
  8. address VARCHAR(50),
  9. country VARCHAR(50) NOT NULL,
  10. postalCode VARCHAR(15) UNIQUE,
  11. PRIMARY KEY(officeCode) );
  12. CREATE TABLE employees(
  13. employeeNumber INT(11) PRIMARY KEY AUTO_INCREMENT,
  14. lastName VARCHAR(50) NOT NULL,
  15. firstName VARCHAR(50) NOT NULL,
  16. mobile VARCHAR(25) UNIQUE, officeCode INT(10) NOT NULL,
  17. jobTitle VARCHAR(50) NOT NULL, birth DATETIME NOT NULL,
  18. note VARCHAR(255), sex VARCHAR(5),
  19. CONSTRAINT fk_emp_ofCode FOREIGN KEY(officeCode) REFERENCES offices(officeCode) );
  20. #3. 将表employees的mobile字段修改到officeCode字段后面
  21. ALTER TABLE employees MODIFY mobile VARCHAR(25) AFTER officeCode;
  22. #4. 将表employees的birth字段改名为employee_birth
  23. ALTER TABLE employees CHANGE birth employee_birth DATETIME;
  24. #5. 修改sex字段,数据类型为CHAR(1),非空约束
  25. ALTER TABLE employees MODIFY sex CHAR(1) NOT NULL;
  26. #6. 删除字段note
  27. ALTER TABLE employees DROP COLUMN note;
  28. #7. 增加字段名favoriate_activity,数据类型为VARCHAR(100)
  29. ALTER TABLE employees ADD favoriate_activity VARCHAR(100);
  30. #8. 将表employees名称修改为employees_info
  31. ALTER TABLE employees RENAME employees_info;

拓展练习:

练习1

创建数据库test04_Market,在test04_Market中创建数据表customers。customers表结构如下所示,按以下

要求进行操作。

练习篇 - 图8

  1. 1)创建数据库test04_Market
  2. 2)创建数据表customers,在c_num字段上添加主键约束和自增约
  3. 束,在c_birth字段上添加非空约束。
  4. 3)将c_contact字段插入c_birth字段后面。
  5. 4)将c_name字段数据类型改为VARCHAR(70)。
  6. 5)将c_contact字段改名为c_phone
  7. 6)增加c_gender字段,数据类型为CHAR(1)。
  8. 7)将表名修改为customers_info
  9. 8)删除字段c_city test04_Market中创建数据表ordersorders表结构如下所示,按以下要求进行操作。

练习篇 - 图9

  1. 1)创建数据表orders,在o_num字段上添加主键约束和自增约束,在c_id字段上添加外键约束,关联
  2. customers表中的主键c_num
  3. 2)删除orders表的外键约束,然后删除表customers

练习2

  1. 创建数据表pet,并对表进行插入、更新与删除操作。pet表结构如下表所示。
  2. 1)首先创建数据表
  3. pet,使用不同的方法将表记录插入到pet表中。
  4. 2)使用UPDATE语句将名称为Fang的狗的主人改为
  5. Kevin
  6. 3)将没有主人的宠物的owner字段值都改为Duck
  7. 4)删除已经死亡的宠物记录。
  8. 5)删除所有表中的记录。

pet表结构:

练习篇 - 图10

pet表中记录:

练习篇 - 图11

练习3

  1. 1、创建数据库:test_company
  2. 2、在此数据库下创建如下3表,数据类型,宽度,是否为空根据实际情况自己定义。
  3. A 部门表(department :部门编号(depid),部门名称(depname),部门简介(deinfo);其中
  4. 部门编号为主键。
  5. B 雇员表(emoloyee :雇员编号(empid),姓名(name),性别(sex),职称(title),出生日
  6. 期(birthday),所在部门编号(depid);其中
  7. * 雇员编号为主键;
  8. * 部门编号为外键,外键约束等级为(on update cascade on delete set null);
  9. * 性别默认为男
  10. C 工资表(salary :雇员编号(empid),基本工资(basesalary),职务工资(titlesalary),扣
  11. 除(deduction)。其中雇员编号为主键。
  12. 3、给工资表(salary)的雇员编号(empid)增加外键约束,外键约束等级为(on update cascade on delete cascade
  13. C 工资表(salary :雇员编号(empid),基本工资(basesalary),职务工资(titlesalary),扣
  14. 除(deduction)。其中雇员编号为主键。
  15. 3、给工资表(salary)的雇员编号(empid)增加外键约束,外键约束等级为(on update cascade on delete cascade
  16. 4、添加数据如下:

部门表:

练习篇 - 图12

雇员表:

练习篇 - 图13

工资表:

练习篇 - 图14

  1. 5、查询出每个雇员的雇员编号,姓名,职称,所在部门名称,应发工资(基本工资+职务工资),实发
  2. 工资(基本工资+职务工资-扣除)。
  3. 6、查询销售部门的雇员姓名及其基本工资
  4. 7、查询姓“张”且年龄小于40的员工的全部信息和年龄
  5. 8、查询所有男员工的基本工资和职务工资
  6. 9、查询基本工资低于2000的员工姓名和职称、所在部门名称
  7. 10、查询员工总数
  8. 11、查询部门总数
  9. 12、查询应发工资的平均工资和最高工资、最低工资
  10. 13、按照部门统计应发工资的平均工资
  11. 14、找出部门基本工资的平均工资低于2000 15、按照员工编号、姓名、基本工资、职务工资、扣除,并按照职务升序排列,如果职务工资相同,再
  12. 按照基本工资升序排列
  13. 16、查询员工编号、姓名,出生日期,及年龄段。其中,如果80年之前出生的,定为”老年“;80后定为”
  14. 中年“,90后定为”青壮年“ 17、查询所有的员工信息,和他所在的部门名称
  15. 18、查询所有部门信息,和该部门的员工信息
  16. 19、查询所有职位中含“工程师”的男员工的人数
  17. 20、查询每个部门的男生和女生的人数和平均基本工资
  1. #创建数据库:test_company
  2. CREATE DATABASE test_company;
  3. #使用数据库test_company USE test_company;
  4. #创建部门表(department)
  5. CREATE TABLE department(
  6. depid INT PRIMARY KEY,
  7. depname VARCHAR(20) NOT NULL,
  8. deinfo VARCHAR(50) );#创建雇员表(emoloyee
  9. CREATE TABLE employee(
  10. empid INT PRIMARY KEY,
  11. `name` VARCHAR(20) NOT NULL,
  12. sex CHAR NOT NULL DEFAULT '男',
  13. title VARCHAR(20) NOT NULL,
  14. birthday DATE, depid INT,
  15. FOREIGN KEY(depid) REFERENCES department(depid) ON UPDATE CASCADE ON DELETE SET NULL );
  16. #创建工资表(salary)
  17. CREATE TABLE salary(
  18. empid INT PRIMARY KEY,
  19. basesalary DOUBLE,
  20. titlesalary DOUBLE,
  21. deduction DOUBLE );
  22. #给工资表(salary)的雇员编号(empid)增加外键约束,外键约束等级为(on update cascade 和on delete cascade)
  23. ALTER TABLE salary ADD FOREIGN KEY empid REFERENCES employee(empid) ON UPDATE CASCADE ON DELETE CASCADE;
  24. #添加部门表数据
  25. INSERT INTO department
  26. VALUES
  27. (111,'生产部',NULL),
  28. (222,'销售部',NULL)
  29. (333,'人事部','人力资源管理');
  30. #添加雇员表
  31. INSERT INTO employee
  32. VALUES
  33. (1001,'张三',DEFAULT,'高级工程师','1975-1-1',111),
  34. (1002,'李四','女','助工','1985-1-1',111),
  35. (1003,'王五','男','工程师','1978-11-11',222),
  36. (1004,'张六',DEFAULT,'工程师','1999-1-1',222);
  37. #添加工资表
  38. INSERT INTO salary
  39. VALUES
  40. (1001,2200,1100,200),
  41. (1002,1200,200,NULL),
  42. (1003,2900,700,200),
  43. (1004,1950,700,150);
  44. /*查询出每个雇员的雇员编号,姓名,职称,所在部门名称, 应发工资(基本工资+职务工资), 实发工资(基本工资+职务工资-扣除)。 */
  45. SELECT employee.empid,`name`,title,depname, basesalary+titlesalary
  46. AS "应发工资", basesalary+titlesalary-IFNULL(deduction,0) AS "实发工资"
  47. FROM department INNER JOIN employee INNER JOIN salary
  48. ON department.depid = employee.depid
  49. AND employee.empid = salary.empid;
  50. #查询销售部门的雇员姓名及其基本工资
  51. SELECT `name`,basesalary
  52. FROM department INNER JOIN employee INNER JOIN salary
  53. ON department.depid = employee.depid
  54. AND employee.empid = salary.empid WHERE department.depname = '销售部';
  55. #查询姓“张”且年龄小于40的员工的全部信息和年龄
  56. SELECT *,YEAR(CURRENT_DATE())-YEAR(birthday)
  57. AS "年龄" FROM employee WHERE `name` LIKE '张%'
  58. AND YEAR(CURRENT_DATE())-YEAR(birthday)<40;
  59. #查询所有男员工的基本工资和职务工资
  60. SELECT basesalary,titlesalary
  61. FROM employee INNER JOIN salary
  62. ON employee.empid = salary.empid
  63. WHERE employee.sex = '男';
  64. #查询基本工资低于2000的员工姓名和职称、所在部门名称
  65. SELECT `name`,title,depname
  66. FROM department INNER JOIN employee INNER JOIN salary
  67. ON department.depid = employee.depid
  68. AND employee.empid = salary.empid WHERE basesalary < 2000;
  69. #查询员工总数
  70. SELECT COUNT(*) FROM employee;
  71. #查询部门总数
  72. SELECT COUNT(*) FROM department;
  73. #查询应发工资的平均工资和最高应发工资、最低应发工资
  74. SELECT AVG(basesalary+titlesalary) AS "平均应发工资", MAX(basesalary+titlesalary) AS "最高应发工资", MIN(basesalary+titlesalary) AS "最低应发工资" FROM salary;
  75. #按照部门统计应发工资的平均工资
  76. SELECT depid,AVG(basesalary+titlesalary)
  77. FROM employee INNER JOIN salary
  78. ON employee.`empid` = salary.`empid`
  79. GROUP BY employee.`depid`;
  80. #找出部门基本工资的平均工资低于2000的
  81. SELECT depid,AVG(basesalary)
  82. FROM employee INNER JOIN salary
  83. ON employee.`empid` = salary.`empid`
  84. GROUP BY employee.`depid`
  85. HAVING AVG(basesalary)<2000;
  86. #按照员工编号、姓名、基本工资、职务工资、扣除,
  87. #并按照职务升序排列,如果职务工资相同,再按照基本工资升序排列
  88. SELECT emp.empid,`name`,basesalary,titlesalary,deduction
  89. FROM employee emp INNER JOIN salary
  90. ON emp.`empid` = salary.`empid`
  91. ORDER BY emp.`title` ASC , basesalary ASC;
  92. #查询员工编号、姓名,出生日期,及年龄段,其中 •
  93. #如果80年之前出生的,定为”老年“;80后定为”中年“,90后定为”青壮年“
  94. SELECT empid,`name`,birthday,
  95. CASE
  96. WHEN YEAR(birthday)<1980 THEN '老年'
  97. WHEN YEAR(birthday)<1990 THEN '中年'
  98. ELSE '青壮年' END "年龄段" FROM employee;
  99. #查询所有的员工信息,和他所在的部门名称
  100. SELECT emp.*,depname
  101. FROM employee emp LEFT JOIN department dep
  102. ON emp.`depid` = dep.`depid`;
  103. #查询所有部门信息,和该部门的员工信息
  104. SELECT dep.*,emp.*
  105. FROM employee emp RIGHT JOIN department dep
  106. ON emp.`depid` = dep.`depid`;
  107. #查询所有职位中含“工程师”的男员工的人数
  108. SELECT COUNT(*)
  109. FROM employee
  110. WHERE sex='男'
  111. AND title LIKE '%工程师%';
  112. #查询每个部门的男生和女生的人数和平均基本工资
  113. SELECT dep.depid,sex,COUNT(*),AVG(basesalary)
  114. FROM department dep INNER JOIN employee INNER JOIN salary
  115. ON dep.depid = employee.depid
  116. AND employee.empid = salary.empid
  117. GROUP BY dep.depid,sex;

练习4

  1. 1、创建一个数据库:test_school 2、创建如下表格
  2. 1 Department表的定义

练习篇 - 图15

表2 Teacher表的定义

练习篇 - 图16

3、添加记录

练习篇 - 图17

练习篇 - 图18

  1. 4、用SELECT语句查询Teacher表的所有记录。
  2. 5、找出所有其家庭地址中含有“北京”的教师的教工号及部门名称,要求显示结果中各列标题用中文别名
  3. 表示。
  4. 6、获得Teacher表中工资最高的教工号和姓名。
  5. 7、找出所有收入在25004000之间的教工号。
  6. 8、查找在网络技术系工作的教师的姓名、性别和工资。
  1. #创建一个数据库:test_school
  2. CREATE DATABASE test_school;
  3. #使用数据库 USE test_school;
  4. #创建表格
  5. -- 部门信息表Department
  6. CREATE TABLE Department(
  7. DepNo INT(10) PRIMARY KEY,
  8. DepName VARCHAR(20) NOT NULL,
  9. DepNote VARCHAR(50) );
  10. -- 创建数据表Teacher
  11. CREATE TABLE Teacher(
  12. Number INT PRIMARY KEY,
  13. `Name` VARCHAR(30) UNIQUE,
  14. Sex VARCHAR(4),
  15. Birth DATE,
  16. DepNo INT,
  17. Salary FLOAT,
  18. Address VARCHAR(100),
  19. FOREIGN KEY (DepNo) REFERENCES Department(DepNo) );
  20. -- 将表4的内容插入Department表中
  21. INSERT INTO Department VALUES (601,'软件技术系','软件技术等专业');
  22. INSERT INTO Department VALUES (602,'网络技术系','多媒体技术等专业');
  23. INSERT INTO Department VALUES (603,'艺术设计系','广告艺术设计等专业');
  24. INSERT INTO Department VALUES (604,'管理工程系','连锁经营管理等专业');
  25. -- 将表3的内容插入Teacher表中。
  26. INSERT INTO Teacher
  27. VALUES
  28. (2001,'Tom','女','1970-01-10',602,4500,'四川省绵阳市');
  29. INSERT INTO Teacher
  30. VALUES(2002,'Lucy','男','1983-12-18',601,2500,'北京市昌平区');
  31. INSERT INTO Teacher
  32. VALUES(2003,'Mike','男','1990-06-01',604,1500,'重庆市渝中区');
  33. INSERT INTO Teacher
  34. VALUES(2004,'James','女','1980-10-20',602,3500,'四川省成都市');
  35. INSERT INTO Teacher
  36. VALUES(2005,'Jack','男','1975-05-30',603,1200,'重庆市南岸区');
  37. #用SELECT语句查询Teacher表的所有记录。
  38. SELECT * FROM teacher;
  39. #找出所有其家庭地址中含有“北京”的教师的教工号及部门名称,要求显示结果中各列标题用中文表示。 SELECT number AS 教工号,Teacher.depno AS 部门名称
  40. FROM Teacher INNER JOIN Department
  41. ON Teacher.DepNo = Department.DepNo
  42. WHERE address LIKE '%北京%';
  43. #获得Teacher表中工资最高的教工号和姓名。
  44. SELECT number,`name` FROM teacher
  45. WHERE salary = (SELECT MAX(salary) FROM teacher);
  46. SELECT number,`name` FROM teacher ORDER BY salary DESC LIMIT 0,1;
  47. #找出所有收入在2500~4000之间的教工号。
  48. SELECT number FROM teacher WHERE salary BETWEEN 2500 AND 4000;
  49. #查找在网络技术系工作的教师的姓名、性别和工资。
  50. SELECT `name`,sex,salary FROM teacher WHERE depno=(SELECT depno FROM department WHERE depname='网络技术系');
  51. SELECT `name`,sex,salary FROM teacher INNER JOIN department ON teacher.depno = department.depno WHERE depname ='网络技术系';

练习5

  1. 1、建立数据库test_student
  2. 2、建立以下三张表,并插入记录
  3. Table:Classes

练习篇 - 图19

Table:Score

练习篇 - 图20

Table: Records

练习篇 - 图21

  1. 3、写出将张三的语文成绩修改为88SQL语句。
  2. 4、搜索出计算机维护1班各门课程的平均成绩。
  3. 5、搜索科目有不及格的人的名单。
  4. 6、查询记录2次以上的学生的姓名和各科成绩
  1. #1、建立数据库test_student
  2. CREATE DATABASE test_student;
  3. #使用数据库 USE test_student;
  4. #2、创建表格并添加记录
  5. CREATE TABLE Classes(
  6. Pro_name VARCHAR(20) NOT NULL,
  7. Grade VARCHAR(10) NOT NULL,
  8. `name` VARCHAR(10) NOT NULL,
  9. sex VARCHAR(4) NOT NULL,
  10. seat INT(10) NOT NULL UNIQUE );
  11. CREATE TABLE Score(
  12. `name` VARCHAR(10) NOT NULL,
  13. En_score INT(10) NOT NULL,
  14. Ma_score INT(10) NOT NULL,
  15. Ch_score INT(10) NOT NULL );
  16. CREATE TABLE Records(
  17. `name` VARCHAR(10) NOT NULL,
  18. record VARCHAR(10) );
  19. -- classes中添加数据
  20. INSERT INTO classes VALUES('计算机网络','1班','张三','男',8);
  21. INSERT INTO classes VALUES('软件工程','2班','李四','男',12);
  22. INSERT INTO classes VALUES('计算机维护','1班','王五','男',9);
  23. INSERT INTO classes VALUES('计算机网络','2班','LILY','女',15);
  24. INSERT INTO classes VALUES('软件工程','1班','小强','男',20);
  25. INSERT INTO classes VALUES('计算机维护','1班','CoCo','女',18);
  26. -- score中添加数据
  27. INSERT INTO Score VALUES('张三',65,75,98)
  28. INSERT INTO Score VALUES('李四',87,45,86);
  29. INSERT INTO Score VALUES('王五',98,85,65);
  30. INSERT INTO Score VALUES('LILY',75,86,87);
  31. INSERT INTO Score VALUES('小强',85,60,58);
  32. INSERT INTO Score VALUES('CoCo',96,87,70);
  33. -- records中添加数据
  34. INSERT INTO records VALUES('小强','迟到');
  35. INSERT INTO records VALUES('小强','事假');
  36. INSERT INTO records VALUES('李四','旷课');
  37. INSERT INTO records VALUES('李四','旷课');
  38. INSERT INTO records VALUES('李四','迟到');
  39. INSERT INTO records VALUES('CoCo','病假');
  40. INSERT INTO records VALUES('LILY','事假');
  41. #3、写出将张三的语文成绩修改为88的SQL语句。
  42. UPDATE score SET ch_score=88 WHERE `name`='张三';
  43. #4、搜索出计算机维护1班各门课程的平均成绩。
  44. SELECT AVG(en_score),AVG(ma_score),AVG(ch_score)
  45. FROM score
  46. WHERE `name` IN (
  47. SELECT `name`
  48. FROM classes
  49. WHERE Pro_name='计算机维护' AND grade='1 班');
  50. #5、搜索科目有不及格的人的名单。
  51. SELECT `name`
  52. FROM score
  53. WHERE en_score<60 OR ma_score<60 OR ch_score<60;
  54. #6、查询记录2次以上的学生的姓名和各科成绩。
  55. SELECT * FROM score INNER JOIN (
  56. SELECT `name`,COUNT(*)
  57. FROM Records GROUP BY `name`
  58. HAVING COUNT(*)>2) temp
  59. ON score.name = temp.name;

练习6

  1. 1、建立数据库:test_xuankedb
  2. 2、建立如下三张表:
  3. 学生表Student由学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、所在系(Sdept)五个字段,Sno 为关
  4. 键字。
  5. 课程表Course由课程号(Cno)、课程名(Cname)、选修课号(Cpno)、学分(Ccredit)四个字段,Cno为关键
  6. 字。
  7. 成绩表SG由学号(Sno)、课程号(Cno)、成绩(Grade)三个字段,(SNO, CNO)为关键字。
  8. 3、向Student表增加“入学时间(Scome)”列,其数据类型为日期型。
  9. 4、查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。
  10. 5、查询学习1号课程的学生最高分数、平均成绩。
  11. 6、查询与“李洋”在同一个系学习的学生。
  12. 7、将计算机系全体学生的成绩置零。
  13. 8、删除学生表中学号为05019的学生记录。
  14. 9、删除计算机系所有学生的成绩记录。
  1. -- 1、创建一个数据库:test_xuankedb
  2. CREATE DATABASE test_xuankedb;
  3. -- 使用数据库
  4. USE test_xuankedb;
  5. -- 2、创建学生表
  6. CREATE TABLE student(
  7. sno INT(10) PRIMARY KEY,
  8. sname VARCHAR(10),
  9. ssex VARCHAR(10),
  10. sage INT(10),
  11. sdept VARCHAR(40) );
  12. -- 创建课程表
  13. CREATE TABLE course(
  14. cno INT(10) PRIMARY KEY,
  15. cname VARCHAR(20),
  16. cpno VARCHAR(40),
  17. ccredit INT(20) );
  18. -- 创建成绩表
  19. CREATE TABLE sg(
  20. sno INT(10),
  21. cno INT(10),
  22. grade INT(3),
  23. PRIMARY KEY(sno,cno),
  24. CONSTRAINT stu_s_sno_fk FOREIGN KEY (sno) REFERENCES student(sno),
  25. CONSTRAINT cou_s_sno_fk FOREIGN KEY (cno) REFERENCES course(cno) );
  26. #3、向Student表增加“入学时间(Scome)”列,其数据类型为日期型。
  27. ALTER TABLE student ADD COLUMN scome DATE;
  28. #4、查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。
  29. SELECT sno,grade FROM sg WHERE cno=3
  30. ORDER BY grade DESC;
  31. #5、查询学习1号课程的学生最高分数、平均成绩。
  32. SELECT MAX(grade),AVG(grade)
  33. FROM sg WHERE cno=1;
  34. #6、查询与“李洋”在同一个系学习的学生。
  35. SELECT * FROM student WHERE sdept=(
  36. SELECT sdept FROM student WHERE sname='李洋');
  37. #7、将计算机系全体学生的成绩置零。
  38. UPDATE sg SET grade=0
  39. WHERE sno IN (
  40. SELECT sno FROM student WHERE sdept='计算机系')
  41. #8、删除学生表中学号为05019的学生记录。
  42. DELETE FROM student WHERE sno=05019;
  43. #9、删除计算机系所有学生的成绩记录。
  44. DELETE FROM sg WHERE sno IN (SELECT sno FROM student WHERE sdept='计算机系');

练习7

  1. 1、建立数据库:test_library 2、建立如下三个表: 表一:press 出版社 属性:编号pressid(int)、名称pressname(varchar)、地址
  2. address(varchar)
  3. 表二:sort 种类 属性:编号sortno(int)、数量scount(int)
  4. 表二:book图书 属性:编号bid(int)、名称 bname(varchar)、种类bsortno(int)、出版社编号pressid(int) 3、给sort表中添加一列属性:描述describes(varchar) 4、向三个表中各插入几条数据

练习篇 - 图22

练习篇 - 图23

  1. 5、查询出版社id100的书的全部信息
  2. 6、查询出版社为外研社的书的全部信息
  3. 7、查询图书数量(scount)大于100的种类
  4. 8、查询图书种类最多的出版社信息
  1. -- 1、建立数据库:test_library
  2. CREATE DATABASE test_library;
  3. -- 使用数据库 USE test_library;
  4. -- 2、创建出版社表
  5. CREATE TABLE press(
  6. pressid INT(10) PRIMARY KEY,
  7. pressname VARCHAR(30),
  8. address VARCHAR(50) )
  9. -- 创建一个种类表
  10. CREATE TABLE sort(
  11. sortno INT(10) PRIMARY KEY,
  12. scount INT(10) );
  13. -- 创建图书表
  14. CREATE TABLE book(
  15. bid INT(10) PRIMARY KEY,
  16. bname VARCHAR(40),
  17. bsortno INT(10),
  18. pressid INT(10),
  19. CONSTRAINT p_b_pid_fk FOREIGN KEY (pressid) REFERENCES press(pressid), CONSTRAINT s_b_sno_fk FOREIGN KEY (bsortno) REFERENCES sort(sortno) );
  20. -- 3、添加一列属性
  21. ALTER TABLE sort ADD COLUMN describes VARCHAR(30);
  22. -- 4、添加数据
  23. INSERT INTO press
  24. VALUES(100,'外研社','上海');
  25. INSERT INTO press VALUES(101,'北大出版社','北京');
  26. INSERT INTO press VALUES(102,'教育出版社','北京');
  27. -- 添加数据
  28. INSERT INTO sort(sortno,scount,describes)VALUES(11,50,'小说');
  29. INSERT INTO sort(sortno,scount,describes)VALUES(12,300,'科幻');
  30. INSERT INTO sort(sortno,scount,describes)VALUES(13,100,'神话');
  31. -- 添加数据
  32. INSERT INTO book VALUES(1,'红与黑',11,100);
  33. INSERT INTO book VALUES(2,'幻城',12,102);
  34. INSERT INTO book VALUES(3,'希腊神话',13,102);
  35. INSERT INTO book VALUES(4,'一千零一夜',13,102);
  36. #5、查询出版社id为100的书的全部信息
  37. SELECT * FROM book WHERE pressid=100;
  38. #6、查询出版社为外研社的书的全部信息
  39. SELECT * FROM book WHERE pressid=(
  40. SELECT pressid FROM press WHERE pressname='外研社');
  41. #7、查询图书数量(scount)大于100的种类
  42. SELECT * FROM sort WHERE scount>100;
  43. #8、查询图书种类最多的出版社信息
  44. SELECT * FROM press
  45. WHERE pressid=(
  46. SELECT temp.pressid FROM (
  47. SELECT pressid,MAX(t.c) FROM (SELECT pressid,COUNT(*) AS c FROM book GROUP BY pressid ORDER BY c DESC ) AS t) AS temp);
  48. 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)

练习8

  1. 1、建立数据库:test_tour 2、建立如下两个表:
  2. agency旅行社表:

练习篇 - 图24

travel旅行线路表:

练习篇 - 图25

3、添加记录

练习篇 - 图26

  1. 4、查出旅行线路最多的旅社
  2. 5、查出最热门的旅行线路(也就是查询出报名人数最多的线路)
  3. 6、查询花费少于5000的旅行线路
  4. 7、找到一次旅行花费最昂贵的旅行社名
  5. 8、查出青年旅社所有的旅行线路都玩一遍需要多少时间。
  1. #1、建立数据库:test_tour
  2. CREATE DATABASE test_tour;
  3. #使用数据库 USE test_tour;
  4. #2、 CREATE TABLE agency(
  5. id INT PRIMARY KEY NOT NULL,
  6. NAME VARCHAR(20) NOT NULL,
  7. address VARCHAR(100) NOT NULL,
  8. areaid INT );
  9. CREATE TABLE trval(
  10. tid INT PRIMARY KEY NOT NULL,
  11. TIME VARCHAR(50) NOT NULL,
  12. POSITION VARCHAR(100) NOT NULL,
  13. money FLOAT,
  14. aid INT NOT NULL,
  15. rcount INT,
  16. CONSTRAINT bk_aid FOREIGN KEY trval(aid) REFERENCES agency(id) );
  17. #3、
  18. INSERT INTO agency(id,NAME,address) VALUES (101,'青年旅行社','北京海淀');
  19. INSERT INTO agency(id,NAME,address) VALUES (102,'天天旅行社','天津海院');
  20. INSERT INTO trval(tid,TIME,POSITION,money,aid,rcount) VALUES (1,'5天','八达 岭',3000,101,10);
  21. INSERT INTO trval(tid,TIME,POSITION,money,aid,rcount) VALUES (2,'7天','水长 城',5000,101,14);
  22. INSERT INTO trval(tid,TIME,POSITION,money,aid,rcount) VALUES (3,'8天','水长 城',6000,102,11);
  23. SELECT * FROM agency; SELECT * FROM trval;
  24. #4、查出旅行线路最多的旅社
  25. 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
  26. #5、查出最热门的旅行线路(也就是查询出报名人数最多的线路)
  27. SELECT * FROM trval WHERE rcount=(SELECT MAX(rcount) FROM trval);
  28. #6、查询花费少于5000的旅行线路
  29. SELECT * FROM trval WHERE money<5000;
  30. #7、找到一次旅行花费最昂贵的旅行社名
  31. SELECT NAME FROM agency WHERE id = (SELECT aid FROM trval
  32. WHERE money =(SELECT MAX(money) FROM trval ));
  33. #8、查出青年旅社所有的旅行线路都玩一遍需要多少时间。
  34. SELECT SUM(TIME) FROM trval WHERE aid=(SELECT id FROM agency WHERE NAME='青年旅行社');