Browse Source

'message'

machinecat520 2 years ago
commit
f298f5649a

+ 146 - 0
第三章、基本的SELECT语句.sql

@@ -0,0 +1,146 @@
+#第三章_基本的SELECT语句
+
+#1、SQL的分类
+/*
+DDL:数据定义语言。CREATE \ ALTER \ DROP \ RENAME \ TRUNCATE
+DML:数据操作语言。INSERT \ DELETE \ UPDATE \ SELECT(重中之重)
+DCL:数据控制语言。COMMIT \ ROLLBACK \ SAVEPOINT \ GRANT \ REVOKE
+学习技巧:大处着眼,小处着手。
+*/
+
+#字符串、日期时间类型的变量需要使用一对单引号''表示。
+
+/*
+2.1、SQL的规则 ----必须要遵守
+	SQL可以写在一行或者多行。为了提高可读性,各子句分行写,必要时使用缩进。
+	每条命令以“;”或“\g”或“\G”结束。
+	关键字不能被缩写,也不能分行。
+	关于标点符号:
+		必须保证所有的()、单引号、双引号是成对结束的
+		必须使用英文状态下的半角输入方式
+		字符串类型和日期时间类型的数据可以使用单引号(' ’)表示
+		列的别名,尽量使用双引号(" ”),而且不建议省略as
+
+2.2、SQL的规范 ----建议遵守
+	MySQL在Windows环境下是大小写不敏感的。
+	MySQL在Linux环境下是大小写敏感的。
+		数据库名、表名、表的别名、变量名是严格区分大小写的
+		关键字、函数名、列名(或字段名)、列的别名(字段的别名)是忽略大小写的
+	推荐采用统一的书写规范:
+		数据库名、表名、表别名、字段名、字段别名等都小写
+		SQL关键字、函数名、绑定变量等都大写
+	
+3、MySQL的三种注释的方式
+
+4、导入现有的数据表、表的数据
+方式1:命令行方式	source 文件的全路径名
+方式2:基于具体的图形化界面的工具可以导入数据
+		在SQLyog中,点击菜单栏“工具”--“执行SQL脚本...”--选中xxx.sql文件即可
+*/
+
+#5、最基本的SELECT语句:SELECT 字段1,字段2,... FROM 字段所在表的表名;
+SELECT 1 + 1,3 * 2;
+
+SELECT 1 + 1,3 * 2
+FROM DUAL;#DUAL:伪表
+
+USE atguigudb;
+
+# *:表中的所有的字段(或列)
+SELECT * FROM employees;
+
+SELECT employee_id,last_name,salary 
+FROM employees;
+
+#6、列的别名
+# as:全称alias(别名),可以省略。
+#列的别名可以使用一对" "引起来,不要使用' '。
+SELECT employee_id emp_id,last_name AS lname,department_id "部门_id",salary * 12 AS "annual sal"
+FROM employees;
+
+#7、去除重复行
+#查询员工表中一共有哪些部门id
+
+#错误的:没有去重的情况
+SELECT department_id
+FROM employees;
+
+#正确的:去重的情况
+SELECT DISTINCT department_id
+FROM employees;
+
+#错误的
+SELECT salary,DISTINCT department_id
+FROM employees;
+
+#仅仅是没有报错,但是没有实际意义
+SELECT DISTINCT department_id,salary
+FROM employees;
+
+#8、空值参与运算
+#1、空值:NULL
+#2、null不等同于0,'','null'
+
+SELECT * FROM employees;
+
+#3、空值参与运算:结果一定也为空。
+SELECT employee_id,salary "月工资",salary * (1 + commission_pct)*12 "年工资"
+FROM employees;
+#实际问题的解决方案:引入IFNULL
+SELECT employee_id,salary "月工资",salary * (1 + IFNULL(commission_pct,0))*12 "年工资"
+FROM employees;
+
+#9、着重号``(键盘上方,数字键1左边的键,需要英文状态下输入)
+
+SELECT * FROM `order`;
+
+#10、查询常数
+SELECT '华为' AS corporation,123 AS sequence,employee_id,last_name
+FROM employees;
+
+#11、显示表结构
+DESCRIBE employees;#显示了表中字段的详细信息
+
+DESC employees;
+
+DESC departments;
+
+#12、过滤数据
+
+#练习:查询90号部门的员工信息
+SELECT *
+FROM employees
+#过滤条件,声明在FROM结构的后面,并且紧随FROM
+WHERE department_id = 90;
+
+#练习:查询last_name为'King'的员工信息
+SELECT *
+FROM employees
+WHERE last_name = 'King';
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 30 - 0
第三章、练习题.sql

