一、查询多表数据
1.查询单表数据
SELECT 字段列表|*
FROM 表名
[WHERE 条件]
[GROUP BY 字段]
[HAVING 条件]
[ORDER BY 字段 ASC|DESC]
[LIMIT [偏移量,] 记录条数]
2.查询多表数据
方式一:
连接查询
普通多表连接
SELECT 字段…
FROM 表1,表2…
WHERE 连接条件
AND 其它条件
内连接
SELECT 字段...
FROM 表1 INNER JOIN 表2
ON 连接条件
WHERE 其它条件
方式二:
子查询
SELECT 字段
FROM 表1
WHERE 字段1 = ( SELECT 字段1 FROM 表2 WHERE 条件 );
INSERT INTO 表1 (字段1,字段2,字段3)VALUES(值1,值2, ( SELECT 字段1 FROM 表2 WHERE 条件 ))
3.示例: 部门表-员工表
已知员工表和部门表结构如下:
部门表结构:
±----------±------------±-----±----±--------±-----------+
| 字段名 | 数据类型 | Null | Key | Default | 字段说明|
±----------±------------±-----±----±--------±-----------+
| d_no | int(11) | NO | PRI | NULL | 部门编号
| d_name | varchar(50) | NO | | NULL | 部门名称
| d_location| varchar(100)| NO | | NULL | 部门地址
±----------±------------±-----±----±--------±-----------+
员工表结构:
±-------±---------------±-----±----±--------±-----------+
| 字段名 | 数据类型 | Null | Key | Default | 字段说明|
±----------±------------±-----±----±--------±-----------+
| e_no | int(11) | NO | PRI | NULL | 员工编号
| e_name | varchar(50) | NO | | NULL | 员工名称
| e_sex | char(2) | NO | | NULL | 员工性别
| dept_no | int(11) | NO | MUL | NULL | 部门编号
| e_job | varchar(50) | NO | | NULL | 职位
| e_salary | int(11) | NO | | NULL | 薪水
| hire_date | date | NO | | NULL | 入职日期
±----------±------------±-----±----±--------±-----------+
部门记录:
d_no d_name d_location
10 业务部 上海
20 财务部 北京
30 人事部 广州
40 销售部 成都
员工记录
e_no e_name e_sex dept_no e_job e_salary hire_date
1001 李强 1 20 算账 800 2015-9-9
1002 王刚 1 30 招聘 1600 2014-10-9
1003 珊珊 0 30 招聘 1250 2014-11-7
1004 张阳 1 20 算账 2975 2015-4-9
1005 小丽 0 40 销售 2850 2015-2-10
1006 王二 1 10 业务 2450 2015-4-23
1007 小冬 1 40 销售 2750 2015-3-10
CREATE TABLE department(
d_no int AUTO_INCREMENT,
d_name varchar(20),
d_location varchar(20),
PRIMARY key(d_no)
);
INSERT INTO department (d_no,d_name,d_location) VALUES(10,‘业务部’,‘上海’)
INSERT INTO department (d_no,d_name,d_location) VALUES(20,‘财务部’,‘北京’)
INSERT INTO department (d_no,d_name,d_location) VALUES(30,‘人事部’,‘广州’);
INSERT INTO department (d_no,d_name,d_location) VALUES(40,‘销售部’,‘成都’);
mysql> select * from department;
±-----±----------±-----------+
| d_no | d_name | d_location |
±-----±----------±-----------+
| 10 | 业务部 | 上海 |
| 20 | 财务部 | 北京 |
| 30 | 人事部 | 广州 |
| 40 | 销售部 | 成都 |
±-----±----------±-----------+
4 rows in set (0.00 sec)
CREATE TABLE employee(
e_no int(11) COMMENT ‘员工编号’,
e_name varchar(50) NOT NULL COMMENT ‘员工名称’,
e_sex char(2) COMMENT ‘员工性别’,
dept_no int(11) COMMENT ‘部门编号’,
e_job varchar(50) NOT NULL COMMENT ‘职位’,
e_salary int(11) COMMENT ‘薪水’,
hire_date date COMMENT ‘入职日期’,
PRIMARY KEY(e_no),
CONSTRAINT FK
FOREIGN KEY(dept_no
) REFERENCES department
(d_no
)
ON DELETE CASCADE /创建外键约束/
);
INSERT INTO employee (e_no,e_name,e_sex,dept_no,e_job,e_salary,hire_date)
VALUES(1001,‘李强’,1,20,‘算账’,800,‘2015-9-9’);
INSERT INTO employee (e_no,e_name,e_sex,dept_no,e_job,e_salary,hire_date)
VALUES(1002,‘王刚’,1,30,‘招聘’,1600,‘2014-10-9’);
INSERT INTO employee (e_no,e_name,e_sex,dept_no,e_job,e_salary,hire_date)
VALUES(1003,‘珊珊’,0,20,‘招聘’,1250,‘2014-11-7’);
INSERT INTO employee (e_no,e_name,e_sex,dept_no,e_job,e_salary,hire_date)
VALUES(1004,‘张阳’,1,20,‘算账’,2975,‘2015-4-9’);
INSERT INTO employee (e_no,e_name,e_sex,dept_no,e_job,e_salary,hire_date)
VALUES(1005,‘小丽’,0,40,‘销售’,2850,‘2015-2-10’);
INSERT INTO employee (e_no,e_name,e_sex,dept_no,e_job,e_salary,hire_date)
VALUES(1006,‘王二’,1,10,‘业务’,2450,‘2015-4-23’);
INSERT INTO employee (e_no,e_name,e_sex,dept_no,e_job,e_salary,hire_date)
VALUES(1007,‘小冬’,1,40,‘销售’,2750,‘2015-3-10’);
mysql> select * from employee;
±-----±-------±------±--------±-------±---------±-----------+
| e_no | e_name | e_sex | dept_no | e_job | e_salary | hire_date |
±-----±-------±------±--------±-------±---------±-----------+
| 1001 | 李强 | 1 | 20 | 算账 | 800 | 2015-09-09 |
| 1002 | 王刚 | 1 | 30 | 招聘 | 1600 | 2014-10-09 |
| 1003 | 珊珊 | 0 | 20 | 招聘 | 1250 | 2014-11-07 |
| 1004 | 张阳 | 1 | 20 | 算账 | 2975 | 2015-04-09 |
| 1005 | 小丽 | 0 | 40 | 销售 | 2850 | 2015-02-10 |
| 1006 | 王二 | 1 | 10 | 业务 | 2450 | 2015-04-23 |
| 1007 | 小冬 | 1 | 40 | 销售 | 2750 | 2015-03-10 |
±-----±-------±------±--------±-------±---------±-----------+
7 rows in set (0.00 sec)
1.在employee表中,查询dept_no等于10和20的所有记录?
SELECT e_no,e_name,e_sex,dept_no,e_job,e_salary,hire_date
FROM employee
WHERE dept_no between 10 and 20;
mysql> SELECT * FROM employee WHERE dept_no between 10 and 20;
±-----±-------±------±--------±-------±---------±-----------+
| e_no | e_name | e_sex | dept_no | e_job | e_salary | hire_date |
±-----±-------±------±--------±-------±---------±-----------+
| 1001 | 李强 | 1 | 20 | 算账 | 800 | 2015-09-09 |
| 1003 | 珊珊 | 0 | 20 | 招聘 | 1250 | 2014-11-07 |
| 1004 | 张阳 | 1 | 20 | 算账 | 2975 | 2015-04-09 |
| 1006 | 王二 | 1 | 10 | 业务 | 2450 | 2015-04-23 |
±-----±-------±------±--------±-------±---------±-----------+
4 rows in set (0.11 sec)
2.在employee表中,查询工资范围在800-2500的员工信息?
SELECT e_no,e_name,e_sex,dept_no,e_job,e_salary,hire_date
FROM employee
WHERE e_salary between 800 and 2500;
±-----±-------±------±--------±-------±---------±-----------+
| e_no | e_name | e_sex | dept_no | e_job | e_salary | hire_date |
±-----±-------±------±--------±-------±---------±-----------+
| 1001 | 李强 | 1 | 20 | 算账 | 800 | 2015-09-09 |
| 1002 | 王刚 | 1 | 30 | 招聘 | 1600 | 2014-10-09 |
| 1003 | 珊珊 | 0 | 20 | 招聘 | 1250 | 2014-11-07 |
| 1006 | 王二 | 1 | 10 | 业务 | 2450 | 2015-04-23 |
±-----±-------±------±--------±-------±---------±-----------+
4 rows in set (0.00 sec)
3.在employee表中,查询部门编号为20的部门中的员工信息?
SELECT e_no,e_name,e_sex,dept_no,e_job,e_salary,hire_date
FROM employee
WHERE dept_no = 20;
±-----±-------±------±--------±-------±---------±-----------+
| e_no | e_name | e_sex | dept_no | e_job | e_salary | hire_date |
±-----±-------±------±--------±-------±---------±-----------+
| 1001 | 李强 | 1 | 20 | 算账 | 800 | 2015-09-09 |
| 1003 | 珊珊 | 0 | 20 | 招聘 | 1250 | 2014-11-07 |
| 1004 | 张阳 | 1 | 20 | 算账 | 2975 | 2015-04-09 |
±-----±-------±------±--------±-------±---------±-----------+
3 rows in set (0.03 sec)
4.在employee表中,查询每个部门最高工资的员工信息?
/SELECT MAX(e_salary) AS 工资
FROM employee
GROUP BY dept_no;/
SELECT e_no,e_name,e_sex,dept_no,e_job,e_salary,hire_date
FROM employee
WHERE e_salary IN(SELECT MAX(e_salary) AS 工资
FROM employee
GROUP BY dept_no);
±-----±-------±------±--------±-------±---------±-----------+
| e_no | e_name | e_sex | dept_no | e_job | e_salary | hire_date |
±-----±-------±------±--------±-------±---------±-----------+
| 1002 | 王刚 | 1 | 30 | 招聘 | 1600 | 2014-10-09 |
| 1004 | 张阳 | 1 | 20 | 算账 | 2975 | 2015-04-09 |
| 1005 | 小丽 | 0 | 40 | 销售 | 2850 | 2015-02-10 |
| 1006 | 王二 | 1 | 10 | 业务 | 2450 | 2015-04-23 |
±-----±-------±------±--------±-------±---------±-----------+
4 rows in set (0.12 sec)
5.查询员工李强所在部门和部门所在地?
分析: 查询结果: d_name d_location
条件: e_name = ‘李强’
内连接
SELECT d_name ,d_location,e_name
FROM employee INNER JOIN department
ON dept_no = d_no
WHERE e_name = ‘李强’
普通多表连接
SELECT d_name ,d_location,e_name
FROM employee,department
WHERE dept_no = d_no AND e_name = '李强'
子查询
SELECT d_name,d_location
FROM department
WHERE d_no = ( SELECT dept_no FROM employee WHERE e_name = '李强' );
/*三个方法*/
±----------±-----------±-------+
| d_name | d_location | e_name |
±----------±-----------±-------+
| 财务部 | 北京 | 李强 |
±----------±-----------±-------+
1 row in set (0.00 sec)
6.使用连接查询,查询所有员工的部门和部门信息?
SELECT e_no,e_name,e_job, e_salary , hire_date, d_name ,d_location
FROM employee INNER JOIN department
ON dept_no = d_no;
±-----±-------±-------±---------±-----------±----------±-----------+
| e_no | e_name | e_job | e_salary | hire_date | d_name | d_location |
±-----±-------±-------±---------±-----------±----------±-----------+
| 1001 | 李强 | 算账 | 800 | 2015-09-09 | 财务部 | 北京 |
| 1002 | 王刚 | 招聘 | 1600 | 2014-10-09 | 人事部 | 广州 |
| 1003 | 珊珊 | 招聘 | 1250 | 2014-11-07 | 财务部 | 北京 |
| 1004 | 张阳 | 算账 | 2975 | 2015-04-09 | 财务部 | 北京 |
| 1005 | 小丽 | 销售 | 2850 | 2015-02-10 | 销售部 | 成都 |
| 1006 | 王二 | 业务 | 2450 | 2015-04-23 | 业务部 | 上海 |
| 1007 | 小冬 | 销售 | 2750 | 2015-03-10 | 销售部 | 成都 |
±-----±-------±-------±---------±-----------±----------±-----------+
7 rows in set (0.01 sec)
7.在employee表中,计算每个部门各有多少员工?
SELECT COUNT(*) AS 个数 ,dept_no
FROM employee
GROUP BY dept_no;
±-------±--------+
| 个数 | dept_no |
±-------±--------+
| 1 | 10 |
| 3 | 20 |
| 1 | 30 |
| 2 | 40 |
±-------±--------+
4 rows in set (0.01 sec)
SELECT COUNT(*) AS 个数 ,dept_no,d_name
FROM employee,department
WHERE d_no = dept_no
GROUP BY dept_no;
±-------±--------±----------+
| 个数 | dept_no | d_name |
±-------±--------±----------+
| 1 | 10 | 业务部 |
| 3 | 20 | 财务部 |
| 1 | 30 | 人事部 |
| 2 | 40 | 销售部 |
±-------±--------±----------+
4 rows in set (0.02 sec)
8.在employee表中,计算不同工种职工的总工资数?
select sum(e_salary) AS 总工资, e_job
from employee
group by e_job;
±----------±-------+
| 总工资 | e_job |
±----------±-------+
| 2450 | 业务 |
| 2850 | 招聘 |
| 3775 | 算账 |
| 5600 | 销售 |
±----------±-------+
4 rows in set (0.00 sec)
9.在employee表中,计算不同部门的平均工资?
SELECT ROUND(AVG(e_salary),0) AS 平均工资, dept_no
FROM employee
GROUP BY dept_no
SELECT ROUND(AVG(e_salary),0) AS 平均工资, d_name
FROM employee,department
WHERE d_no = dept_no
GROUP BY dept_no
±-------------±----------+
| 平均工资 | d_name |
±-------------±----------+
| 2450 | 产品部 |
| 1888 | 财务部 |
| 1425 | 人事部 |
| 2800 | 销售部 |
±-------------±----------+
10.在employee表中,查询工资低于1500的员工信息
SELECT *
FROM employee
WHERE e_salary < 1500;
±-----±-------±------±--------±-------±---------±-----------+
| e_no | e_name | e_sex | dept_no | e_job | e_salary | hire_date |
±-----±-------±------±--------±-------±---------±-----------+
| 1001 | 李强 | 1 | 20 | 算账 | 800 | 2015-09-09 |
| 1003 | 珊珊 | 0 | 20 | 招聘 | 1250 | 2014-11-07 |
±-----±-------±------±--------±-------±---------±-----------+
2 rows in set (0.04 sec)
11.在employee表中,将查询记录先按部门编号由高到低排序,再按员工工资由高到低排序?
SELECT *
FROM employee
ORDER BY dept_no DESC , e_salary DESC;
±-----±-------±------±--------±-------------±---------±----------+
| e_no | e_name | e_sex | dept_no | e_job | e_salary | hire_date |
±-----±-------±------±--------±-------------±---------±----------+
| 1005 | 小丽 | 女 | 40 | 销售经理 | 2850 | 2015-2-10 |
| 1007 | 小冬 | 男 | 40 | 销售经理 | 2750 | 2015-3-10 |
| 1002 | 王刚 | 男 | 30 | HR | 1600 | 2014-10-9 |
| 1003 | 珊珊 | 女 | 30 | HR | 1250 | 2014-11-7 |
| 1004 | 张阳 | 男 | 20 | 出纳 | 2975 | 2015-4-9 |
| 1001 | 李强 | 男 | 20 | 会计 | 800 | 2015-9-9 |
| 1006 | 王二 | 男 | 10 | 产品策划 | 2450 | 2015-4-23 |
±-----±-------±------±--------±-------------±---------±----------+
12.使用limit,查询第二条记录开始到第五条记录结束的所有记录
SELECT *
FROM employee
LIMIT 1,4;
±-----±-------±------±--------±-------------±---------±----------+
| e_no | e_name | e_sex | dept_no | e_job | e_salary | hire_date |
±-----±-------±------±--------±-------------±---------±----------+
| 1002 | 王刚 | 男 | 30 | HR | 1600 | 2014-10-9 |
| 1003 | 珊珊 | 女 | 30 | HR | 1250 | 2014-11-7 |
| 1004 | 张阳 | 男 | 20 | 出纳 | 2975 | 2015-4-9 |
| 1005 | 小丽 | 女 | 40 | 销售经理 | 2850 | 2015-2-10 |
±-----±-------±------±--------±-------------±---------±----------+
-------------------成绩表--------
mysql> SELECT * FROM student;
±-------±----------±-----±------+
| number | name | age | score |
±-------±----------±-----±------+
| 1 | 小明 | 20 | 96 |
| 2 | 张三 | 26 | 86 |
| 3 | 王二 | 25 | 76 |
| 5 | 李四 | 20 | 98 |
| 6 | 王小二 | 25 | 88 |
±-------±----------±-----±------+
1.查询高于平均成绩的学生?
SELECT avg(score) FROM student;
SELECT number,name,age,score
FROM student
WHERE score > ( SELECT avg(score) FROM student )
±-------±-------±-----±------+
| number | name | age | score |
±-------±-------±-----±------+
| 1 | 小明 | 20 | 96 |
| 5 | 李四 | 20 | 98 |
±-------±-------±-----±------+
2.添加学生,添加学生成绩与平均成绩相等?
INSERT INTO student
(number
,name
,age
,score
)VALUES(8,‘小丽’,24 ,(SELECT ROUND(avg(score
),0) FROM student
as s ));