目录
1、 多表查询 (where子句多表查询,join子句多表查询)
3、子查询(ANY子查询、IN子查询、SOME子查询、ALL子查询)
一、mysql的基本組成
二、基本sql语句
#创建数据库exam2
CREATE DATABASE exam2;
#删除数据库exam2
DROP DATABASE exam2;
CREATE DATABASE exam2;
#切换到数据库exam2
USE exam2;
#创建表stu id自增,主键, 表的编码格式是utf8
CREATE TABLE stu(
id INT(1) AUTO_INCREMENT,
PRIMARY KEY (id) #主键是id
) CHARSET utf8;
DROP TABLE stu;
CREATE TABLE USER(
uid INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(32),
PASSWORD VARCHAR(32),
sex ENUM('男','女') DEFAULT '女', #枚举类型 性别默认是女
address VARCHAR(32),
hobby VARCHAR(32)
);
#例 sex是1代表男生 2代表女生(1和2表示枚举里面的第一位还是第二位)
INSERT INTO USER (username,PASSWORD,sex,address,hobby) VALUES ('whd','123',2,'河北','打篮球');
INSERT INTO USER (username,PASSWORD,sex,address,hobby) VALUES ('wangwu','8908',1,'南京','打乒乓求');
# 查询地址不在“北京”的用户信息 不等于的两种方式
SELECT * FROM USER WHERE address != '北京'
SELECT * FROM `user` WHERE address <> '北京'
添加约束
#将user表的did设置成外键 让他与dept表的did对应起来,让两张表之间有关系
ALTER TABLE USER ADD FOREIGN KEY(did) REFERENCES dept(did);
#添加完约束之后存在的问题:
# 1. 如果添加约束 外键添加的值在关联表中不存在报错,有约束问题。
# 2. 如果删除dept表的记录那么emp表中外键是不是也要被删除,这个时候需要使用级联删除。
limit操作
#每页显示5天记录
select * from user limit 0,5;
#下一页 (页数-1)*每页个数,每页个数
select * from user limit 5,5
首页
select * from user limit 0,5;
尾页
查询总记录数 再除以每页条数
SELECT DISTINCT username FROM USER;
三、多表查詢
#提高演示的sql语句
USE exam2;
#部门表
CREATE TABLE dept (
did INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(100)
)
CHARSET utf8;
#员工表
CREATE TABLE emp (
did INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(100),
did INT
)
CHARSET utf8;
多表查詢分類
1、 多表查询 (where子句多表查询,join子句多表查询)
2、连接查询
#内连接的两种方法
SELECT * FROM `emp`,`dept` WHERE emp.`did`=dept.`did`
SELECT * FROM `emp` INNER JOIN `dept` ON emp.`did`=dept.`did`
#mysql 4.0 之前可以使用 full join on的格式进行完全连接
SELECT * FROM emp FULL JOIN dept ON emp.`did`=dept.`did`
#mysql 4.0 之后再进行完全连接的时候就需要 union all 或者是 union
#union all 展示两张表的所有信息
SELECT * FROM `emp` LEFT JOIN dept ON emp.`did`=dept.`did`
UNION ALL
SELECT * FROM `emp` RIGHT JOIN dept ON emp.`did`=dept.`did`;
#union 查询出两张表之间不同的信息(如果有重复的信息,就只会显示一次)
SELECT * FROM `emp` LEFT JOIN dept ON emp.`did`=dept.`did`
UNION
SELECT * FROM `emp` RIGHT JOIN dept ON emp.`did`=dept.`did`;
union 只显示不同的地方
union all 展示全部信息
3、子查询(ANY子查询、IN子查询、SOME子查询、ALL子查询)
定义:子查询允许把一个查询嵌套在另一个查询当中。
子查询又叫做内部查询,相当于内部查询,包含内部查询的就称为外部查询。子查询的结果被主查询所使用。
注意的问题:
1. 括号
2. 可以在主查询的where select having from 后面,都可以使用子查询
3. 不可以再group by/order by 后面使用子查询
4. 主查询和子查询可以不是同一张表;只有子查询返回的值,主查询可以使用即可。
例:查询部门名称是人力的员工信息
第一种方式:利用子查询 select * from emp where deptno=(select deptno from dept where dname='人力');
第二种方式:利用关联查询 select * from emp e,dept d where e.deptno=d.deptno and d.dname='人力'; SQL优化:尽量使用多表查询 绝大部分的子查询在最终执行的时候它都是转换成一个多表查询来执行的。 通过SQL执行计划可以看出来。 通过SQL执行计划会发现这两种方式执行的是一样的。
5. from后面的子查询 子查询需要设置别名,不然会报错
例:查询员工号 姓名 月薪 select * from (select empno,ename,sal from emp) emp2;
查询员工号 姓名 月薪 年薪 select * from (select empno,ename,sal,sal*12 from emp) emp2;
6. 一般不在子查询中排序;
7. 一般先执行子查询,再执行主查询。
3.1、ANY关键字 (or)
假设any内部的查询语句返回的结果个数是三个,如:result1,result2,result3,那么,
select ...from ... where a > any(...);
-->
select ...from ... where a > result1 or a > result2 or a > result3;
需求:
查询工资比1号部门任意一个员工高的信息
select * from emp where sal > any (select sal from emp where deptno=1);
select * from emp where sal > (select min(sal) from emp where deptno=1); 和上一句的效果一样
3.2、ALL关键字 (and)
ALL关键字与any关键字类似,只不过上面的or改成and。即:
select ...from ... where a > all(...);
select ...from ... where a > result1 and a > result2 and a > result3;
需求:
查询工资比1号部门所有员工高的员工信息
select * from emp where sal > all (select sal from emp where deptno=1);
select * from emp where sal > (select max(sal) from emp where deptno=1); 和上一句的效果一样
3.3、SOME关键字 和any关键字是一样的功能 (or)
some关键字和any关键字是一样的功能。所以:
select ...from ... where a > some(...);
select ...from ... where a > result1 or a > result2 or a > result3;
3.4、IN关键字
IN运算符用于WHERE表达式中,以列表项的形式支持多个选择,语法如下:
WHERE column IN (value1,value2,...)
WHERE column NOT IN (value1,value2,...)
当 IN 前面加上 NOT运算符时,表示与 IN 相反的意思,即不在这些列表项内选择。
案例:
查询部门名称是人力和开发的员工
select * from emp where deptno in (select deptno from dept d where d.dname='人力' or d.dname='开发' );
查询不是老板的员工
select * from emp where mgr is not null
Mysql的基本函数
max():求最大值
查询emp中薪水最高的人? select max(sal) from emp
min():求最小值
查询emp中薪水是多少? select min(sal) from emp
avg():求平均数
查询每个部门的平均薪资 select AVG(sal) from emp group by deptno
sum():求和
查询emp中员工的总工资 select sum(sal) from emp; count():求总记录数 查询员工数量 select count(*) from emp;