@@ -0,0 +1,30 @@
+#第三章练习题
+#1、查询员工12个月的工资总和,并起别名为ANNUAL SALARY
+#理解1:计算12个月的基本工资
+SELECT employee_id,last_name,salary * 12 AS 'ANNUAL SALARY'
+FROM employees;
+
+#理解2:计算12个月的基本工资和奖金
+SELECT employee_id,last_name,salary * (1 + IFNULL(commission_pct,0))*12 AS 'ANNUAL SALARY'
+FROM employees;
+
+#2、查询employees表中去除重复的job_id以后的数据
+SELECT DISTINCT job_id
+FROM employees;
+
+#3、查询工资大于12000的员工姓名和工资
+SELECT first_name,last_name,salary
+FROM employees
+WHERE salary > 12000;
+
+#4、查询员工工号为176的员工姓名和部门号
+SELECT employee_id,first_name,last_name,department_id
+FROM employees
+WHERE employee_id = 176;
+
+#5、显示表departments的结构,并查询其中的全部数据
+#查询结构
+DESCRIBE departments;
+#查询全部数据
+SELECT *
+FROM departments;

+ 105 - 0
第五章、排序与分页.sql

@@ -0,0 +1,105 @@
+#第五章、排序与分页
+
+#1、排序
+#如果没有使用排序操作,默认情况下查询返回的数据是按照添加数据的顺序显示的。
+
+#练习:按照salary从高到低的顺序显示员工信息
+
+#1.1、基本使用
+#使用 ORDER BY 对查询到的数据进行排序操作。
+#升序:ASC(ascend)
+#降序:DESC(descend)
+#如果在 ORDER BY 后没有显式指明排序的方式的话,则默认按照升序排列。
+
+SELECT employee_id,last_name,salary
+FROM employees
+ORDER BY salary DESC;
+
+#1.2、我们可以使用列的别名,进行排序
+SELECT employee_id,salary,salary*12 annual_sal
+FROM employees
+ORDER BY annual_sal;
+
+#列的别名只能在 ORDER BY 中使用,不能在WHERE中使用。
+#如下操作报错
+SELECT employee_id,salary,salary*12 annual_sal
+FROM employees
+WHERE annual_sal > 81600;
+
+#1.3、强调格式:WHERE需要声明在FROM后,ORDER BY之前。
+SELECT employee_id,salary
+FROM employees
+WHERE department_id IN(50,60,70)
+ORDER BY department_id DESC;
+
+#1.4、二级排序
+#练习:显示员工信息,按照department_id的降序排列,salary的升序排列
+SELECT employee_id,salary,department_id
+FROM employees
+ORDER BY department_id DESC,salary ASC; #ASC可以省略
+
+#2、分页
+#2.1、MySQL使用LIMIT实现数据的分页显示
+#需求1:每页显示20条记录,此时显示第1页
+SELECT employee_id,last_name
+FROM employees
+LIMIT 0,20;
+
+#需求2:每页显示20条记录,此时显示第2页
+SELECT employee_id,last_name
+FROM employees
+LIMIT 20,20;
+
+#需求3:每页显示20条记录,此时显示第3页
+SELECT employee_id,last_name
+FROM employees
+LIMIT 40,20;
+
+#需求:每页显示pageSize条记录,此时显示第pageNo页
+#公式:LIMIT (pageNo-1)*pageSize,pageSize;
+
+#2.2、WHERE ... ORDER BY ... LIMIT声明顺序如下:
+#LIMIT的格式:严格来说,应该是:LIMIT 位置偏移量,条目数
+#结构“LIMIT 0,条目数”等价于“LIMIT 条目数”
+SELECT employee_id,last_name,salary
+FROM employees
+WHERE salary > 6000
+ORDER BY salary DESC
+#LIMIT 0,10;
+LIMIT 10;
+
+#ORDER BY和LIMIT都是垫底的,并且ORDER BY在LIMIT的前面
+#练习:表里有107条数据,我们只想要显示第32、33条数据怎么办?
+SELECT employee_id,last_name
+FROM employees
+LIMIT 31,2;
+
+#2.3MySQL8.0新特性:LIMIT ... OFFSET ...
+#练习:表里有107条数据,我们只想要显示第32、33条数据怎么办?
+SELECT employee_id,last_name
+FROM employees
+LIMIT 2 OFFSET 31;
+
+#练习:查询员工表中工资最高的员工信息
+SELECT employee_id,last_name,salary
+FROM employees
+ORDER BY salary DESC
+#LIMIT 0,1;
+LIMIT 1;
+
+#2.4、LIMIT可以适应在MySQL、PGSQL、MariaDB、SQLite等数据库中使用,表示分页
+#不能使用在SQL Server、DB2、Oracle
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 21 - 0
第五章、练习题.sql

