接下来需要用到的表
-- 创建公司数据库
CREATE DATABASE IF NOT EXISTS company CHARACTER SET utf8;
-- 使用数据库
USE company;
-- 创建部门表
CREATE TABLE dept(
did INT PRIMARY KEY AUTO_INCREMENT, -- 部门编号
dname VARCHAR(40) -- 部门名称
);
-- 向部门表插入数据
INSERT INTO dept(dname) VALUES('开发部'),('市场部'),('财务部');
-- 创建员工表
CREATE TABLE emp(
eid INT PRIMARY KEY AUTO_INCREMENT, -- 员工编号
ename VARCHAR(40), -- 员工姓名
gender CHAR(1), -- 性别
salary DOUBLE, -- 工资
join_date DATE, -- 入职日期
dept_id INT, -- 部门外键
FOREIGN KEY (dept_id) REFERENCES dept(did) -- 外键,关联部门表
);
-- 插入数据
INSERT INTO emp(ename,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2018-01-24',1);
INSERT INTO emp(ename,gender,salary,join_date,dept_id) VALUES('猪八戒','男',3600,'2019-12-02',2);
INSERT INTO emp(ename,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2018-08-08',2);
INSERT INTO emp(ename,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2019-10-07',3);
INSERT INTO emp(ename,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2020-03-14',1);
查询语法
SELECT
列名列表
FROM
表名列表
WHERE
限定条件
注意:多表查询要 消除无用的数据
使用 where 条件消除无用数据
标准格式
SELECT
t1.ename, -- 员工表的姓名
t1.gender, -- 员工表的性别
t2.dname -- 部门表的名称
FROM
emp t1, -- 起别名,替换表名,更加方便
dept t2
WHERE
t1.dept_id = t2.did; -- 员工表外键等于部门表的did键
示例代码
SELECT
*
FROM
emp e,
dept d
WHERE
e.dept_id = d.did;
SELECT
t1.ename, -- 员工表的姓名
t1.gender, -- 员工表的性别
t2.dname -- 部门表的名称
FROM
emp t1, -- 起别名,替换表名,更加方便
dept t2
WHERE
t1.dept_id = t2.did;
语法
SELECT
字段列表
FROM
表名1
[INNER] JOIN -- 这里的 INNER 可以去掉的
表名2
ON
条件;
示例代码
-- 方式一
SELECT
*
FROM
emp t1
INNER JOIN
dept t2
ON
t1.`dept_id` = t2.`did`; -- 员工表部门外键等于部门表主键
-- 方式二
SELECT
*
FROM
emp t1
JOIN -- 这里的 INNER 可以去掉的
dept t2
ON
t1.`dept_id` = t2.`did`; -- 员工表部门外键等于部门表主键
SELECT
t1.`ename` "员工姓名",
t2.`dname` "员工部门"
FROM
emp t1
JOIN
dept t2
ON
t1.`dept_id` = t2.`did`; -- 员工表部门外键等于部门表主键
语法
SELECT
字段列表
FROM
表1
LEFT [OUTER] JOIN -- 左外连接
表2
ON
条件;
左外连接查询什么?
代码示例
SELECT
t1.*, -- 员工表所有信息
t2.`dname` -- 部门名称
FROM
emp t1
LEFT OUTER JOIN -- 左外连接
dept t2
ON
t1.`dept_id`=t2.`did`;
SELECT
t1.*,
t2.`dname`
FROM
emp t1
LEFT JOIN
dept t2
ON
t1.`dept_id`=t2.`did`
WHERE
t2.`dname`='开发部';
语法
SELECT
字段列表
FROM
表1
RIGHT [OUTER] JOIN -- 右外连接
表2
ON
条件;
右外连接查询什么?
代码示例
SELECT
*
FROM
dept t2
RIGHT JOIN
emp t1
ON
t1.`dept_id`=t2.`did`;
概述:子查询的结果可以作为条件,使用运算符(> >= < <= <>)进行判断
代码示例
SELECT
*
FROM
emp
WHERE
emp.`salary`<(SELECT AVG(salary) FROM emp); -- 子查询的条件作为判断结果
-- 子查询结果,单行单列的。显示 平均工资是5860
SELECT AVG(salary) FROM emp;
SELECT
*
FROM
emp
WHERE
emp.`dept_id`=(SELECT dept.`did` FROM dept WHERE dept.`dname`='市场部');
-- 子查询结果,单行单列,显示 2
SELECT dept.`did` FROM dept WHERE dept.`dname`='市场部';
注意:如果根据需要,发现需要使用子查询,一定要看需求中子查询结果是否是单行单列
概述:子查询的结果可以作为条件,使用运算符 in 进行判断
示例代码
SELECT
*
FROM
emp
WHERE
emp.`dept_id` IN(SELECT did FROM dept WHERE dname IN('市场部','财务部'));
-- 子查询结果,多行单列
SELECT did FROM dept WHERE dname IN('市场部','财务部');
概述:子查询可以作为一张虚拟表参与查询(第三张表)
示例代码
SELECT
*
FROM
dept t1,
(SELECT * FROM emp WHERE join_date>'2018-11-11') t2 -- 子查询多行多列
WHERE
t1.did=t2.dept_id;
注意