diff --git a/第三章:数据库查询.md b/第三章:数据库查询.md deleted file mode 100644 index d8b834a..0000000 --- a/第三章:数据库查询.md +++ /dev/null @@ -1,975 +0,0 @@ -

数据库查询

- -**作者:行癫(盗版必究)** - ------- - -## 一:基本查询 - -#### 1.简介 - -​ 单表查询 - -​ 简单查询 - -​ 通过条件查询 - -​ 查询排序 - -​ 限制查询记录数 - -​ 使用集合函数查询 - -​ 分组查询 - -​ 使用正则表达式查询 - -#### 2.案例 - -创建案例所需表:company.employee5 - -```shell - 雇员编号 id int - 雇员姓名 name varchar(30) - 雇员性别 sex enum - 雇用时期 hire_date date - 职位 post varchar(50) - 职位描述 job_description varchar(100) - 薪水 salary double(15,2) - 办公室 office int - 部门编号 dep_id int -``` - -```shell -MySQL [(none)]> CREATE TABLE company.employee5( - id int primary key AUTO_INCREMENT not null, - name varchar(30) not null, - sex enum('male','female') default 'male' not null, - hire_date date not null, - post varchar(50) not null, - job_description varchar(100), - salary double(15,2) not null, - office int, - dep_id int - ); -``` - -插入模拟数据: - -```shell -MySQL [(none)]> insert into company.employee5(name,sex,hire_date,post,job_description,salary,office,dep_id) values - ('jack','male','20180202','instructor','teach',5000,501,100), - ('tom','male','20180203','instructor','teach',5500,501,100), - ('robin','male','20180202','instructor','teach',8000,501,100), - ('alice','female','20180202','instructor','teach',7200,501,100), - ('','male','20180202','hr','hrcc',600,502,101), - ('harry','male','20180202','hr',NULL,6000,502,101), - ('emma','female','20180206','sale','salecc',20000,503,102), - ('christine','female','20180205','sale','salecc',2200,503,102), - ('zhuzhu','male','20180205','sale',NULL,2200,503,102), - ('gougou','male','20180205','sale','',2200,503,102); -``` - -语法格式: - -​ select 字段名称,字段名称2...... from 表名 [条件] - -##### a.简单查询 - -```shell -MySQL [company]> select * from employee5; -+----+-----------+--------+------------+------------+-----------------+----------+--------+--------+ -| id | name | sex | hire_date | post | job_description | salary | office | dep_id | -+----+-----------+--------+------------+------------+-----------------+----------+--------+--------+ -| 1 | jack | male | 2018-02-02 | instructor | teach | 5000.00 | 501 | 100 | -| 2 | tom | male | 2018-02-03 | instructor | teach | 5500.00 | 501 | 100 | -| 3 | robin | male | 2018-02-02 | instructor | teach | 8000.00 | 501 | 100 | -| 4 | alice | female | 2018-02-02 | instructor | teach | 7200.00 | 501 | 100 | -| 5 | | male | 2018-02-02 | hr | hrcc | 600.00 | 502 | 101 | -| 6 | harry | male | 2018-02-02 | hr | NULL | 6000.00 | 502 | 101 | -| 7 | emma | female | 2018-02-06 | sale | salecc | 20000.00 | 503 | 102 | -| 8 | christine | female | 2018-02-05 | sale | salecc | 2200.00 | 503 | 102 | -| 9 | zhuzhu | male | 2018-02-05 | sale | NULL | 2200.00 | 503 | 102 | -| 10 | gougou | male | 2018-02-05 | sale | | 2200.00 | 503 | 102 | -+----+-----------+--------+------------+------------+-----------------+----------+--------+--------+ -10 rows in set (0.00 sec) - -MySQL [company]> select name, salary, dep_id from employee5 where id <=5; -+-------+---------+--------+ -| name | salary | dep_id | -+-------+---------+--------+ -| jack | 5000.00 | 100 | -| tom | 5500.00 | 100 | -| robin | 8000.00 | 100 | -| alice | 7200.00 | 100 | -| | 600.00 | 101 | -+-------+---------+--------+ -5 rows in set (0.00 sec) -``` - -##### b.避免重复 - -​ 不能部分使用DISTINCT,通常仅用于某一字段 - -```shell -MySQL [company]> SELECT post FROM employee5; -+------------+ -| post | -+------------+ -| instructor | -| instructor | -| instructor | -| instructor | -| hr | -| hr | -| sale | -| sale | -| sale | -| sale | -+------------+ -10 rows in set (0.00 sec) - -MySQL [company]> SELECT distinct post FROM employee5; -+------------+ -| post | -+------------+ -| instructor | -| hr | -| sale | -+------------+ -3 rows in set (0.00 sec) -``` - -##### c.四则运算查询 - -```shell -MySQL [company]> SELECT name, salary, salary*14 FROM employee5; -+-----------+----------+-----------+ -| name | salary | salary*14 | -+-----------+----------+-----------+ -| jack | 5000.00 | 70000.00 | -| tom | 5500.00 | 77000.00 | -| robin | 8000.00 | 112000.00 | -| alice | 7200.00 | 100800.00 | -| | 600.00 | 8400.00 | -| harry | 6000.00 | 84000.00 | -| emma | 20000.00 | 280000.00 | -| christine | 2200.00 | 30800.00 | -| zhuzhu | 2200.00 | 30800.00 | -| gougou | 2200.00 | 30800.00 | -+-----------+----------+-----------+ -10 rows in set (0.01 sec) - -MySQL [company]> SELECT name, salary, salary*14 AS Annual_salary FROM employee5; -+-----------+----------+---------------+ -| name | salary | Annual_salary | -+-----------+----------+---------------+ -| jack | 5000.00 | 70000.00 | -| tom | 5500.00 | 77000.00 | -| robin | 8000.00 | 112000.00 | -| alice | 7200.00 | 100800.00 | -| | 600.00 | 8400.00 | -| harry | 6000.00 | 84000.00 | -| emma | 20000.00 | 280000.00 | -| christine | 2200.00 | 30800.00 | -| zhuzhu | 2200.00 | 30800.00 | -| gougou | 2200.00 | 30800.00 | -+-----------+----------+---------------+ -10 rows in set (0.00 sec) - -MySQL [company]> SELECT name, salary, salary*14 Annual_salary FROM employee5; -+-----------+----------+---------------+ -| name | salary | Annual_salary | -+-----------+----------+---------------+ -| jack | 5000.00 | 70000.00 | -| tom | 5500.00 | 77000.00 | -| robin | 8000.00 | 112000.00 | -| alice | 7200.00 | 100800.00 | -| | 600.00 | 8400.00 | -| harry | 6000.00 | 84000.00 | -| emma | 20000.00 | 280000.00 | -| christine | 2200.00 | 30800.00 | -| zhuzhu | 2200.00 | 30800.00 | -| gougou | 2200.00 | 30800.00 | -+-----------+----------+---------------+ -10 rows in set (0.00 sec) -``` - -##### d.定义显示格式 - -​ CONCAT() 函数用于连接字符串 - -```shell -MySQL [company]> SELECT concat(name, 's annual salary: ', salary*14) AS Annual_salary FROM employee5; -+------------------------------------+ -| Annual_salary | -+------------------------------------+ -| jacks annual salary: 70000.00 | -| toms annual salary: 77000.00 | -| robins annual salary: 112000.00 | -| alices annual salary: 100800.00 | -| s annual salary: 8400.00 | -| harrys annual salary: 84000.00 | -| emmas annual salary: 280000.00 | -| christines annual salary: 30800.00 | -| zhuzhus annual salary: 30800.00 | -| gougous annual salary: 30800.00 | -+------------------------------------+ -10 rows in set (0.00 sec) -``` - -##### e.单条件查询 - -```shell -MySQL [company]> SELECT name,post FROM employee5 WHERE post='hr'; -+-------+------+ -| name | post | -+-------+------+ -| | hr | -| harry | hr | -+-------+------+ -2 rows in set (0.00 sec) -``` - -##### f.多条件查询 - -```shell -MySQL [company]> SELECT name,salary FROM employee5 WHERE post='hr' AND salary>10000; -Empty set (0.00 sec) - -MySQL [company]> select * from employee5 where salary>5000 and salary<10000 or dep_id=102; -+----+-----------+--------+------------+------------+-----------------+----------+--------+--------+ -| id | name | sex | hire_date | post | job_description | salary | office | dep_id | -+----+-----------+--------+------------+------------+-----------------+----------+--------+--------+ -| 2 | tom | male | 2018-02-03 | instructor | teach | 5500.00 | 501 | 100 | -| 3 | robin | male | 2018-02-02 | instructor | teach | 8000.00 | 501 | 100 | -| 4 | alice | female | 2018-02-02 | instructor | teach | 7200.00 | 501 | 100 | -| 6 | harry | male | 2018-02-02 | hr | NULL | 6000.00 | 502 | 101 | -| 7 | emma | female | 2018-02-06 | sale | salecc | 20000.00 | 503 | 102 | -| 8 | christine | female | 2018-02-05 | sale | salecc | 2200.00 | 503 | 102 | -| 9 | zhuzhu | male | 2018-02-05 | sale | NULL | 2200.00 | 503 | 102 | -| 10 | gougou | male | 2018-02-05 | sale | | 2200.00 | 503 | 102 | -+----+-----------+--------+------------+------------+-----------------+----------+--------+--------+ -8 rows in set (0.00 sec) -``` - -##### g.关键字 - -​ BETWEEN AND - -```shell -MySQL [company]> SELECT name,salary FROM employee5 WHERE salary BETWEEN 5000 AND 15000; -+-------+---------+ -| name | salary | -+-------+---------+ -| jack | 5000.00 | -| tom | 5500.00 | -| robin | 8000.00 | -| alice | 7200.00 | -| harry | 6000.00 | -+-------+---------+ -5 rows in set (0.00 sec) - -MySQL [company]> SELECT name,salary FROM employee5 WHERE salary NOT BETWEEN 5000 AND 15000; -+-----------+----------+ -| name | salary | -+-----------+----------+ -| | 600.00 | -| emma | 20000.00 | -| christine | 2200.00 | -| zhuzhu | 2200.00 | -| gougou | 2200.00 | -+-----------+----------+ -5 rows in set (0.00 sec) -``` - -​ IS NULL - -```shell -MySQL [company]> SELECT name,job_description FROM employee5 WHERE job_description IS NULL; -+--------+-----------------+ -| name | job_description | -+--------+-----------------+ -| harry | NULL | -| zhuzhu | NULL | -+--------+-----------------+ -2 rows in set (0.00 sec) - -MySQL [company]> SELECT name,job_description FROM employee5 WHERE job_description IS NOT NULL; -+-----------+-----------------+ -| name | job_description | -+-----------+-----------------+ -| jack | teach | -| tom | teach | -| robin | teach | -| alice | teach | -| | hrcc | -| emma | salecc | -| christine | salecc | -| gougou | | -+-----------+-----------------+ -8 rows in set (0.00 sec) - -MySQL [company]> SELECT name,job_description FROM employee5 WHERE job_description=''; -+--------+-----------------+ -| name | job_description | -+--------+-----------------+ -| gougou | | -+--------+-----------------+ -1 row in set (0.00 sec) -``` - -注意:(NULL说明) - -​ 等价于没有任何值、是未知数 - -​ NULL与0、空字符串、空格都不同,NULL没有分配存储空间 - -​ 对空值做加、减、乘、除等运算操作,结果仍为空 - -​ 比较时使用关键字用“is null”和“is not null” - -​ 排序时比其他数据都小(索引默认是降序排列,小→大),所以NULL值总是排在最前 - -IN集合查询 - -```shell -MySQL [company]> SELECT name, salary FROM employee5 WHERE salary=4000 OR salary=5000 OR salary=6000 OR salary=9000 ; -+-------+---------+ -| name | salary | -+-------+---------+ -| jack | 5000.00 | -| harry | 6000.00 | -+-------+---------+ -2 rows in set (0.00 sec) - -MySQL [company]> SELECT name, salary FROM employee5 WHERE salary IN (4000,5000,6000,9000) ; -+-------+---------+ -| name | salary | -+-------+---------+ -| jack | 5000.00 | -| harry | 6000.00 | -+-------+---------+ -2 rows in set (0.00 sec) - -MySQL [company]> SELECT name, salary FROM employee5 WHERE salary NOT IN (4000,5000,6000,9000) ; -+-----------+----------+ -| name | salary | -+-----------+----------+ -| tom | 5500.00 | -| robin | 8000.00 | -| alice | 7200.00 | -| | 600.00 | -| emma | 20000.00 | -| christine | 2200.00 | -| zhuzhu | 2200.00 | -| gougou | 2200.00 | -+-----------+----------+ -8 rows in set (0.01 sec) -``` - -##### h.模糊查询 - -​ 关键字LIKE - -​ 通配符%:所有字符 - -​ 通配符_: 一个字符 - -```shell -MySQL [company]> SELECT * FROM employee5 WHERE name LIKE 'al%'; -+----+-------+--------+------------+------------+-----------------+---------+--------+--------+ -| id | name | sex | hire_date | post | job_description | salary | office | dep_id | -+----+-------+--------+------------+------------+-----------------+---------+--------+--------+ -| 4 | alice | female | 2018-02-02 | instructor | teach | 7200.00 | 501 | 100 | -+----+-------+--------+------------+------------+-----------------+---------+--------+--------+ -1 row in set (0.00 sec) - -MySQL [company]> SELECT * FROM employee5 WHERE name LIKE 'al___'; -+----+-------+--------+------------+------------+-----------------+---------+--------+--------+ -| id | name | sex | hire_date | post | job_description | salary | office | dep_id | -+----+-------+--------+------------+------------+-----------------+---------+--------+--------+ -| 4 | alice | female | 2018-02-02 | instructor | teach | 7200.00 | 501 | 100 | -+----+-------+--------+------------+------------+-----------------+---------+--------+--------+ -1 row in set (0.00 sec) -``` - -##### i.排序查询 - -```shell -MySQL [company]> select name,salary from employee5 order by salary; -+-----------+----------+ -| name | salary | -+-----------+----------+ -| | 600.00 | -| christine | 2200.00 | -| zhuzhu | 2200.00 | -| gougou | 2200.00 | -| jack | 5000.00 | -| tom | 5500.00 | -| harry | 6000.00 | -| alice | 7200.00 | -| robin | 8000.00 | -| emma | 20000.00 | -+-----------+----------+ -10 rows in set (0.01 sec) - -MySQL [company]> select name,salary from employee5 order by salary desc; -+-----------+----------+ -| name | salary | -+-----------+----------+ -| emma | 20000.00 | -| robin | 8000.00 | -| alice | 7200.00 | -| harry | 6000.00 | -| tom | 5500.00 | -| jack | 5000.00 | -| christine | 2200.00 | -| zhuzhu | 2200.00 | -| gougou | 2200.00 | -| | 600.00 | -+-----------+----------+ - -MySQL [company]> select name,salary from employee5 order by salary desc limit 3; //控制显示前3行 -+-------+----------+ -| name | salary | -+-------+----------+ -| emma | 20000.00 | -| robin | 8000.00 | -| alice | 7200.00 | -+-------+----------+ -3 rows in set (0.00 sec) - -MySQL [company]> select name,salary from employee5 order by salary desc limit 1,3; //从序号1开始显示三行的内容 -+-------+---------+ -| name | salary | -+-------+---------+ -| robin | 8000.00 | -| alice | 7200.00 | -| harry | 6000.00 | -+-------+---------+ -3 rows in set (0.00 sec) -``` - -注意: - -​ ascending 美音 /ə'sɛndɪŋ/ 升序 - -​ descending 美音 /dɪ'sɛndɪŋ/ 降序 - -##### j.集合函数查询 - -​ count:可以查看共有多少条记录 - -```shell -MySQL [company]> select count(*) from employee5; -+----------+ -| count(*) | -+----------+ -| 10 | -+----------+ -1 row in set (0.00 sec) - -MySQL [company]> select count(name) from employee5; -+-------------+ -| count(name) | -+-------------+ -| 10 | -+-------------+ -1 row in set (0.00 sec) - -``` - -​ max:查看最大值 - -```shell -MySQL [company]> select max(salary) from employee5; -+-------------+ -| max(salary) | -+-------------+ -| 20000.00 | -+-------------+ -1 row in set (0.00 sec) -``` - -​ min:查看最小值 - -```shell -MySQL [company]> select min(salary) from employee5; -+-------------+ -| min(salary) | -+-------------+ -| 600.00 | -+-------------+ -1 row in set (0.00 sec) -``` - -​ avg:查看平均值 - -```shell -MySQL [company]> select avg(salary) from employee5; -+-------------+ -| avg(salary) | -+-------------+ -| 5890.000000 | -+-------------+ -1 row in set (0.00 sec) -``` - -​ sum:求和 - -​ sale这个部门的总工资 - -```shell -MySQL [company]> select concat("Total Department Wages:",sum(salary)) from employee5 where post='sale'; -+-------------------------------------------------+ -| concat("Total Department Wages:",sum(salary)) | -+-------------------------------------------------+ -| Total Department Wages:26600.00 | -+-------------------------------------------------+ -1 row in set (0.00 sec) -``` - -​ 获取薪水最高的这个人的详细信息 - -```shell -MySQL [company]> select * from employee5 where salary = (select max(salary) from employee5); -+----+------+--------+------------+------+-----------------+----------+--------+--------+ -| id | name | sex | hire_date | post | job_description | salary | office | dep_id | -+----+------+--------+------------+------+-----------------+----------+--------+--------+ -| 7 | emma | female | 2018-02-06 | sale | salecc | 20000.00 | 503 | 102 | -+----+------+--------+------------+------+-----------------+----------+--------+--------+ -1 row in set (0.00 sec) -``` - -##### k.分组查询 - -​ GROUP BY和GROUP_CONCAT()函数一起使用 - -​ 获取部门ID相同的员工并把名字拼接到一起 - -```shell -MySQL [company]> SELECT dep_id,GROUP_CONCAT(name) FROM employee5 GROUP BY dep_id; -+--------+------------------------------+ -| dep_id | GROUP_CONCAT(name) | -+--------+------------------------------+ -| 100 | jack,tom,robin,alice | -| 101 | ,harry | -| 102 | emma,christine,zhuzhu,gougou | -+--------+------------------------------+ -3 rows in set (0.01 sec) -``` - -​ GROUP BY和集合函数一起使用 - -​ 获取部门最高薪资 - -```shell -MySQL [company]> SELECT post,max(salary) FROM employee5 GROUP BY post; -+------------+-------------+ -| post | max(salary) | -+------------+-------------+ -| hr | 6000.00 | -| instructor | 8000.00 | -| sale | 20000.00 | -+------------+-------------+ -3 rows in set (0.00 sec) -``` - -##### l.正则查询 - -```shell -以什么开头 -MySQL [company]> SELECT * FROM employee5 WHERE name REGEXP '^ali'; -+----+-------+--------+------------+------------+-----------------+---------+--------+--------+ -| id | name | sex | hire_date | post | job_description | salary | office | dep_id | -+----+-------+--------+------------+------------+-----------------+---------+--------+--------+ -| 4 | alice | female | 2018-02-02 | instructor | teach | 7200.00 | 501 | 100 | -+----+-------+--------+------------+------------+-----------------+---------+--------+--------+ -1 row in set (0.00 sec) - -以什么结尾 -MySQL [company]> SELECT * FROM employee5 WHERE name REGEXP 'ce$'; -+----+-------+--------+------------+------------+-----------------+---------+--------+--------+ -| id | name | sex | hire_date | post | job_description | salary | office | dep_id | -+----+-------+--------+------------+------------+-----------------+---------+--------+--------+ -| 4 | alice | female | 2018-02-02 | instructor | teach | 7200.00 | 501 | 100 | -+----+-------+--------+------------+------------+-----------------+---------+--------+--------+ -1 row in set (0.01 sec) - -连续出现n次 -MySQL [company]> SELECT * FROM employee5 WHERE name REGEXP 'm{2}'; -+----+------+--------+------------+------+-----------------+----------+--------+--------+ -| id | name | sex | hire_date | post | job_description | salary | office | dep_id | -+----+------+--------+------------+------+-----------------+----------+--------+--------+ -| 7 | emma | female | 2018-02-06 | sale | salecc | 20000.00 | 503 | 102 | -+----+------+--------+------------+------+-----------------+----------+--------+--------+ -1 row in set (0.00 sec) -``` - -## 二:多表联合查询 - -【扩展了解】 - -#### 1.数据准备 - -##### 表:company.employee6 - -创建表: - -```shell -MySQL [company]> create table employee6( - emp_id int auto_increment primary key not null, - emp_name varchar(50), - age int, - dept_id int); -Query OK, 0 rows affected (0.65 sec) -``` - -查看表结构: - -```shell -MySQL [company]> desc employee6; -+----------+-------------+------+-----+---------+----------------+ -| Field | Type | Null | Key | Default | Extra | -+----------+-------------+------+-----+---------+----------------+ -| emp_id | int(11) | NO | PRI | NULL | auto_increment | -| emp_name | varchar(50) | YES | | NULL | | -| age | int(11) | YES | | NULL | | -| dept_id | int(11) | YES | | NULL | | -+----------+-------------+------+-----+---------+----------------+ -4 rows in set (0.00 sec) -``` - -插入模拟数据: - -```shell -MySQL [company]> insert into employee6(emp_name,age,dept_id) values - ('',19,200), - ('tom',26,201), - ('jack',30,201), - ('alice',24,202), - ('robin',40,200), - ('xingdian',16,200), - ('natasha',28,204); -``` - -查看数据: - -```shell -MySQL [company]> select * from employee6; -+--------+----------+------+---------+ -| emp_id | emp_name | age | dept_id | -+--------+----------+------+---------+ -| 1 | | 19 | 200 | -| 2 | tom | 26 | 201 | -| 3 | jack | 30 | 201 | -| 4 | alice | 24 | 202 | -| 5 | robin | 40 | 200 | -| 6 | xingdian | 16 | 200 | -| 7 | natasha | 28 | 204 | -+--------+----------+------+---------+ -7 rows in set (0.00 sec) -``` - -##### 表:company.department6 - -创建表: - -```shell -MySQL [company]> create table department6( - dept_id int, - dept_name varchar(100) - ); -Query OK, 0 rows affected (0.33 sec) -``` - -查看表结构: - -```shell -MySQL [company]> desc department6; -+-----------+--------------+------+-----+---------+-------+ -| Field | Type | Null | Key | Default | Extra | -+-----------+--------------+------+-----+---------+-------+ -| dept_id | int(11) | YES | | NULL | | -| dept_name | varchar(100) | YES | | NULL | | -+-----------+--------------+------+-----+---------+-------+ -2 rows in set (0.00 sec) -``` - -模拟插入数据: - -```shell -MySQL [company]> insert into department6 values - (200,'hr'), - (201,'it'), - (202,'sale'), - (203,'fd'); -``` - -查看数据: - -```shell -MySQL [company]> select * from department6; -+---------+-----------+ -| dept_id | dept_name | -+---------+-----------+ -| 200 | hr | -| 201 | it | -| 202 | sale | -| 203 | fd | -+---------+-----------+ -4 rows in set (0.01 sec) -``` - -#### 2.多表的连接查询 - -​ 交叉连接:生成笛卡尔积,它不使用任何匹配条件;交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合 - -​ 内连接:只连接匹配的行 - -​ 外连接 - -​ 左连接:会显示左边表内所有的值,不论在右边表内匹不匹配 - -​ 右连接:会显示右边表内所有的值,不论在左边表内匹不匹配 - -​ 全外连接:包含左、右两个表的全部行 - -##### 交叉连接 - -```shell -MySQL [company]> select employee6.emp_name,employee6.age,employee6.dept_id,department6.dept_name from employee6,department6; -+----------+------+---------+-----------+ -| emp_name | age | dept_id | dept_name | -+----------+------+---------+-----------+ -| | 19 | 200 | hr | -| | 19 | 200 | it | -| | 19 | 200 | sale | -| | 19 | 200 | fd | -| tom | 26 | 201 | hr | -| tom | 26 | 201 | it | -| tom | 26 | 201 | sale | -| tom | 26 | 201 | fd | -| jack | 30 | 201 | hr | -| jack | 30 | 201 | it | -| jack | 30 | 201 | sale | -| jack | 30 | 201 | fd | -| alice | 24 | 202 | hr | -| alice | 24 | 202 | it | -| alice | 24 | 202 | sale | -| alice | 24 | 202 | fd | -| robin | 40 | 200 | hr | -| robin | 40 | 200 | it | -| robin | 40 | 200 | sale | -| robin | 40 | 200 | fd | -| xingdian | 16 | 200 | hr | -| xingdian | 16 | 200 | it | -| xingdian | 16 | 200 | sale | -| xingdian | 16 | 200 | fd | -| natasha | 28 | 204 | hr | -| natasha | 28 | 204 | it | -| natasha | 28 | 204 | sale | -| natasha | 28 | 204 | fd | -+----------+------+---------+-----------+ -28 rows in set (0.00 sec) -``` - -##### 内连接 - -​ 获取有部门的员工 (部门表中没有natasha所在的部门) - -```shell -MySQL [company]> select employee6.emp_name,employee6.age,employee6.dept_id,department6.dept_name from employee6,department6 where employee6.dept_id=department6.dept_id; -+----------+------+---------+-----------+ -| emp_name | age | dept_id | dept_name | -+----------+------+---------+-----------+ -| | 19 | 200 | hr | -| tom | 26 | 201 | it | -| jack | 30 | 201 | it | -| alice | 24 | 202 | sale | -| robin | 40 | 200 | hr | -| xingdian | 16 | 200 | hr | -+----------+------+---------+-----------+ -6 rows in set (0.00 sec) - -MySQL [company]> select employee6.emp_name,department6.dept_name from employee6 inner join department6 on employee6.dept_id=department6.dept_id; -+----------+-----------+ -| emp_name | dept_name | -+----------+-----------+ -| | hr | -| tom | it | -| jack | it | -| alice | sale | -| robin | hr | -| xingdian | hr | -+----------+-----------+ -6 rows in set (0.01 sec) -``` - -##### 外连接 - -语法: - -​ SELECT 字段列表 FROM 表1 LEFT|RIGHT JOIN 表2 ON 表1.字段 = 表2.字段; - -注意: - -​ 先用谁谁就是左 - -###### 左连接 left join - -```shell -找出所有员工及所属的部门,包括没有部门的员工 -MySQL [company]> select emp_id,emp_name,dept_name from employee6 left join department6 on employee6.dept_id = department6.dept_id; -+--------+----------+-----------+ -| emp_id | emp_name | dept_name | -+--------+----------+-----------+ -| 1 | | hr | -| 5 | robin | hr | -| 6 | xingdian | hr | -| 2 | tom | it | -| 3 | jack | it | -| 4 | alice | sale | -| 7 | natasha | NULL | -+--------+----------+-----------+ -7 rows in set (0.00 sec) -``` - -###### 右连接right join - -``` -找出所有部门包含的员工,包括空部门 -MySQL [company]> select emp_id,emp_name,dept_name from employee6 right join department6 on employee6.dept_id = department6.dept_id; -+--------+----------+-----------+ -| emp_id | emp_name | dept_name | -+--------+----------+-----------+ -| 1 | | hr | -| 2 | tom | it | -| 3 | jack | it | -| 4 | alice | sale | -| 5 | robin | hr | -| 6 | xingdian | hr | -| NULL | NULL | fd | -+--------+----------+-----------+ -7 rows in set (0.00 sec) -``` - -##### 全外连接 - -```shell -MySQL [company]> select * from employee6 full join department6; -+--------+----------+------+---------+---------+-----------+ -| emp_id | emp_name | age | dept_id | dept_id | dept_name | -+--------+----------+------+---------+---------+-----------+ -| 1 | | 19 | 200 | 200 | hr | -| 1 | | 19 | 200 | 201 | it | -| 1 | | 19 | 200 | 202 | sale | -| 1 | | 19 | 200 | 203 | fd | -| 2 | tom | 26 | 201 | 200 | hr | -| 2 | tom | 26 | 201 | 201 | it | -| 2 | tom | 26 | 201 | 202 | sale | -| 2 | tom | 26 | 201 | 203 | fd | -| 3 | jack | 30 | 201 | 200 | hr | -| 3 | jack | 30 | 201 | 201 | it | -| 3 | jack | 30 | 201 | 202 | sale | -| 3 | jack | 30 | 201 | 203 | fd | -| 4 | alice | 24 | 202 | 200 | hr | -| 4 | alice | 24 | 202 | 201 | it | -| 4 | alice | 24 | 202 | 202 | sale | -| 4 | alice | 24 | 202 | 203 | fd | -| 5 | robin | 40 | 200 | 200 | hr | -| 5 | robin | 40 | 200 | 201 | it | -| 5 | robin | 40 | 200 | 202 | sale | -| 5 | robin | 40 | 200 | 203 | fd | -| 6 | xingdian | 16 | 200 | 200 | hr | -| 6 | xingdian | 16 | 200 | 201 | it | -| 6 | xingdian | 16 | 200 | 202 | sale | -| 6 | xingdian | 16 | 200 | 203 | fd | -| 7 | natasha | 28 | 204 | 200 | hr | -| 7 | natasha | 28 | 204 | 201 | it | -| 7 | natasha | 28 | 204 | 202 | sale | -| 7 | natasha | 28 | 204 | 203 | fd | -+--------+----------+------+---------+---------+-----------+ -28 rows in set (0.00 sec) -``` - -#### 3.复合条件连接查询 - -##### 案例一 - -​ 找出公司所有部门中年龄大于25岁的员工 - -​ 以内连接的方式查询employee6和department6表,并且employee6表中的age字段值必须大于25 - -```shell -MySQL [company]> select emp_id,emp_name,dept_name FROM employee6,department6 WHERE employee6.dept_id = department6.dept_id AND age > 25; -+--------+----------+-----------+ -| emp_id | emp_name | dept_name | -+--------+----------+-----------+ -| 5 | robin | hr | -| 2 | tom | it | -| 3 | jack | it | -+--------+----------+-----------+ -3 rows in set (0.01 sec) -``` - -##### 案例二 - -​ 以内连接的方式查询employee6和department6表,并且以age字段的升序方式显示 - -```shell -MySQL [company]> select emp_id,emp_name,dept_name FROM employee6,department6 WHERE employee6.dept_id = department6.dept_id ORDER BY age asc; -+--------+----------+-----------+ -| emp_id | emp_name | dept_name | -+--------+----------+-----------+ -| 6 | xingdian | hr | -| 1 | | hr | -| 4 | alice | sale | -| 2 | tom | it | -| 3 | jack | it | -| 5 | robin | hr | -+--------+----------+-----------+ -``` - -#### 4.子查询 - -​ 子查询是将一个查询语句嵌套在另一个查询语句中 - -​ 内层查询语句的查询结果,可以为外层查询语句提供查询条件 - -​ 子查询中可以包含:IN、NOT IN等关键字;还可以包含比较运算符:= 、 !=、> 、<等 - -##### 案例一 - -​ 带IN关键字的子查询;查询employee表,但dept_id必须在department表中出现过 - -```shell -MySQL [company]> select * from employee6 WHERE dept_id IN (select dept_id FROM department6); -+--------+----------+------+---------+ -| emp_id | emp_name | age | dept_id | -+--------+----------+------+---------+ -| 1 | | 19 | 200 | -| 2 | tom | 26 | 201 | -| 3 | jack | 30 | 201 | -| 4 | alice | 24 | 202 | -| 5 | robin | 40 | 200 | -| 6 | xingdian | 16 | 200 | -+--------+----------+------+---------+ -6 rows in set (0.00 sec) -``` - -##### 案例二 - -​ 带比较运算符的子查询;查询年龄大于等于25岁员工所在部门(查询老龄化的部门) - -```shell -MySQL [company]> select dept_id,dept_name FROM department6 WHERE dept_id IN (SELECT DISTINCT dept_id FROM employee6 WHERE age >=25); -+---------+-----------+ -| dept_id | dept_name | -+---------+-----------+ -| 201 | it | -| 200 | hr | -+---------+-----------+ -2 rows in set (0.00 sec) -``` \ No newline at end of file