@@ -0,0 +1,21 @@
+#第五章、练习题
+SELECT * FROM employees;
+
+#1、查询员工的姓名和部门号和年薪,按年薪降序,按姓名升序显示
+SELECT last_name,department_id,salary*12*(1+IFNULL(commission_pct,0)) ySalary
+FROM employees
+ORDER BY ySalary DESC,last_name ASC;
+
+#2、选择工资不在8000到17000的员工的姓名和工资,按工资降序,显示第21到40位置的数据
+SELECT last_name,salary
+FROM employees
+WHERE salary NOT BETWEEN 8000 AND 17000
+ORDER BY salary DESC
+LIMIT 20,20;
+
+#3、查询邮箱中包含e的员工信息,并先按邮箱的字节数降序,再按部门号升序
+SELECT employee_id,last_name,email,department_id
+FROM employees
+#WHERE email LIKE '%e%'
+WHERE email REGEXP '[e]'
+ORDER BY LENGTH(email) DESC, department_id ASC;

+ 276 - 0
第六章、多表查询.sql

@@ -0,0 +1,276 @@
+#第六章、多表查询
+
+#1、熟悉教学常见的几个表
+DESC employees;
+
+DESC departments;
+
+DESC locations;
+
+#查询员工名为'Abel'的人在哪个城市工作?
+SELECT *
+FROM employees
+WHERE last_name = 'Abel';
+
+SELECT *
+FROM departments
+WHERE department_id = 80;
+
+SELECT *
+FROM locations
+WHERE location_id = 2500;
+
+#2、出现笛卡尔积的错误
+#错误的原因:缺少了多表的连接条件
+
+#错误的实现方式:每个员工都与每个部门匹配了一遍
+SELECT employee_id,department_name
+FROM employees,departments;	#查询出2889条记录
+
+#错误的方式
+SELECT employee_id,department_name
+FROM employees CROSS JOIN departments;	#查询出2889条记录
+
+SELECT *
+FROM employees;
+
+SELECT 2889/107
+FROM DUAL;
+
+SELECT *
+FROM departments;
+
+#3、多表查询的正确方式:需要有连接条件
+SELECT employee_id,department_name
+FROM employees,departments
+#两个表的连接条件
+WHERE employees.`department_id` = departments.department_id;
+
+#4、如果查询语句中出现了多个表中都存在的字段,则必须指明此字段所在的表。
+SELECT employees.employee_id,departments.department_name,employees.department_id
+FROM employees,departments
+WHERE employees.`department_id` = departments.`department_id`;
+
+#建议:从SQL优化的角度,建议多表查询时,每个字段前都指明其所在的表
+
+#5、可以给表起别名,在SELECT和WHERE中使用表的别名
+SELECT emp.employee_id,dept.department_name,emp.department_id
+FROM employees emp,departments dept
+WHERE emp.`department_id` = dept.department_id;
+
+#如果给表起了别名,一旦在SELECT或WHERE中使用表名的话,则必须使用表的别名,而不能再使用表的原名。
+#如下的操作是错误的:
+SELECT emp.employee_id,departments.department_name,emp.department_id
+FROM employees emp,departments dept
+WHERE emp.`department_id` = departments.department_id;
+
+#6、结论:如果有n个表实现多表的查询,则需要至少n-1个连接条件
+#练习:查询员工的employee_id,last_name,department_name,city
+SELECT e.employee_id,e.last_name,d.department_name,l.city,e.department_id,l.location_id
+FROM employees e,departments d,locations l
+WHERE e.`department_id` = d.`department_id` AND d.`location_id` = l.`location_id`;
+
+/*
+演绎式:提出问题1 ---> 解决问题1 ---> 提出问题2 ---> 解决问题2 ...
+
+归纳式:总 -- 分
+*/
+
+#7、多表查询的分类
+/*
+角度1:等值连接 vs 非等值连接
+
+角度2:自连接 vs 非自连接
+
+角度3:内连接 vs 外连接
+*/
+
+#7.1、等值连接 vs 非等值连接
+#非等值连接的例子:
+SELECT *
+FROM job_grades;
+
+SELECT e.last_name,e.salary,j.grade_level
+FROM employees e,job_grades j
+#WHERE e.`salary` BETWEEN j.`lowest_sal` AND j.`highest_sal`;
+WHERE e.`salary` >= j.`lowest_sal` AND e.`salary` <= j.`highest_sal`;
+
+#7.2、自连接 vs 非自连接
+
+#自连接的例子:
+#练习:查询员工id,员工姓名及其管理者的id和姓名
+SELECT emp.employee_id,emp.last_name,mgr.employee_id,mgr.last_name
+FROM employees emp,employees mgr
+WHERE emp.`manager_id` = mgr.`employee_id`;
+
+#7.3、内连接 vs 外连接
+
+#内连接:合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行
+SELECT employee_id,department_name
+FROM employees e,departments d
+WHERE e.`department_id` = d.`department_id`;	#只有106条记录
+
+#外连接:合并具有同一列的两个以上的表的行,结果集中除了包含一个表与另一个表匹配的行之外,还查询到了左表或右表中不匹配的行
+
+#外连接的分类:左外连接、右外连接、满外连接
+
+#左外连接:两个表在连接过程中除了返回满足连接条件的行以外,还返回左表中不满足条件的行,这种连接称为左外连接。
+#右外连接:两个表在连接过程中除了返回满足连接条件的行以外,还返回右表中不满足条件的行,这种连接称为右外连接。
+
+#练习:查询所有的员工的last_name,department_name信息
+#题目中包含了“所有的”,所以就可能存在不匹配的数据,因此一定是外连接
+SELECT employee_id,department_name
+FROM employees e,departments d
+WHERE e.`department_id` = d.department_id;		#需要使用左外连接
+
+#SQL92语法实现内连接:(上面的写法就是)
+#SQL92语法实现外连接:使用+	-----MySQL不支持SQL92语法中外连接的写法!(Oracle支持)
+#不支持
+SELECT employee_id,department_name
+FROM employees e,departments d
+WHERE e.`department_id` = d.department_id(+);
+
+#SQL99语法中使用JOIN ...ON的方式实现多表的查询。这种方式也能解决外连接的问题。
+#MySQL是支持此种方式的。
+
+#SQL99语法如何实现多表的查询。
+
+#SQL99语法实现内连接:(INNER可以省略)
+SELECT last_name,department_name
+#FROM employees e INNER JOIN departments d
+FROM employees e JOIN departments d
+ON e.department_id = d.department_id;
+
+SELECT last_name,department_name,city
+FROM employees e JOIN departments d
+ON e.department_id = d.department_id
+JOIN locations l
+ON d.location_id = l.location_id;
+
+#练习:查询所有的员工的last_name,department_name信息
+#左外连接:(因为加了LEFT,所以OUTER也可以省略)
+SELECT last_name,department_name
+#FROM employees e LEFT OUTER JOIN departments d
+FROM employees e LEFT JOIN departments d
+ON e.department_id = d.department_id;
+
+#右外连接:(因为加了RIGHT,所以OUTER也可以省略)
+SELECT last_name,department_name
+#FROM employees e RIGHT OUTER JOIN departments d
+FROM employees e RIGHT JOIN departments d
+ON e.department_id = d.department_id;
+
+#满外连接:MySQL不支持FULL OUTER JOIN的方式(Oracle支持)
+SELECT last_name,department_name
+FROM employees e FULL OUTER JOIN departments d
+ON e.department_id = d.department_id;
+
+#8、UNION和UNION ALL的使用
+#UNION:会执行去重的操作
+#UNION ALL:不会执行去重的操作
+#结论:如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复的
+#数据,则尽量使用UNION ALL语句,以提高数据查询的效率。
+
+#9、7种JOIN的实现
+
+#中图:内连接
+SELECT employee_id,department_name
+FROM employees e JOIN departments d
+ON e.department_id = d.department_id;
+
+#左上图:左外连接
+SELECT employee_id,department_name
+FROM employees e LEFT JOIN departments d
+ON e.department_id = d.department_id;
+
+#右上图:右外连接
+SELECT employee_id,department_name
+FROM employees e RIGHT JOIN departments d
+ON e.department_id = d.department_id;
+
+#左中图:
+SELECT employee_id,department_name
+FROM employees e LEFT JOIN departments d
+ON e.department_id = d.department_id
+WHERE d.department_id IS NULL;
+
+#右中图
+SELECT employee_id,department_name
+FROM employees e RIGHT JOIN departments d
+ON e.department_id = d.department_id
+WHERE e.department_id IS NULL;
+
+#左下图:满外连接
+#方式1:左上图 UNION ALL 右中图
+SELECT employee_id,department_name
+FROM employees e LEFT JOIN departments d
+ON e.department_id = d.department_id
+UNION ALL
+SELECT employee_id,department_name
+FROM employees e RIGHT JOIN departments d
+ON e.department_id = d.department_id
+WHERE e.department_id IS NULL;
+
+#方式2:左中图 UNION ALL 右上图
+SELECT employee_id,department_name
+FROM employees e LEFT JOIN departments d
+ON e.department_id = d.department_id
+WHERE d.department_id IS NULL
+UNION ALL
+SELECT employee_id,department_name
+FROM employees e RIGHT JOIN departments d
+ON e.department_id = d.department_id;
+
+#右下图:左中图 UNION ALL 右中图
+SELECT employee_id,department_name
+FROM employees e LEFT JOIN departments d
+ON e.department_id = d.department_id
+WHERE d.department_id IS NULL
+UNION ALL
+SELECT employee_id,department_name
+FROM employees e RIGHT JOIN departments d
+ON e.department_id = d.department_id
+WHERE e.department_id IS NULL;
+
+#10、SQL99语法的新特性1:自然连接
+SELECT employee_id,last_name,department_name
+FROM employees e JOIN departments d
+ON e.department_id = d.department_id
+AND e.manager_id = d.manager_id;
+
+#NATURAL JOIN:它会帮你自动查询两张连接表中“所有相同的字段”,然后进行“等值连接”
+SELECT employee_id,last_name,department_name
+FROM employees e NATURAL JOIN departments d;
+
+#11、SQL99语法的新特性2:USING
+SELECT employee_id,last_name,department_name
+FROM employees e JOIN departments d
+ON e.department_id = d.department_id;
+
+SELECT employee_id,last_name,department_name
+FROM employees e JOIN departments d
+USING (department_id);
+
+#拓展
+SELECT last_name,job_title,department_name
+FROM employees INNER JOIN departments INNER JOIN jobs
+ON employees.department_id = departments.department_id
+AND employees.job_id = jobs.job_id;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 115 - 0
第六章、练习题一.sql

