第01章_数据库概述
1.说说你了解的常见的数据库
Oracle、MySQl、SQL Server、DB2、PGSQL;Redis、MongoDB、ES.....
2.谈谈你对MySQL历史、特点的理解
历史:由瑞典的MySQL AB 公司创立,1995开发出的MySQL2008年,MySQL被SUN公司收购2009年,Oracle收购SUN公司,进而Oracle就获取了MySQL2016年,MySQL8.0.0版本推出特点:开源的、关系型的数据库支持千万级别数据量的存储,大型的数据库
3.说说你对DB、DBMS、SQL的理解
DB:database,看做是数据库文件。 (类似于:.doc、.txt、.mp3、.avi、。。。)DBMS:数据库管理系统。(类似于word工具、wps工具、记事本工具、qq影音播放器等)MySQL数据库服务器中安装了MySQL DBMS,使用MySQL DBMS 来管理和操作DB,使用的是SQL语言。
4.你知道哪些非关系型数据库的类型呢?(了解)
键值型数据库:Redis文档型数据库:MongoDB搜索引擎数据库:ES、Solr列式数据库:HBase图形数据库:InfoGrid
5.表与表的记录之间存在哪些关联关系?
ORM思想。(了解)表与表的记录之间的关系:一对一关系、一对多关系、多对多关系、自关联 (了解)
第02章_MySQL环境搭建
1.安装好MySQL之后在windows系统中哪些位置能看到MySQL?
MySQL DBMS软件的安装位置。 D:\develop_tools\MySQL\MySQL Server 8.0MySQL 数据库文件的存放位置。 C:\ProgramData\MySQL\MySQL Server 8.0\DataMySQL DBMS 的配置文件。 C:\ProgramData\MySQL\MySQL Server 8.0\my.iniMySQL的服务(要想通过客户端能够访问MySQL的服务器,必须保证服务是开启状态的)MySQL的path环境变量
2.卸载MySQL主要卸载哪几个位置的内容?
使用控制面板的软件卸载,去卸载MySQL DBMS软件的安装位置。D:\develop_tools\MySQL\MySQL Server 8.0手动删除数据库文件。 C:\ProgramData\MySQL\MySQL Server 8.0\DataMySQL的环境变量MySQL的服务进入注册表删除。( regedit )务必重启电脑
3.能够独立完成MySQL8.0、MySQL5.7版本的下载、安装、配置 (掌握)
4.MySQL5.7在配置完以后,如何修改配置文件?
为什么要修改my.ini文件? 默认的数据库使用的字符集是latin1。我们需要修改为:utf8修改哪些信息?修改完以后,需要重启服务。
5.熟悉常用的数据库管理和操作的工具
方式1:windows自带的cmd方式2:mysql数据库自带的命令行窗口方式3:图形化管理工具:Navicat、SQLyog、dbeaver等。[mysql] #大概在63行左右,在其下添加...default-character-set=utf8 #默认字符集[mysqld] # 大概在76行左右,在其下添加...character-set-server=utf8collation-server=utf8_general_cinet stop mysql服务名;net start mysql服务名;
第03章_基本的SELECT语句
【题目】# 1.查询员工12个月的工资总和,并起别名为ANNUAL SALARY# 2.查询employees表中去除重复的job_id以后的数据# 3.查询工资大于12000的员工姓名和工资# 4.查询员工号为176的员工的姓名和部门号# 5.显示表 departments 的结构,并查询其中的全部数据
1.查询员工12个月的工资总和,并起别名为ANNUAL SALARYSELECT employee_id , last_name,salary * 12 "ANNUAL SALARY"FROM employees;SELECT employee_id,last_name,salary * 12 * (1 + IFNULL(commission_pct,0)) "ANNUALSALARY"FROM employees;
2.查询employees表中去除重复的job_id以后的数据SELECT DISTINCT job_idFROM employees;
3.查询工资大于12000的员工姓名和工资SELECT last_name, salaryFROM employeesWHERE salary > 12000;
4.查询员工号为176的员工的姓名和部门号SELECT last_name, department_idFROM employeesWHERE employee_id = 176;
5.显示表 departments 的结构,并查询其中的全部数据DESC departments;SELECT * FROM departments;
第04章_运算符
【题目】# 1.选择工资不在5000到12000的员工的姓名和工资# 2.选择在20或50号部门工作的员工姓名和部门号# 3.选择公司中没有管理者的员工姓名及job_id# 4.选择公司中有奖金的员工姓名,工资和奖金级别# 5.选择员工姓名的第三个字母是a的员工姓名# 6.选择姓名中有字母a和k的员工姓名# 7.显示出表 employees 表中 first_name 以 'e'结尾的员工信息# 8.显示出表 employees 部门编号在 80-100 之间的姓名、工种# 9.显示出表 employees 的 manager_id 是 100,101,110 的员工姓名、工资、管理者id
1.选择工资不在5000到12000的员工的姓名和工资SELECT last_name, salaryFROM employeesWHERE salary < 5000 OR salary > 12000;SELECT last_name, salaryFROM employeesWHERE salary NOT BETWEEN 5000 AND 12000;
2.选择在20或50号部门工作的员工姓名和部门号SELECT last_name, department_idFROM employeesWHERE department_id = 20 OR department_id = 50;SELECT last_name, department_idFROM employeesWHERE department_id IN(20, 50);
3.选择公司中没有管理者的员工姓名及job_idSELECT last_name, job_idFROM employeesWHERE manager_id IS NULL;
4.选择公司中有奖金的员工姓名,工资和奖金级别SELECT last_name, salary, commission_pctFROM employeesWHERE commission_pct IS NOT NULL;
5.选择员工姓名的第三个字母是a的员工姓名SELECT last_nameFROM employeesWHERE last_name LIKE '__a%';
6.选择姓名中有字母a和k的员工姓名SELECT last_nameFROM employeesWHERE last_name LIKE '%a%k%' OR last_name LIKE '%k%a%';
7.显示出表 employees 表中 first_name 以 'e'结尾的员工信息SELECT employee_id,first_name,last_nameFROM employeesWHERE first_name LIKE '%e';SELECT employee_id,first_name,last_nameFROM employeesWHERE first_name REGEXP 'e$';
8.显示出表 employees 部门编号在 80-100 之间的姓名、工种SELECT last_name,job_idFROM employees#where department_id in (80,90,100);WHERE department_id BETWEEN 80 AND 100;
9.显示出表 employees 的 manager_id 是 100,101,110 的员工姓名、工资、管理者idSELECT last_name,salary,manager_idFROM employeesWHERE manager_id IN (100,101,110);
第05章_排序与分页
#1. 查询员工的姓名和部门号和年薪,按年薪降序,按姓名升序显示#2. 选择工资不在 8000 到 17000 的员工的姓名和工资,按工资降序,显示第21到40位置的数据#3. 查询邮箱中包含 e 的员工信息,并先按邮箱的字节数降序,再按部门号升序
答案:1. 查询员工的姓名和部门号和年薪,按年薪降序 按姓名升序显示SELECT last_name,department_id,salary * 12 annual_salFROM employeesORDER BY annual_sal DESC,last_name ASC;2. 选择工资不在 8000 到 17000 的员工的姓名和工资,按工资降序,显示第21到40位置的数据SELECT last_name,salaryFROM employeesWHERE salary NOT BETWEEN 8000 AND 17000ORDER BY salary DESCLIMIT 20,20;3. 查询邮箱中包含 e 的员工信息,并先按邮箱的字节数降序,再按部门号升序SELECT last_name,email,department_idFROM employees#where email like '%e%'WHERE email REGEXP '[e]'ORDER BY LENGTH(email) DESC,department_id ASC;
第06章_多表查询
多表查询-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.查询员工所在的部门名称、部门地址、姓名、工作、工资,其中员工所在部门的部门名称为’Executive’# 6.选择指定员工的姓名,员工号,以及他的管理者的姓名和员工号,结果类似于下面的格式employees Emp# manager Mgr#kochhar 101 king 100# 7.查询哪些部门没有员工# 8. 查询哪个城市没有部门# 9. 查询部门名为 Sales 或 IT 的员工信息
# 1.显示所有员工的姓名,部门号和部门名称。
SELECT last_name, e.department_id, department_nameFROM employees eLEFT OUTER JOIN departments dON e.`department_id` = d.`department_id`;
# 2.查询90号部门员工的job_id和90号部门的location_id
SELECT job_id, location_idFROM employees e, departments dWHERE e.`department_id` = d.`department_id`AND e.`department_id` = 90;orSELECT job_id, location_idFROM employees eJOIN departments dON 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 , cityFROM employees eLEFT OUTER JOIN departments dON e.`department_id` = d.`department_id`LEFT OUTER JOIN locations lON 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_nameFROM employees e, departments d, locations lWHERE e.`department_id` = d.`department_id`AND d.`location_id` = l.`location_id`AND city = 'Toronto';orSELECT last_name , job_id , e.department_id , department_nameFROM employees eJOIN departments dON e.`department_id` = d.`department_id`JOIN locations lON l.`location_id` = d.`location_id`WHERE l.`city` = 'Toronto';
5.查询员工所在的部门名称、部门地址、姓名、工作、工资,其中员工所 在部门的部门名称为’Executive’
SELECT department_name, street_address, last_name, job_id, salaryFROM employees e JOIN departments dON e.department_id = d.department_idJOIN locations lON d.`location_id` = l.`location_id`WHERE department_name = 'Executive'
6.选择指定员工的姓名,员工号,以及他的管理者的姓名和员工号,结果 类似于下面的格式
employees Emp# manager Mgr#kochhar 101 king 100SELECT emp.last_name employees, emp.employee_id "Emp#", mgr.last_name manager,mgr.employee_id "Mgr#"FROM employees empLEFT OUTER JOIN employees mgrON emp.manager_id = mgr.employee_id
7.查询哪些部门没有员工
#方式1:SELECT d.department_idFROM departments d LEFT JOIN employees eON e.department_id = d.`department_id`WHERE e.department_id IS NULL#方式2:SELECT department_idFROM departments dWHERE NOT EXISTS (SELECT *FROM employees eWHERE e.`department_id` = d.`department_id`)
8. 查询哪个城市没有部门
SELECT l.location_id,l.cityFROM locations l LEFT JOIN departments dON l.`location_id` = d.`location_id`WHERE d.`location_id` IS NULL
9. 查询部门名为 Sales 或 IT 的员工信息
SELECT employee_id,last_name,department_nameFROM employees e,departments dWHERE e.department_id = d.`department_id`AND d.`department_name` IN ('Sales','IT');
多表查询-2
1. 所有有门派的人员信息( A、B两表共有)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.列出所有用户,并显示其机构信息(A的全集)#3.列出所有门派(B的全集)#4.所有不入门派的人员(A的独有)#5.所有没人入的门派(B的独有)#6.列出所有人员和机构的对照关系(AB全有)#MySQL Full Join的实现 因为MySQL不支持FULL JOIN,下面是替代方法#left join + union(可去除重复数据)+ right join#7.列出所有没入派的人员和没人入的门派(A的独有+B的独有)
#1.所有有门派的人员信息 ( A、B两表共有)
select *from t_emp a inner join t_dept bon a.deptId = b.id
#2.列出所有用户,并显示其机构信息 (A的全集)
select *from t_emp a left join t_dept bon a.deptId = b.id
#3.列出所有门派 (B的全集)
select *from t_dept b;
#4.所有不入门派的人员 (A的独有)
select *from t_emp a left join t_dept bon a.deptId = b.idwhere b.id is null;
`#5.所有没人入的门派<br />
(B的独有)
select *from t_dept b left join t_emp aon a.deptId = b.idwhere a.deptId is null;
#6.列出所有人员和机构的对照关系 (AB全有)
#MySQL Full Join的实现 因为MySQL不支持FULL JOIN,下面是替代方法#left join + union(可去除重复数据)+ right joinSELECT *FROM t_emp A LEFT JOIN t_dept BON A.deptId = B.idUNIONSELECT *FROM t_emp A RIGHT JOIN t_dept BON A.deptId = B.id
#7.列出所有没入派的人员和没人入的门派 (A的独有+B的独有)
SELECT *FROM t_emp A LEFT JOIN t_dept BON A.deptId = B.idUNIONSELECT *FROM t_emp A RIGHT JOIN t_dept BON A.deptId = B.id
select *from t_emp a inner join t_dept bon a.deptId = b.id;2. 列出所有用户,并显示其机构信息(A的全集)3. 列出所有门派(B的全集)4. 所有不入门派的人员(A的独有)5. 所有没人入的门派(B的独有)6. 列出所有人员和机构的对照关系(AB全有)7. 列出所有没入派的人员和没人入的门派(A的独有+B的独有)select *from t_emp a left join t_dept bon a.deptId = b.id;select *from t_dept b;select *from t_emp a left join t_dept bon a.deptId = b.idwhere b.id is null;select *from t_dept b left join t_emp aon a.deptId = b.idwhere a.deptId is null;#MySQL Full Join的实现 因为MySQL不支持FULL JOIN,下面是替代方法#left join + union(可去除重复数据)+ right joinSELECT *FROM t_emp A LEFT JOIN t_dept BON A.deptId = B.idUNIONSELECT *FROM t_emp A RIGHT JOIN t_dept BON A.deptId = B.idSELECT *FROM t_emp A LEFT JOIN t_dept BON A.deptId = B.idWHERE B.`id` IS NULLUNIONSELECT *FROM t_emp A RIGHT JOIN t_dept BON A.deptId = B.idWHERE A.`deptId` IS NULL;
#第07章_单行函数的课后练习
# 1.显示系统时间(注:日期+时间)SELECT NOW(),SYSDATE(),CURRENT_TIMESTAMP(),LOCALTIME(),LOCALTIMESTAMP() #大家只需要掌握一个函数就可以了FROM DUAL;# 2.查询员工号,姓名,工资,以及工资提高百分之20%后的结果(new salary)SELECT employee_id,last_name,salary,salary * 1.2 "new salary"FROM employees;# 3.将员工的姓名按首字母排序,并写出姓名的长度(length)SELECT last_name,LENGTH(last_name) "name_length"FROM employees#order by last_name asc;ORDER BY name_length ASC;# 4.查询员工id,last_name,salary,并作为一个列输出,别名为OUT_PUTSELECT CONCAT(employee_id,',',last_name,',',salary) "OUT_PUT"FROM employees;# 5.查询公司各员工工作的年数、工作的天数,并按工作年数的降序排序SELECT employee_id,DATEDIFF(CURDATE(),hire_date)/365 "worked_years",DATEDIFF(CURDATE(),hire_date) "worked_days",TO_DAYS(CURDATE()) - TO_DAYS(hire_date) "worked_days1"FROM employeesORDER BY worked_years DESC;# 6.查询员工姓名,hire_date , department_id,满足以下条件:#雇用时间在1997年之后,department_id 为80 或 90 或110, commission_pct不为空SELECT last_name,hire_date,department_idFROM employeesWHERE department_id IN (80,90,110)AND commission_pct IS NOT NULL#and hire_date >= '1997-01-01'; #存在着隐式转换#and date_format(hire_date,'%Y-%m-%d') >= '1997-01-01'; # 显式转换操作,格式化:日期---> 字符串#and date_format(hire_date,'%Y') >= '1997'; # 显式转换操作,格式化AND hire_date >= STR_TO_DATE('1997-01-01','%Y-%m-%d');# 显式转换操作,解析:字符串 ----> 日期# 7.查询公司中入职超过10000天的员工姓名、入职时间SELECT last_name,hire_dateFROM employeesWHERE DATEDIFF(CURDATE(),hire_date) >= 10000;# 8.做一个查询,产生下面的结果#<last_name> earns <salary> monthly but wants <salary*3>SELECT CONCAT(last_name,' earns ',TRUNCATE(salary,0), ' monthly but wants ',TRUNCATE(salary * 3,0)) "Dream Salary"FROM employees;# 9.使用case-when,按照下面的条件:/*job gradeAD_PRES AST_MAN BIT_PROG CSA_REP DST_CLERK E产生下面的结果:*/SELECT last_name "Last_name",job_id "Job_id",CASE job_id WHEN 'AD_PRES' THEN 'A'WHEN 'ST_MAN' THEN 'B'WHEN 'IT_PROG' THEN 'C'WHEN 'SA_REP' THEN 'D'WHEN 'ST_CLERK' THEN 'E'END "Grade"FROM employees;SELECT last_name "Last_name",job_id "Job_id",CASE job_id WHEN 'AD_PRES' THEN 'A'WHEN 'ST_MAN' THEN 'B'WHEN 'IT_PROG' THEN 'C'WHEN 'SA_REP' THEN 'D'WHEN 'ST_CLERK' THEN 'E'ELSE "undefined" END "Grade"FROM employees;
第08章_聚合函数
【题目】#1.where子句可否使用组函数进行过滤?#2.查询公司员工工资的最大值,最小值,平均值,总和#3.查询各job_id的员工工资的最大值,最小值,平均值,总和#4.选择具有各个job_id的员工人数# 5.查询员工最高工资和最低工资的差距(DIFFERENCE)# 6.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内# 7.查询所有部门的名字,location_id,员工数量和平均工资,并按平均工资降序# 8.查询每个工种、每个部门的部门名、工种名和最低工资
#1.where子句可否使用组函数进行过滤?
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 employeesGROUP BY job_id;
#4.选择具有各个job_id的员工人数
SELECT job_id, COUNT(*)FROM employeesGROUP BY job_id;
5.查询员工最高工资和最低工资的差距(DIFFERENCE)
SELECT MAX(salary), MIN(salary), MAX(salary) - MIN(salary) DIFFERENCEFROM employees;
6.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
SELECT manager_id, MIN(salary)FROM employeesWHERE manager_id IS NOT NULLGROUP BY manager_idHAVING MIN(salary) > 6000;
7.查询所有部门的名字,location_id,员工数量和平均工资,并按平均工资降序
SELECT department_name, location_id, COUNT(employee_id), AVG(salary) avg_salFROM employees e RIGHT JOIN departments dON e.`department_id` = d.`department_id`GROUP BY department_name, location_idORDER BY avg_sal DESC;
8.查询每个工种、每个部门的部门名、工种名和最低工资
SELECT department_name,job_id,MIN(salary)FROM departments d LEFT JOIN employees eON e.`department_id` = d.`department_id`GROUP BY department_name,job_id
第09章_子查询
【题目】#1.查询和Zlotkey相同部门的员工姓名和工资#2.查询工资比公司平均工资高的员工的员工号,姓名和工资。#3.选择工资大于所有JOB_ID = 'SA_MAN'的员工的工资的员工的last_name, job_id, salary#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, salary#15. 查询部门的部门号,其中不包括job_id是"ST_CLERK"的部门号#16. 选择所有没有管理者的员工的last_name#17.查询员工号、姓名、雇用时间、工资,其中员工的管理者为 'De Haan'#18.查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资(相关子查询)#19.查询每个部门下的部门人数大于 5 的部门名称(相关子查询)#20.查询每个国家下的部门个数大于 2 的国家编号(相关子查询)
# 第09章_子查询的课后练习#1.查询和Zlotkey相同部门的员工姓名和工资SELECT last_name,salaryFROM employeesWHERE department_id IN (SELECT department_idFROM employeesWHERE last_name = 'Zlotkey');#2.查询工资比公司平均工资高的员工的员工号,姓名和工资。SELECT employee_id,last_name,salaryFROM employeesWHERE salary > (SELECT AVG(salary)FROM employees);#3.选择工资大于所有JOB_ID = 'SA_MAN'的员工的工资的员工的last_name, job_id, salarySELECT last_name,job_id,salaryFROM employeesWHERE salary > ALL(SELECT salaryFROM employeesWHERE job_id = 'SA_MAN');#4.查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名SELECT employee_id,last_nameFROM employeesWHERE department_id IN (SELECT DISTINCT department_idFROM employeesWHERE last_name LIKE '%u%');#5.查询在部门的location_id为1700的部门工作的员工的员工号SELECT employee_idFROM employeesWHERE department_id IN (SELECT department_idFROM departmentsWHERE location_id = 1700);#6.查询管理者是King的员工姓名和工资SELECT last_name,salary,manager_idFROM employeesWHERE manager_id IN (SELECT employee_idFROM employeesWHERE last_name = 'King');#7.查询工资最低的员工信息: last_name, salarySELECT last_name,salaryFROM employeesWHERE salary = (SELECT MIN(salary)FROM employees);#8.查询平均工资最低的部门信息#方式1:SELECT *FROM departmentsWHERE department_id = (SELECT department_idFROM employeesGROUP BY department_idHAVING AVG(salary ) = (SELECT MIN(avg_sal)FROM (SELECT AVG(salary) avg_salFROM employeesGROUP BY department_id) t_dept_avg_sal));#方式2:SELECT *FROM departmentsWHERE department_id = (SELECT department_idFROM employeesGROUP BY department_idHAVING AVG(salary ) <= ALL(SELECT AVG(salary)FROM employeesGROUP BY department_id));#方式3: LIMITSELECT *FROM departmentsWHERE department_id = (SELECT department_idFROM employeesGROUP BY department_idHAVING AVG(salary ) =(SELECT AVG(salary) avg_salFROM employeesGROUP BY department_idORDER BY avg_sal ASCLIMIT 1));#方式4:SELECT d.*FROM departments d,(SELECT department_id,AVG(salary) avg_salFROM employeesGROUP BY department_idORDER BY avg_sal ASCLIMIT 0,1) t_dept_avg_salWHERE d.`department_id` = t_dept_avg_sal.department_id#9.查询平均工资最低的部门信息和该部门的平均工资(相关子查询)#方式1SELECT d.*,(SELECT AVG(salary) FROM employees WHERE department_id = d.`department_id`) avg_salFROM departments dWHERE department_id = (SELECT department_idFROM employeesGROUP BY department_idHAVING AVG(salary ) = (SELECT MIN(avg_sal)FROM (SELECT AVG(salary) avg_salFROM employeesGROUP BY department_id) t_dept_avg_sal));#方式2:SELECT d.*,(SELECT AVG(salary) FROM employees WHERE department_id = d.`department_id`) avg_salFROM departments dWHERE department_id = (SELECT department_idFROM employeesGROUP BY department_idHAVING AVG(salary ) <= ALL(SELECT AVG(salary)FROM employeesGROUP BY department_id));#方式3: LIMITSELECT d.*,(SELECT AVG(salary) FROM employees WHERE department_id = d.`department_id`) avg_salFROM departments dWHERE department_id = (SELECT department_idFROM employeesGROUP BY department_idHAVING AVG(salary ) =(SELECT AVG(salary) avg_salFROM employeesGROUP BY department_idORDER BY avg_sal ASCLIMIT 1));#方式4:SELECT d.*,(SELECT AVG(salary) FROM employees WHERE department_id = d.`department_id`) avg_salFROM departments d,(SELECT department_id,AVG(salary) avg_salFROM employeesGROUP BY department_idORDER BY avg_sal ASCLIMIT 0,1) t_dept_avg_salWHERE d.`department_id` = t_dept_avg_sal.department_id#10.查询平均工资最高的 job 信息#方式1:SELECT *FROM jobsWHERE job_id = (SELECT job_idFROM employeesGROUP BY job_idHAVING AVG(salary) = (SELECT MAX(avg_sal)FROM (SELECT AVG(salary) avg_salFROM employeesGROUP BY job_id) t_job_avg_sal));#方式2:SELECT *FROM jobsWHERE job_id = (SELECT job_idFROM employeesGROUP BY job_idHAVING AVG(salary) >= ALL(SELECT AVG(salary)FROM employeesGROUP BY job_id));#方式3:SELECT *FROM jobsWHERE 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));#方式4:SELECT j.*FROM jobs j,(SELECT job_id,AVG(salary) avg_salFROM employeesGROUP BY job_idORDER BY avg_sal DESCLIMIT 0,1) t_job_avg_salWHERE j.job_id = t_job_avg_sal.job_id#11.查询平均工资高于公司平均工资的部门有哪些?SELECT department_idFROM employeesWHERE department_id IS NOT NULLGROUP BY department_idHAVING AVG(salary) > (SELECT AVG(salary)FROM employees);#12.查询出公司中所有 manager 的详细信息#方式1:自连接 xxx worked for yyySELECT DISTINCT mgr.employee_id,mgr.last_name,mgr.job_id,mgr.department_idFROM employees emp JOIN employees mgrON emp.manager_id = mgr.employee_id;#方式2:子查询SELECT employee_id,last_name,job_id,department_idFROM employeesWHERE employee_id IN (SELECT DISTINCT manager_idFROM employees);#方式3:使用EXISTSSELECT employee_id,last_name,job_id,department_idFROM employees e1WHERE EXISTS (SELECT *FROM employees e2WHERE e1.`employee_id` = e2.`manager_id`);#13.各个部门中 最高工资中最低的那个部门的 最低工资是多少?#方式1:SELECT MIN(salary)FROM employeesWHERE 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) t_dept_max_sal));SELECT *FROM employeesWHERE department_id = 10;#方式2:SELECT MIN(salary)FROM employeesWHERE department_id = (SELECT department_idFROM employeesGROUP BY department_idHAVING MAX(salary) <= ALL (SELECT MAX(salary)FROM employeesGROUP BY department_id));#方式3:SELECT MIN(salary)FROM employeesWHERE department_id = (SELECT department_idFROM employeesGROUP BY department_idHAVING MAX(salary) = (SELECT MAX(salary) max_salFROM employeesGROUP BY department_idORDER BY max_sal ASCLIMIT 0,1));#方式4:SELECT MIN(salary)FROM employees e,(SELECT department_id,MAX(salary) max_salFROM employeesGROUP BY department_idORDER BY max_sal ASCLIMIT 0,1) t_dept_max_salWHERE e.department_id = t_dept_max_sal.department_id#14.查询平均工资最高的部门的 manager 的详细信息: last_name, department_id, email, salary#方式1:SELECT last_name, department_id, email, salaryFROM employeesWHERE employee_id = ANY (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) t_dept_avg_sal)));#方式2:SELECT last_name, department_id, email, salaryFROM employeesWHERE employee_id = ANY (SELECT DISTINCT manager_idFROM employeesWHERE department_id = (SELECT department_idFROM employeesGROUP BY department_idHAVING AVG(salary) >= ALL (SELECT AVG(salary) avg_salFROM employeesGROUP BY department_id)));#方式3:SELECT last_name, department_id, email, salaryFROM employeesWHERE 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) t_dept_avg_salWHERE e.`department_id` = t_dept_avg_sal.department_id);#15. 查询部门的部门号,其中不包括job_id是"ST_CLERK"的部门号#方式1:SELECT department_idFROM departmentsWHERE department_id NOT IN (SELECT DISTINCT department_idFROM employeesWHERE job_id = 'ST_CLERK');#方式2:SELECT department_idFROM departments dWHERE NOT EXISTS (SELECT *FROM employees eWHERE d.`department_id` = e.`department_id`AND e.`job_id` = 'ST_CLERK');#16. 选择所有没有管理者的员工的last_nameSELECT last_nameFROM employees empWHERE NOT EXISTS (SELECT *FROM employees mgrWHERE emp.`manager_id` = mgr.`employee_id`);#17.查询员工号、姓名、雇用时间、工资,其中员工的管理者为 'De Haan'#方式1:SELECT employee_id,last_name,hire_date,salaryFROM employeesWHERE manager_id IN (SELECT employee_idFROM employeesWHERE last_name = 'De Haan');#方式2:SELECT employee_id,last_name,hire_date,salaryFROM employees e1WHERE EXISTS (SELECT *FROM employees e2WHERE e1.`manager_id` = e2.`employee_id`AND e2.last_name = 'De Haan');#18.查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资(相关子查询)#方式1:使用相关子查询SELECT last_name,salary,department_idFROM employees e1WHERE salary > (SELECT AVG(salary)FROM employees e2WHERE department_id = e1.`department_id`);#方式2:在FROM中声明子查询SELECT e.last_name,e.salary,e.department_idFROM employees e,(SELECT department_id,AVG(salary) avg_salFROM employeesGROUP BY department_id) t_dept_avg_salWHERE e.department_id = t_dept_avg_sal.department_idAND e.salary > t_dept_avg_sal.avg_sal#19.查询每个部门下的部门人数大于 5 的部门名称(相关子查询)SELECT department_nameFROM departments dWHERE 5 < (SELECT COUNT(*)FROM employees eWHERE d.department_id = e.`department_id`);#20.查询每个国家下的部门个数大于 2 的国家编号(相关子查询)SELECT * FROM locations;SELECT country_idFROM locations lWHERE 2 < (SELECT COUNT(*)FROM departments dWHERE l.`location_id` = d.`location_id`);/*子查询的编写技巧(或步骤):① 从里往外写 ② 从外往里写如何选择?① 如果子查询相对较简单,建议从外往里写。一旦子查询结构较复杂,则建议从里往外写② 如果是相关子查询的话,通常都是从外往里写。*/
第10章_创建和管理表
练习1
题目:
#1. 创建数据库test01_office,指明字符集为utf8。并在此数据库下执行下述操作#2. 创建表dept01 /*字段 类型 id INT(7) NAME VARCHAR(25) */#3. 将表departments中的数据插入新表dept02中#4. 创建表emp01 /*字段 类型 id INT(7)first_name VARCHAR (25) last_name VARCHAR(25) dept_id INT(7) */#5. 将列last_name的长度增加到50#6. 根据表employees创建emp02#7. 删除表emp01#8. 将表emp02重命名为emp01#9.在表dept02和emp01中添加新列test_column,并检查所作的操作#10.直接删除表emp01中的列 department_id
答案:
# 第10章_创建和管理表的课后练习#练习1:#1. 创建数据库test01_office,指明字符集为utf8。并在此数据库下执行下述操作CREATE DATABASE IF NOT EXISTS test01_office CHARACTER SET 'utf8';USE test01_office;#2. 创建表dept01/*字段 类型id INT(7)NAME VARCHAR(25)*/CREATE TABLE IF NOT EXISTS dept01(id INT(7),`name` VARCHAR(25));#3.将表departments中的数据插入新表dept02中CREATE TABLE dept02ASSELECT *FROM atguigudb.departments;#4. 创建表emp01/*字段 类型id INT(7)first_name VARCHAR (25)last_name VARCHAR(25)dept_id INT(7)*/CREATE TABLE emp01(id INT(7),first_name VARCHAR(25),last_name VARCHAR(25),dept_id INT(7));#5.将列last_name的长度增加到50DESC emp01;ALTER TABLE emp01MODIFY last_name VARCHAR(50);#6.根据表employees创建emp02CREATE TABLE emp02ASSELECT *FROM atguigudb.`employees`;SHOW TABLES FROM test01_office;#7.删除表emp01DROP TABLE emp01;#8.将表emp02重命名为emp01#alter table emp02 rename to emp01;RENAME TABLE emp02 TO emp01;#9.在表dept02和emp01中添加新列test_column,并检查所作的操作ALTER TABLE emp01 ADD test_column VARCHAR(10);DESC emp01;ALTER TABLE dept02 ADD test_column VARCHAR(10);DESC dept02;#10.直接删除表emp01中的列 department_idALTER TABLE emp01DROP COLUMN department_id;#练习2:#练习3:
练习2
# 1、创建数据库 test02_market# 2、创建数据表 customers

# 3、将 c_contact 字段移动到 c_birth 字段后面# 4、将 c_name 字段数据类型改为 varchar(70)# 5、将c_contact字段改名为c_phone# 6、增加c_gender字段到c_name后面,数据类型为char(1)# 7、将表名改为customers_info# 8、删除字段c_city
答案:
# 1、创建数据库 test02_marketCREATE DATABASE IF NOT EXISTS test02_market CHARACTER SET 'utf8';USE test02_market;SHOW CREATE DATABASE test02_market;# 2、创建数据表 customersCREATE TABLE IF NOT EXISTS customers(c_num INT,c_name VARCHAR(50),c_contact VARCHAR(50),c_city VARCHAR(50),c_birth DATE);SHOW TABLES;# 3、将 c_contact 字段移动到 c_birth 字段后面DESC customers;ALTER TABLE customersMODIFY c_contact VARCHAR(50) AFTER c_birth;# 4、将 c_name 字段数据类型改为 varchar(70)ALTER TABLE customersMODIFY c_name VARCHAR(70) ;# 5、将c_contact字段改名为c_phoneALTER TABLE customersCHANGE c_contact c_phone VARCHAR(50);# 6、增加c_gender字段到c_name后面,数据类型为char(1)ALTER TABLE customersADD c_gender CHAR(1) AFTER c_name;# 7、将表名改为customers_infoRENAME TABLE customersTO customers_info;DESC customers_info;# 8、删除字段c_cityALTER TABLE customers_infoDROP COLUMN c_city;
练习3
# 1、创建数据库test03_company # 2、创建表offices

# 3、创建表employees

# 4、将表employees的mobile字段修改到code字段后面# 5、将表employees的birth字段改名为birthday# 6、修改sex字段,数据类型为char(1)# 7、删除字段note# 8、增加字段名favoriate_activity,数据类型为varchar(100)# 9、将表employees的名称修改为 employees_info
答案:
# 1、创建数据库test03_companyCREATE DATABASE IF NOT EXISTS test03_company CHARACTER SET 'utf8';USE test03_company;# 2、创建表officesCREATE TABLE IF NOT EXISTS offices(officeCode INT,city VARCHAR(30),address VARCHAR(50),country VARCHAR(50),postalCode VARCHAR(25));DESC offices;# 3、创建表employeesCREATE TABLE IF NOT EXISTS employees(empNum INT,lastName VARCHAR(50),firstName VARCHAR(50),mobile VARCHAR(25),`code` INT,jobTitle VARCHAR(50),birth DATE,note VARCHAR(255),sex VARCHAR(5));DESC employees;# 4、将表employees的mobile字段修改到code字段后面ALTER TABLE employeesMODIFY mobile VARCHAR(20) AFTER `code`;# 5、将表employees的birth字段改名为birthdayALTER TABLE employeesCHANGE birth birthday DATE;# 6、修改sex字段,数据类型为char(1)ALTER TABLE employeesMODIFY sex CHAR(1);# 7、删除字段noteALTER TABLE employeesDROP COLUMN note;# 8、增加字段名favoriate_activity,数据类型为varchar(100)ALTER TABLE employeesADD favoriate_activity VARCHAR(100);# 9、将表employees的名称修改为 employees_infoRENAME TABLE employees TO employees_info;DESC employees_info;
11章_数据处理之增删改
练习1
题目:
#1. 创建数据库dbtest11CREATE DATABASE IF NOT EXISTS dbtest11 CHARACTER SET 'utf8';#2. 运行以下脚本创建表my_employeesUSE dbtest11;CREATE TABLE my_employees( id INT(10),first_name VARCHAR(10),last_name VARCHAR(10),userid VARCHAR(10),alary DOUBLE(10,2) );CREATE TABLE users(id INT,userid VARCHAR(10),department_id INT );#3. 显示表my_employees的结构#4. 向my_employees表中插入下列数据ID FIRST_NAME LAST_NAME USERID SALARY1 patel Ralph Rpatel 8952 Dancs Betty Bdancs 8603 Biri Ben Bbiri 11004 Newman Chad Cnewman 7505 Ropeburn Audrey Aropebur 1550#5. 向users表中插入数据1 Rpatel 102 Bdancs 103 Bbiri 204 Cnewman 305 Aropebur 40#6. 将3号员工的last_name修改为“drelxer”#7. 将所有工资少于900的员工的工资修改为1000#8. 将userid为Bbiri的user表和my_employees表的记录全部删除#9. 删除my_employees、users表所有数据#10. 检查所作的修正#11. 清空表my_employees
答案:
#第11章_数据处理之增删改的课后练习#练习1:#1. 创建数据库dbtest11CREATE DATABASE IF NOT EXISTS dbtest11 CHARACTER SET 'utf8';#2. 运行以下脚本创建表my_employeesUSE dbtest11;CREATE TABLE my_employees(id INT(10),first_name VARCHAR(10),last_name VARCHAR(10),userid VARCHAR(10),salary DOUBLE(10,2));CREATE TABLE users(id INT,userid VARCHAR(10),department_id INT);#3.显示表my_employees的结构DESC my_employees;DESC users;#4.向my_employees表中插入下列数据ID FIRST_NAME LAST_NAME USERID SALARY1 patel Ralph Rpatel 8952 Dancs Betty Bdancs 8603 Biri Ben Bbiri 11004 Newman Chad Cnewman 7505 Ropeburn Audrey Aropebur 1550INSERT INTO my_employeesVALUES(1,'patel','Ralph','Rpatel',895);INSERT INTO my_employees VALUES(2,'Dancs','Betty','Bdancs',860),(3,'Biri','Ben','Bbiri',1100),(4,'Newman','Chad','Cnewman',750),(5,'Ropeburn','Audrey','Aropebur',1550);SELECT * FROM my_employees;DELETE FROM my_employees;#方式2:INSERT INTO my_employeesSELECT 1,'patel','Ralph','Rpatel',895 UNION ALLSELECT 2,'Dancs','Betty','Bdancs',860 UNION ALLSELECT 3,'Biri','Ben','Bbiri',1100 UNION ALLSELECT 4,'Newman','Chad','Cnewman',750 UNION ALLSELECT 5,'Ropeburn','Audrey','Aropebur',1550;#5.向users表中插入数据1 Rpatel 102 Bdancs 103 Bbiri 204 Cnewman 305 Aropebur 40INSERT INTO users VALUES(1,'Rpatel',10),(2,'Bdancs',10),(3,'Bbiri',20),(4,'Cnewman',30),(5,'Aropebur',40)SELECT * FROM users;#6. 将3号员工的last_name修改为“drelxer”UPDATE my_employeesSET last_name = 'drelxer'WHERE id = 3;#7. 将所有工资少于900的员工的工资修改为1000UPDATE my_employeesSET salary = 1000WHERE salary < 900;#8. 将userid为Bbiri的users表和my_employees表的记录全部删除#方式1:DELETE FROM my_employeesWHERE userid = 'Bbiri';DELETE FROM usersWHERE userid = 'Bbiri';#方式2:DELETE m,uFROM my_employees mJOIN users uON m.userid = u.useridWHERE m.userid = 'Bbiri';SELECT * FROM my_employees;SELECT * FROM users;#9. 删除my_employees、users表所有数据DELETE FROM my_employees;DELETE FROM users;#10. 检查所作的修正SELECT * FROM my_employees;SELECT * FROM users;#11. 清空表my_employeesTRUNCATE TABLE my_employees;
练习2
# 1. 使用现有数据库dbtest11# 2. 创建表格pet
# 3. 添加记录

# 4. 添加字段:主人的生日owner_birth DATE类型。# 5. 将名称为Claws的猫的主人改为kevin# 6. 将没有死的狗的主人改为duck# 7. 查询没有主人的宠物的名字;# 8. 查询已经死了的cat的姓名,主人,以及去世时间;# 9. 删除已经死亡的狗# 10. 查询所有宠物信息
答案:
#练习2:# 1. 使用现有数据库dbtest11USE dbtest11;# 2. 创建表格petCREATE TABLE pet(NAME VARCHAR(20),OWNER VARCHAR(20),species VARCHAR(20),sex CHAR(1),birth YEAR,death YEAR);DESC pet;# 3. 添加记录INSERT INTO pet VALUES('Fluffy','harold','Cat','f','2003','2010'),('Claws','gwen','Cat','m','2004',NULL),('Buffy',NULL,'Dog','f','2009',NULL),('Fang','benny','Dog','m','2000',NULL),('bowser','diane','Dog','m','2003','2009'),('Chirpy',NULL,'Bird','f','2008',NULL);SELECT *FROM pet;# 4. 添加字段:主人的生日owner_birth DATE类型。ALTER TABLE petADD owner_birth DATE;# 5. 将名称为Claws的猫的主人改为kevinUPDATE petSET OWNER = 'kevin'WHERE NAME = 'Claws' AND species = 'Cat';# 6. 将没有死的狗的主人改为duckUPDATE petSET OWNER = 'duck'WHERE death IS NULL AND species = 'Dog';# 7. 查询没有主人的宠物的名字;SELECT NAMEFROM petWHERE OWNER IS NULL;# 8. 查询已经死了的cat的姓名,主人,以及去世时间;SELECT NAME,OWNER,deathFROM petWHERE death IS NOT NULL;# 9. 删除已经死亡的狗DELETE FROM petWHERE death IS NOT NULLAND species = 'Dog';# 10. 查询所有宠物信息SELECT *FROM pet;
练习3
# 1. 使用已有的数据库dbtest11# 2. 创建表employee,并添加记录

# 3. 查询出薪资在1200~1300之间的员工信息。# 4. 查询出姓“刘”的员工的工号,姓名,家庭住址。# 5. 将“李四”的家庭住址改为“广东韶关”# 6. 查询出名字中带“小”的员工
答案:
#练习3:# 1. 使用已有的数据库dbtest11USE dbtest11;# 2. 创建表employee,并添加记录CREATE TABLE employee(id INT,NAME VARCHAR(15),sex CHAR(1),tel VARCHAR(25),addr VARCHAR(35),salary DOUBLE(10,2));INSERT INTO employee VALUES(10001,'张一一','男','13456789000','山东青岛',1001.58),(10002,'刘小红','女','13454319000','河北保定',1201.21),(10003,'李四','男','0751-1234567','广东佛山',1004.11),(10004,'刘小强','男','0755-5555555','广东深圳',1501.23),(10005,'王艳','男','020-1232133','广东广州',1405.16);SELECT * FROM employee;# 3. 查询出薪资在1200~1300之间的员工信息。SELECT *FROM employeeWHERE salary BETWEEN 1200 AND 1300;# 4. 查询出姓“刘”的员工的工号,姓名,家庭住址。SELECT id,NAME,addrFROM employeeWHERE NAME LIKE '刘%';# 5. 将“李四”的家庭住址改为“广东韶关”UPDATE employeeSET addr = '广东韶关'WHERE NAME = '李四';# 6. 查询出名字中带“小”的员工SELECT *FROM employeeWHERE NAME LIKE '%小%';
第13章_约束
基础练习:
练习1
已经存在数据库
test04_emp,两张表emp2和dept2
CREATE DATABASE test04_emp;use test04_emp;CREATE TABLE emp2( id INT, emp_name VARCHAR(15) );CREATE TABLE dept2( id INT, dept_name VARCHAR(15) );
题目:
#1.向表emp2的id列中添加PRIMARY KEY约束#2. 向表dept2的id列中添加PRIMARY KEY约束#3. 向表emp2中添加列dept_id,并在其中定义FOREIGN KEY约束,与之相关联的列是dept2表中的id列。
答案
#1.向表emp2的id列中添加PRIMARY KEY约束ALTER TABLE emp2 MODIFY COLUMN id INT PRIMARY KEY; ALTER TABLE emp2 ADD PRIMARY KEY(id);#2. 向表dept2的id列中添加PRIMARY KEY约束ALTER TABLE dept2 MODIFY COLUMN id INT PRIMARY KEY;ALTER TABLE dept2 ADD PRIMARY KEY(id);#3. 向表emp2中添加列dept_id,并在其中定义FOREIGN KEY约束,与之相关联的列是dept2表中的id列。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、创建数据库test01_library# 2、创建表 books,表结构如下
# 3、使用ALTER语句给books按如下要求增加相应的约束
答案:
# 1、2、略# 3、使用ALTER语句给books按如下要求增加相应的约束 #给id增加主键约束ALTER TABLE books ADD PRIMARY KEY(id); #给id字段增加自增约束ALTER TABLE books MODIFY id INT AUTO_INCREMENT; #给name等字段增加非空约束ALTER TABLE books 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;
练习3
题目:
#1. 创建数据库test04_company#2. 按照下表给出的表结构在test04_company数据库中创建两个数据表offices和employees
offices表:

employees表:

#3. 将表employees的mobile字段修改到officeCode字段后面#4. 将表employees的birth字段改名为employee_birth#5. 修改sex字段,数据类型为CHAR(1),非空约束#6. 删除字段note#7. 增加字段名favoriate_activity,数据类型为VARCHAR(100)#8. 将表employees名称修改为employees_info
答案:
#1. 创建数据库test04_companyCREATE DATABASE test04_company;#2. 按照下表给出的表结构在test04_company数据库中创建两个数据表offices和employeesUSE test04_company;CREATE TABLE offices(officeCode INT(10) ,city VARCHAR(50) NOT NULL,address VARCHAR(50),country VARCHAR(50) NOT NULL,postalCode VARCHAR(15) UNIQUE,PRIMARY KEY(officeCode) );CREATE TABLE employees(employeeNumber INT(11) PRIMARY KEY AUTO_INCREMENT,lastName VARCHAR(50) NOT NULL,firstName VARCHAR(50) NOT NULL,mobile VARCHAR(25) UNIQUE, officeCode INT(10) NOT NULL,jobTitle VARCHAR(50) NOT NULL, birth DATETIME NOT NULL,note VARCHAR(255), sex VARCHAR(5),CONSTRAINT fk_emp_ofCode FOREIGN KEY(officeCode) REFERENCES offices(officeCode) );#3. 将表employees的mobile字段修改到officeCode字段后面ALTER TABLE employees MODIFY mobile VARCHAR(25) AFTER officeCode;#4. 将表employees的birth字段改名为employee_birthALTER TABLE employees CHANGE birth employee_birth DATETIME;#5. 修改sex字段,数据类型为CHAR(1),非空约束ALTER TABLE employees MODIFY sex CHAR(1) NOT NULL;#6. 删除字段noteALTER TABLE employees DROP COLUMN note;#7. 增加字段名favoriate_activity,数据类型为VARCHAR(100)ALTER TABLE employees ADD favoriate_activity VARCHAR(100);#8. 将表employees名称修改为employees_infoALTER TABLE employees RENAME employees_info;
拓展练习:
练习1
创建数据库test04_Market,在test04_Market中创建数据表customers。customers表结构如下所示,按以下
要求进行操作。

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

(1)创建数据表orders,在o_num字段上添加主键约束和自增约束,在c_id字段上添加外键约束,关联customers表中的主键c_num。(2)删除orders表的外键约束,然后删除表customers。
练习2
创建数据表pet,并对表进行插入、更新与删除操作。pet表结构如下表所示。 (1)首先创建数据表pet,使用不同的方法将表记录插入到pet表中。 (2)使用UPDATE语句将名称为Fang的狗的主人改为Kevin。 (3)将没有主人的宠物的owner字段值都改为Duck。 (4)删除已经死亡的宠物记录。 (5)删除所有表中的记录。
pet表结构:

pet表中记录:

练习3
1、创建数据库:test_company2、在此数据库下创建如下3表,数据类型,宽度,是否为空根据实际情况自己定义。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)C. 工资表(salary) :雇员编号(empid),基本工资(basesalary),职务工资(titlesalary),扣除(deduction)。其中雇员编号为主键。3、给工资表(salary)的雇员编号(empid)增加外键约束,外键约束等级为(on update cascade 和on delete cascade)4、添加数据如下:
部门表:

雇员表:

工资表:

5、查询出每个雇员的雇员编号,姓名,职称,所在部门名称,应发工资(基本工资+职务工资),实发工资(基本工资+职务工资-扣除)。6、查询销售部门的雇员姓名及其基本工资7、查询姓“张”且年龄小于40的员工的全部信息和年龄8、查询所有男员工的基本工资和职务工资9、查询基本工资低于2000的员工姓名和职称、所在部门名称10、查询员工总数11、查询部门总数12、查询应发工资的平均工资和最高工资、最低工资13、按照部门统计应发工资的平均工资14、找出部门基本工资的平均工资低于2000的 15、按照员工编号、姓名、基本工资、职务工资、扣除,并按照职务升序排列,如果职务工资相同,再按照基本工资升序排列16、查询员工编号、姓名,出生日期,及年龄段。其中,如果80年之前出生的,定为”老年“;80后定为”中年“,90后定为”青壮年“ 17、查询所有的员工信息,和他所在的部门名称18、查询所有部门信息,和该部门的员工信息19、查询所有职位中含“工程师”的男员工的人数20、查询每个部门的男生和女生的人数和平均基本工资
#创建数据库:test_companyCREATE DATABASE test_company;#使用数据库test_company USE test_company;#创建部门表(department)CREATE TABLE department(depid INT PRIMARY KEY,depname VARCHAR(20) NOT NULL,deinfo VARCHAR(50) );#创建雇员表(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 );#创建工资表(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;#添加部门表数据INSERT INTO departmentVALUES(111,'生产部',NULL),(222,'销售部',NULL)(333,'人事部','人力资源管理');#添加雇员表INSERT INTO employeeVALUES(1001,'张三',DEFAULT,'高级工程师','1975-1-1',111),(1002,'李四','女','助工','1985-1-1',111),(1003,'王五','男','工程师','1978-11-11',222),(1004,'张六',DEFAULT,'工程师','1999-1-1',222);#添加工资表INSERT INTO salaryVALUES(1001,2200,1100,200),(1002,1200,200,NULL),(1003,2900,700,200),(1004,1950,700,150);/*查询出每个雇员的雇员编号,姓名,职称,所在部门名称, 应发工资(基本工资+职务工资), 实发工资(基本工资+职务工资-扣除)。 */SELECT employee.empid,`name`,title,depname, basesalary+titlesalaryAS "应发工资", basesalary+titlesalary-IFNULL(deduction,0) AS "实发工资"FROM department INNER JOIN employee INNER JOIN salaryON department.depid = employee.depidAND employee.empid = salary.empid;#查询销售部门的雇员姓名及其基本工资SELECT `name`,basesalaryFROM department INNER JOIN employee INNER JOIN salaryON department.depid = employee.depidAND 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,titlesalaryFROM employee INNER JOIN salaryON employee.empid = salary.empidWHERE employee.sex = '男';#查询基本工资低于2000的员工姓名和职称、所在部门名称SELECT `name`,title,depnameFROM department INNER JOIN employee INNER JOIN salaryON department.depid = employee.depidAND employee.empid = salary.empid WHERE basesalary < 2000;#查询员工总数SELECT COUNT(*) FROM employee;#查询部门总数SELECT COUNT(*) FROM department;#查询应发工资的平均工资和最高应发工资、最低应发工资SELECT AVG(basesalary+titlesalary) AS "平均应发工资", MAX(basesalary+titlesalary) AS "最高应发工资", MIN(basesalary+titlesalary) AS "最低应发工资" FROM salary;#按照部门统计应发工资的平均工资SELECT depid,AVG(basesalary+titlesalary)FROM employee INNER JOIN salaryON employee.`empid` = salary.`empid`GROUP BY employee.`depid`;#找出部门基本工资的平均工资低于2000的SELECT depid,AVG(basesalary)FROM employee INNER JOIN salaryON employee.`empid` = salary.`empid`GROUP BY employee.`depid`HAVING AVG(basesalary)<2000;#按照员工编号、姓名、基本工资、职务工资、扣除,#并按照职务升序排列,如果职务工资相同,再按照基本工资升序排列SELECT emp.empid,`name`,basesalary,titlesalary,deductionFROM employee emp INNER JOIN salaryON emp.`empid` = salary.`empid`ORDER BY emp.`title` ASC , basesalary ASC;#查询员工编号、姓名,出生日期,及年龄段,其中 •#如果80年之前出生的,定为”老年“;80后定为”中年“,90后定为”青壮年“SELECT empid,`name`,birthday,CASEWHEN YEAR(birthday)<1980 THEN '老年'WHEN YEAR(birthday)<1990 THEN '中年'ELSE '青壮年' END "年龄段" FROM employee;#查询所有的员工信息,和他所在的部门名称SELECT emp.*,depnameFROM employee emp LEFT JOIN department depON emp.`depid` = dep.`depid`;#查询所有部门信息,和该部门的员工信息SELECT dep.*,emp.*FROM employee emp RIGHT JOIN department depON emp.`depid` = dep.`depid`;#查询所有职位中含“工程师”的男员工的人数SELECT COUNT(*)FROM employeeWHERE sex='男'AND title LIKE '%工程师%';#查询每个部门的男生和女生的人数和平均基本工资SELECT dep.depid,sex,COUNT(*),AVG(basesalary)FROM department dep INNER JOIN employee INNER JOIN salaryON dep.depid = employee.depidAND employee.empid = salary.empidGROUP BY dep.depid,sex;
练习4
1、创建一个数据库:test_school 2、创建如下表格表1 Department表的定义

表2 Teacher表的定义

3、添加记录


4、用SELECT语句查询Teacher表的所有记录。5、找出所有其家庭地址中含有“北京”的教师的教工号及部门名称,要求显示结果中各列标题用中文别名表示。6、获得Teacher表中工资最高的教工号和姓名。7、找出所有收入在2500~4000之间的教工号。8、查找在网络技术系工作的教师的姓名、性别和工资。
#创建一个数据库:test_schoolCREATE DATABASE test_school;#使用数据库 USE test_school;#创建表格-- 部门信息表DepartmentCREATE TABLE Department(DepNo INT(10) PRIMARY KEY,DepName VARCHAR(20) NOT NULL,DepNote VARCHAR(50) );-- 创建数据表TeacherCREATE 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的内容插入Department表中INSERT INTO Department VALUES (601,'软件技术系','软件技术等专业');INSERT INTO Department VALUES (602,'网络技术系','多媒体技术等专业');INSERT INTO Department VALUES (603,'艺术设计系','广告艺术设计等专业');INSERT INTO Department VALUES (604,'管理工程系','连锁经营管理等专业');-- 将表3的内容插入Teacher表中。INSERT INTO TeacherVALUES(2001,'Tom','女','1970-01-10',602,4500,'四川省绵阳市');INSERT INTO TeacherVALUES(2002,'Lucy','男','1983-12-18',601,2500,'北京市昌平区');INSERT INTO TeacherVALUES(2003,'Mike','男','1990-06-01',604,1500,'重庆市渝中区');INSERT INTO TeacherVALUES(2004,'James','女','1980-10-20',602,3500,'四川省成都市');INSERT INTO TeacherVALUES(2005,'Jack','男','1975-05-30',603,1200,'重庆市南岸区');#用SELECT语句查询Teacher表的所有记录。SELECT * FROM teacher;#找出所有其家庭地址中含有“北京”的教师的教工号及部门名称,要求显示结果中各列标题用中文表示。 SELECT number AS 教工号,Teacher.depno AS 部门名称FROM Teacher INNER JOIN DepartmentON Teacher.DepNo = Department.DepNoWHERE address LIKE '%北京%';#获得Teacher表中工资最高的教工号和姓名。SELECT number,`name` FROM teacherWHERE 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;#查找在网络技术系工作的教师的姓名、性别和工资。SELECT `name`,sex,salary FROM teacher WHERE depno=(SELECT depno FROM department WHERE depname='网络技术系');SELECT `name`,sex,salary FROM teacher INNER JOIN department ON teacher.depno = department.depno WHERE depname ='网络技术系';
练习5
1、建立数据库test_student2、建立以下三张表,并插入记录Table:Classes

Table:Score

Table: Records

3、写出将张三的语文成绩修改为88的SQL语句。4、搜索出计算机维护1班各门课程的平均成绩。5、搜索科目有不及格的人的名单。6、查询记录2次以上的学生的姓名和各科成绩
#1、建立数据库test_studentCREATE DATABASE test_student;#使用数据库 USE test_student;#2、创建表格并添加记录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中添加数据INSERT INTO classes VALUES('计算机网络','1班','张三','男',8);INSERT INTO classes VALUES('软件工程','2班','李四','男',12);INSERT INTO classes VALUES('计算机维护','1班','王五','男',9);INSERT INTO classes VALUES('计算机网络','2班','LILY','女',15);INSERT INTO classes VALUES('软件工程','1班','小强','男',20);INSERT INTO classes VALUES('计算机维护','1班','CoCo','女',18);-- 向score中添加数据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中添加数据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 scoreWHERE `name` IN (SELECT `name`FROM classesWHERE Pro_name='计算机维护' AND grade='1 班');#5、搜索科目有不及格的人的名单。SELECT `name`FROM scoreWHERE 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) tempON score.name = temp.name;
练习6
1、建立数据库:test_xuankedb2、建立如下三张表:学生表Student由学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、所在系(Sdept)五个字段,Sno 为关键字。课程表Course由课程号(Cno)、课程名(Cname)、选修课号(Cpno)、学分(Ccredit)四个字段,Cno为关键字。成绩表SG由学号(Sno)、课程号(Cno)、成绩(Grade)三个字段,(SNO, CNO)为关键字。3、向Student表增加“入学时间(Scome)”列,其数据类型为日期型。4、查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。5、查询学习1号课程的学生最高分数、平均成绩。6、查询与“李洋”在同一个系学习的学生。7、将计算机系全体学生的成绩置零。8、删除学生表中学号为05019的学生记录。9、删除计算机系所有学生的成绩记录。
-- 1、创建一个数据库:test_xuankedbCREATE DATABASE test_xuankedb;-- 使用数据库USE test_xuankedb;-- 2、创建学生表CREATE TABLE student(sno INT(10) PRIMARY KEY,sname VARCHAR(10),ssex VARCHAR(10),sage INT(10),sdept VARCHAR(40) );-- 创建课程表CREATE TABLE course(cno INT(10) PRIMARY KEY,cname VARCHAR(20),cpno VARCHAR(40),ccredit INT(20) );-- 创建成绩表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)”列,其数据类型为日期型。ALTER TABLE student ADD COLUMN scome DATE;#4、查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。SELECT sno,grade FROM sg WHERE cno=3ORDER BY grade DESC;#5、查询学习1号课程的学生最高分数、平均成绩。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=0WHERE 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='计算机系');
练习7
1、建立数据库:test_library 2、建立如下三个表: 表一:press 出版社 属性:编号pressid(int)、名称pressname(varchar)、地址address(varchar)表二:sort 种类 属性:编号sortno(int)、数量scount(int)表二:book图书 属性:编号bid(int)、名称 bname(varchar)、种类bsortno(int)、出版社编号pressid(int) 3、给sort表中添加一列属性:描述describes(varchar) 4、向三个表中各插入几条数据


5、查询出版社id为100的书的全部信息6、查询出版社为外研社的书的全部信息7、查询图书数量(scount)大于100的种类8、查询图书种类最多的出版社信息
-- 1、建立数据库:test_libraryCREATE DATABASE test_library;-- 使用数据库 USE test_library;-- 2、创建出版社表CREATE TABLE press(pressid INT(10) PRIMARY KEY,pressname VARCHAR(30),address VARCHAR(50) )-- 创建一个种类表CREATE TABLE sort(sortno INT(10) PRIMARY KEY,scount INT(10) );-- 创建图书表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) );-- 3、添加一列属性ALTER TABLE sort ADD COLUMN describes VARCHAR(30);-- 4、添加数据INSERT INTO pressVALUES(100,'外研社','上海');INSERT INTO press VALUES(101,'北大出版社','北京');INSERT INTO press VALUES(102,'教育出版社','北京');-- 添加数据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,'神话');-- 添加数据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、查询图书数量(scount)大于100的种类SELECT * FROM sort WHERE scount>100;#8、查询图书种类最多的出版社信息SELECT * FROM pressWHERE 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)
练习8
1、建立数据库:test_tour 2、建立如下两个表:agency旅行社表:

travel旅行线路表:

3、添加记录

4、查出旅行线路最多的旅社5、查出最热门的旅行线路(也就是查询出报名人数最多的线路)6、查询花费少于5000的旅行线路7、找到一次旅行花费最昂贵的旅行社名8、查出青年旅社所有的旅行线路都玩一遍需要多少时间。
#1、建立数据库:test_tourCREATE DATABASE test_tour;#使用数据库 USE test_tour;#2、 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) );#3、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、查出最热门的旅行线路(也就是查询出报名人数最多的线路)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 trvalWHERE money =(SELECT MAX(money) FROM trval ));#8、查出青年旅社所有的旅行线路都玩一遍需要多少时间。SELECT SUM(TIME) FROM trval WHERE aid=(SELECT id FROM agency WHERE NAME='青年旅行社');