@@ -0,0 +1,115 @@
+#第六章、练习题(一)
+
+SELECT * FROM employees;
+
+SELECT * FROM departments;
+
+SELECT * FROM locations;
+
+SELECT * FROM jobs;
+
+#1、显示所有员工的姓名、部门号和部门名称
+SELECT e.last_name,e.department_id,d.department_name
+FROM employees e LEFT JOIN departments d
+ON e.department_id = d.department_id;
+
+#2、查询90号部门员工的job_id和90号部门的location_id
+SELECT e.last_name,e.job_id,d.location_id
+FROM employees e JOIN departments d
+ON e.department_id = 90
+AND e.department_id = d.department_id;
+#老师做的
+SELECT e.last_name,e.job_id,d.location_id
+FROM employees e JOIN departments d
+ON e.department_id = d.department_id
+WHERE d.department_id = 90;
+
+#3、选择所有有奖金的员工的last_name,department_name,location_id,city
+SELECT e.last_name,e.commission_pct,d.department_name,d.location_id,l.city
+FROM employees e LEFT JOIN departments d
+ON e.department_id = d.department_id
+LEFT JOIN locations l
+ON d.location_id = l.location_id
+WHERE e.commission_pct IS NOT null;
+
+SELECT *
+FROM employees
+WHERE commission_pct IS NOT	NULL;
+
+
+#老师做的
+SELECT e.last_name,d.department_name,d.location_id,l.city
+FROM employees e LEFT OUTER JOIN departments d
+ON e.`department_id` = d.`department_id`
+LEFT OUTER JOIN locations l
+ON d.`location_id` = l.`location_id`
+WHERE commission_pct IS NOT NULL;
+
+#4、选择city在Toronto工作的员工的last_name,job_id,department_id,department_name
+SELECT e.last_name,e.job_id,e.department_id,d.department_name
+FROM employees e JOIN departments d
+ON e.department_id = d.department_id
+JOIN locations l
+ON d.location_id = l.location_id
+WHERE l.city = 'Toronto';
+
+SELECT * 
+FROM locations
+WHERE city = 'Toronto';
+
+#SQL92语法:本题不涉及内外连接,所以可以用SQL92语法实现
+SELECT e.last_name,e.job_id,e.department_id,d.department_name
+FROM employees e,departments d,locations l
+WHERE e.department_id = d.department_id
+AND d.location_id = l.location_id
+AND l.city = 'Toronto';
+
+#5、查询员工所在的部门名称、部门地址、姓名、工作、工资,其中员工所在部门的部门名称为“Executive”
+SELECT d.department_name,l.street_address,e.last_name,j.job_title,e.salary
+FROM employees e LEFT JOIN departments d
+ON e.department_id = d.department_id
+JOIN locations l
+ON d.location_id = l.location_id
+JOIN jobs j
+ON e.job_id = j.job_id
+WHERE d.department_name = 'Executive';
+
+#6、选择指定员工的姓名,员工号,以及他的管理者的姓名和员工号,结果类似于下面的格式
+#employees  Emp#		manager 	Mgr#
+#kochhar		101			king		100
+
+SELECT e.last_name "employees",e.employee_id "Emp#",m.last_name "manager",m.employee_id "Mgr#"
+FROM employees e LEFT JOIN	employees m
+ON e.manager_id = m.employee_id;
+
+
+#7、查询哪些部门没有员工
+SELECT d.department_name,d.department_id
+FROM employees e RIGHT JOIN departments d
+ON e.department_id = d.department_id
+WHERE d.manager_id IS NULL;
+
+#老师做的
+SELECT d.department_name,d.department_id
+FROM departments d LEFT JOIN employees e
+ON d.department_id = e.department_id
+WHERE e.department_id IS NULL;
+#本题也可以使用子查询
+
+#8、查询那个城市没有部门
+SELECT l.location_id,l.city,d.department_name
+FROM departments d RIGHT JOIN locations l
+ON d.location_id = l.location_id
+WHERE d.department_name IS NULL;
+
+#老师做的
+SELECT l.location_id,l.city
+FROM locations l LEFT JOIN departments d
+ON l.location_id = d.location_id
+WHERE d.location_id IS NULL;
+
+#9、查询部门名为Sales或IT的员工信息
+SELECT e.employee_id,e.last_name,e.department_id,d.department_name
+FROM employees e JOIN departments d
+ON e.department_id = d.department_id
+WHERE d.department_name IN('Sales','IT');

+ 51 - 0
第六章、练习题二(多表查询).sql

@@ -0,0 +1,51 @@
+#第六章、练习题二(多表查询)
+#储备:建表操作:
+CREATE TABLE `t_dept` (
+`id` INT(11) NOT NULL AUTO_INCREMENT,
+`deptName` VARCHAR(30) DEFAULT NULL,
+`address` VARCHAR(40) DEFAULT NULL,
+PRIMARY KEY (`id`)
+) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
+CREATE TABLE `t_emp` (
+`id` INT(11) NOT NULL AUTO_INCREMENT,
+`name` VARCHAR(20) DEFAULT NULL,
+`age` INT(3) DEFAULT NULL,
+`deptId` INT(11) DEFAULT NULL,
+empno int not null,
+PRIMARY KEY (`id`),
+KEY `idx_dept_id` (`deptId`)
+#CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REFERENCES `t_dept` (`id`)
+) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
+
+INSERT INTO t_dept(deptName,address) VALUES('华山','华山');
+INSERT INTO t_dept(deptName,address) VALUES('丐帮','洛阳');
+INSERT INTO t_dept(deptName,address) VALUES('峨眉','峨眉山');
+INSERT INTO t_dept(deptName,address) VALUES('武当','武当山');
+INSERT INTO t_dept(deptName,address) VALUES('明教','光明顶');
+INSERT INTO t_dept(deptName,address) VALUES('少林','少林寺');
+INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('风清扬',90,1,100001);
+INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('岳不群',50,1,100002);
+INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('令狐冲',24,1,100003);
+INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('洪七公',70,2,100004);
+INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('乔峰',35,2,100005);
+INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('灭绝师太',70,3,100006);
+INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('周芷若',20,3,100007);
+INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('张三丰',100,4,100008);
+INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('张无忌',25,5,100009);
+INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('韦小宝',18,null,100010);
+
+#题目
+#1、所有有门派的人员信息(A、B两表共有)
+
+#2、列出所有用户,并显示其机构信息(A的全集)
+
+#3、列出所有门派(B的全集)
+
+#4、所有不入门派的人员(A的独有)
+
+#5、所有没人入的门派(B的独有)
+
+#6、列出所有人员和机构的对照关系(AB全有)
+
+#7、列出所有没如派的人员和没人入的门派(A的独有+B的独有)
+

+ 52 - 0
第四章、练习题.sql

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

+ 219 - 0
第四章、运算符.sql

@@ -0,0 +1,219 @@
+#第四章、运算符
+#1、算术运算符: + - * /(div) %(mod)
+
+SELECT 100,100 + 0,100 - 0,100 + 50,100 - 50,
+100 + 50 - 30,100 + 35.5,100 - 35.5
+FROM DUAL;
+
+#在SQL中,+没有连接的作用,就表示加法运算。
+#此时,会将字符串转换为数值(隐式转换)
+SELECT 100 + '1'	#在java语言中,结果是:1001
+FROM DUAL;
+
+SELECT 100 + 'a'	#此时将'a'看做0处理
+FROM DUAL;
+
+SELECT 100 + null	#null值参与运算,结果为null
+FROM DUAL;
+
+SELECT 100,100 * 1,100 / 1,100 * 1.0,100 / 1.0,100 / 2,
+100 + 2 * 5 / 2,100 / 3,100 DIV 0	#分母如果为0,结果为null
+FROM DUAL;
+
+#取模运算:% mod
+SELECT 12 % 3,12 % 5,12 MOD -5,-12 % 5,-12 % -5
+FROM DUAL;
+#结果的符号与被模数的符号一致
+
+#练习:查询员工id为偶数的员工信息
+SELECT employee_id,last_name,salary
+FROM employees
+WHERE employee_id % 2 = 0;
+
+#2、比较运算符
+#2.1	=	<=>	<>	!=	<	<=	>	>=
+
+# = 的使用
+SELECT 1 = 2,1 != 2,1 = '1',1 = 'a',0 = 'a'	#字符串存在隐式转换。如果转换数值不成功,则看做0
+FROM DUAL;
+
+SELECT 'a' = 'a','ab' = 'ab','a' = 'b'	#两边都是字符串的话,则按照ANSI的比较贵重进行比较
+FROM DUAL;
+
+SELECT 1 = NULL,NULL = NULL	#只要有null参与判断,结果就为null
+FROM DUAL;
+
+SELECT last_name,salary
+FROM employees
+WHERE salary = 6000;
+#WHERE commission_pct = NULL;#此时执行,不会有任何的结果
+
+#	<=>:安全等于。记忆技巧:为NULL而生。
+SELECT 1 <=> 2,1 <=> '1',1 <=> 'a',0 <=> 'a'	
+FROM DUAL;
+
+SELECT 1 <=> NULL,NULL <=> NULL
+FROM DUAL;
+
+#练习:查询员工表中commission_pct为null的数据有哪些
+SELECT last_name,salary,commission_pct
+FROM employees
+WHERE commission_pct <=> NULL;
+
+SELECT 3 <> 2,'4' <> NULL,'' != NULL,NULL != NULL
+FROM DUAL;
+
+#2.2
+#(1)IS NULL \ IS NOT NULL \ ISNULL
+#练习:查询员工表中commission_pct为null的数据有哪些
+SELECT last_name,salary,commission_pct
+FROM employees
+WHERE commission_pct IS NULL;
+#或
+SELECT last_name,salary,commission_pct
+FROM employees
+WHERE ISNULL(commission_pct);
+
+#练习:查询员工表中commission_pct不为null的数据有哪些
+SELECT last_name,salary,commission_pct
+FROM employees
+WHERE commission_pct IS NOT NULL;
+#或
+SELECT last_name,salary,commission_pct
+FROM employees
+WHERE NOT commission_pct <=> NULL;
+
+#(2) LEAST() \ GREATEST()
+
+SELECT LEAST('g','b','t','m'),GREATEST('g','b','t','m')
+FROM DUAL;
+
+SELECT LEAST(first_name,last_name),LEAST(LENGTH(first_name),LENGTH(last_name))
+FROM employees;
+
+#(3) BETWEEN 条件1(下界) AND 条件2(上界)	(查询条件1和条件2范围内的数据,包含边界)
+#查询工资在6000到8000的员工信息
+SELECT employee_id,last_name,salary
+FROM employees
+#WHERE salary BETWEEN 6000 AND 8000;
+WHERE salary >= 6000 && salary <= 8000;
+
+#交换6000和8000的位置之后,查询不到数据
+SELECT employee_id,last_name,salary
+FROM employees
+WHERE salary BETWEEN 8000 AND 6000;
+
+#查询工资不在6000到8000的员工信息
+SELECT employee_id,last_name,salary
+FROM employees
+#WHERE salary < 6000 OR salary > 8000;
+WHERE salary NOT BETWEEN 6000 AND 8000;
+
+#(4) IN(set)	\	NOT IN(set)
+#练习1:查询部门为10,20,30的员工信息
+SELECT last_name,salary,department_id
+FROM employees
+#WHERE department_id = 10 OR department_id = 20 OR department_id = 30;
+WHERE department_id IN (10,20,30);
+
+#练习2:查询工资不是6000,7000,8000的员工信息
+SELECT last_name,salary,department_id
+FROM employees
+WHERE salary NOT IN (6000,7000,8000);
+
+#(5)LIKE:模糊查询
+# % :代表不确定个数的字符(0个,1个,或多个)
+
+#练习:查询last_name中包含字符'a'的员工信息
+SELECT last_name,salary
+FROM employees
+WHERE last_name LIKE '%a%';
+
+#练习:查询last_name中以字符'a'开头的员工信息
+SELECT last_name,salary
+FROM employees
+WHERE last_name LIKE 'a%';
+
+#练习:查询last_name中包含字符'a'且包含字符'e'的员工信息
+#写法1
+SELECT last_name,salary
+FROM employees
+WHERE last_name LIKE '%a%' AND last_name LIKE '%e%';
+
+#写法2
+SELECT last_name,salary
+FROM employees
+WHERE last_name LIKE '%a%e%' or last_name LIKE '%e%a%';
+
+#	_ :代表一个不确定的字符
+#练习:查询第三个字符是'a'的员工信息
+SELECT last_name,salary
+FROM employees
+WHERE last_name LIKE '__a%';
+
+#练习:查询第二个字符是_且第三个字符是'a'的员工信息
+#需要使用转义字符:\
+SELECT last_name,salary
+FROM employees
+WHERE last_name LIKE '_\_a%';
+
+#或者
+SELECT last_name,salary
+FROM employees
+WHERE last_name LIKE '_$_a%' ESCAPE '$';
+
+#(6)REGEXP \ RLIKE:正则表达式
+SELECT 'shkstart' REGEXP '^s','shkstart' REGEXP 't$','shkstart' REGEXP 'hk'
+FROM DUAL;
+
+SELECT 'atguigu' REGEXP 'gu.gu','atguigu' REGEXP '[ab]'
+FROM DUAL;
+
+#3、逻辑运算符:OR	||	AND &&	NOT ! XOR
+
+#OR	AND
+SELECT last_name,salary,department_id
+FROM employees
+WHERE department_id = 50 AND salary > 6000;
+#WHERE department_id = 10 OR department_id = 20;
+#WHERE department_id = 10 AND department_id = 20;
+WHERE department_id = 50 AND salary > 6000;
+
+#NOT
+SELECT last_name,salary,department_id
+FROM employees
+#WHERE salary NOT BETWEEN 6000 AND 8000;
+#WHERE commission_pct IS NOT NULL;
+WHERE NOT commission_pct <=> NULL;
+
+#XOR:追求的“异”
+SELECT last_name,salary,department_id
+FROM employees
+WHERE department_id = 50 XOR salary > 6000;
+
+#注意:AND的优先级高于OR
+
+#4、位运算符:&	| ^ ~ >>	<<
+
+SELECT 12 & 5,12 | 5,12 ^ 5
+FROM DUAL;
+
+SELECT 10 & ~1 FROM DUAL;
+
+#在一定范围内满足:每向左移动1位,相当于乘以2;每向右移动一位,相当于除以2
+SELECT 4 << 1,8 >>1
+FROM DUAL;
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 99 - 0
补充:使用正则表达式查询.sql

@@ -0,0 +1,99 @@
+#补充:使用正则表达式查询
+#1、查询以特定字符或字符串开头的记录
+#字符“^”匹配以特定字符或者字符串开头的文本。
+#例:查询employees表中last_name字段值以字母'b'开头的记录
+SELECT *
+FROM employees
+WHERE last_name REGEXP '^b';
+
+#2、查询以特定字符或字符串结尾的记录
+#字符“$”匹配以特定字符或者字符串结尾的文本。
+#例:查询employees表中last_name字段值以字母“y”结尾的所有信息。
+SELECT *
+FROM employees
+WHERE last_name REGEXP 'y$';
+
+#3、用符号“.”来替代字符串中的任意一个字符
+#字符“.”匹配任意一个字符。
+#例:查询employees表中last_name字段值包含字母“a”与“k”且两个字母之间只有一个字母的记录。
+SELECT *
+FROM employees
+WHERE last_name REGEXP 'a.k';
+
+#4、使用“*”和“+”来匹配多个字符
+#星号“*”匹配前面的字符任意多次,包括0次。加号“+”匹配前面的字符至少一次。
+#例1:查询employees表中last_name字段值以字母“b”开头且“b”后面出现字母“a”的记录
+SELECT *
+FROM employees
+WHERE last_name REGEXP '^ba*';
+
+#例2:查询employees表中last_name字段值以字母“b”开头且“b”后面出现字母“a”至少一次的记录
+SELECT *
+FROM employees
+WHERE last_name REGEXP '^ba+';
+
+#5、匹配指定字符串
+#正则表达式可以匹配指定字符串,只要这个字符串在查询文本中即可,
+#如要匹配多个字符串,多个字符串直接使用分隔符“|”隔开。
+#例1:查询employees表中last_name字段值包含字符串“on”的记录。
+SELECT *
+FROM employees
+WHERE last_name REGEXP 'on';
+
+#例2:查询employees表中last_name字段值包含字符串“on”或者“no”的记录。
+SELECT *
+FROM employees
+WHERE last_name REGEXP 'on|no';#“on|no”之间不能有空格。
+
+#6、匹配指定字符中的任意一个
+#例:查询employees表中last_name字段值包含字母“o”或者“t”的记录。
+SELECT *
+FROM employees
+WHERE last_name REGEXP '[ot]';
+
+#7、匹配指定字符以外的字符
+#“[^字符集合]”匹配不在指定集合中的任何字符。
+#例1:查询employees表中last_name字段值包含字母“a~e”以外的记录。
+SELECT *
+FROM employees
+WHERE last_name REGEXP '[^a-e]';
+
+#例2:查询employees表中last_name字段值包含字母“a~z”以外的记录。
+SELECT *
+FROM employees
+WHERE last_name REGEXP '[^a-z]';
+
+SELECT 'desk'
+FROM DUAL
+WHERE 'desk' REGEXP '[^abcd]';
+
+#8、使用{n,}或者{n,m}来指定字符串连续出现的次数
+#“字符串{n,}”表示至少匹配n次前面的字符串;“字符串{n,m}”表示匹配前面的字符串
+#不少于n此,不多于m次。例如,“a{2,}”表示字母a练习出现至少2次,也可以大于
+#2次;“a{2,4}”表示字符a连续出现最少2次,最多不能超过4次。
+#例1:查询employees表中last_name字段值出现字母“a”至少2次的记录。
+SELECT *
+FROM employees
+WHERE last_name REGEXP 'a{2,}';
+
+#例2:查询employees表中last_name字段值出现字母“a”最少1次、最多3次的记录。
+SELECT *
+FROM employees
+WHERE last_name REGEXP 'a{1,3}';
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+