Data QueryLanguage 就是select查询语句
数据库
dept(部门) | |
---|---|
DEPTNO | 部门号 |
DNAME | 部门名 |
LOC | 地址 |
salgrade | |
---|---|
GRADE | 薪资等级 |
LOSAL | 最低 |
HISAL | 最高 |
emp(员工) | |
---|---|
EMPNO | 员工号 |
ENAME | 员工名 |
JOB | 职位 |
MGR | 领导编号 |
HIREDATE | 出生日期 |
SAL | 薪资 |
COMM | |
DEPTNO | 部门号 |
概念
笛卡尔积
1)当两张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是两张表条数的乘积,这种现象被称为:笛卡尔积现象。
- select ename,dname from emp, dept;//无筛选,笛卡尔积现象
2)怎么避免笛卡尔积现象?
连接时加条件,满足这个条件的记录被筛选出来!
- select emp.ename, dept.dname from emp, dept where emp.deptno=dept.deptno;
也可以使用别名
- select e.ename, d.dname from emp e, dept d where e.deptno=d.deptno;
内连接
SQL99语法:select …from 表a inner join 表b on a和b的连接条件 where 筛选条件 //inner可以省略
1、等值连接
所谓等值连接就是’=’,
eg:查询每个员工所在部门名称,显示员工名和部门名?
- select e.ENAME,d.DNAME from dept d inner join emp e on e. DEPTNO ==d.DEPTNO ;(等于号是一个)
- select e.ENAME,d.DNAME from dept d inner join emp e on e. DEPTNO =d.DEPTNO ;
2、非等值连接
条件不是一个等量关系,称为非等值连接。
eg:找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级?
- select e.ENAME , e.SAL , s.GRADE from emp e inner join salgrade s on e.SAL between s.LOSAL and s.HISAL;
3、自连接
所谓自连接,顾名思义就是自我连接的意思。技巧:一张表看成两张表。
eg:查询员工的上级领导,要求显示员工名和对应的领导名?
- select e.ENAME yg, l.ENAME ld from emp e inner join emp l on e. MGR=l.EMPNO;
-
外连接
右外连接:select …from 表a right outer join 表b on a和b的连接条件 where 筛选条件 //outer可以省略
左外连接:select …from 表a left outer join 表b on a和b的连接条件 where 筛选条件 //outer可以省略
right代表什么:
表示将join关键字右边的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边的表。在外连接当中,两张表连接,产生了主次关系。
同理,left的主表是左表
多表查询
select …from a join b on a和b的连接条件 join c on a和c的连接条件 right join d on a和d的连接条件
子查询
select语句中嵌套select语句,被嵌套的select语句称为子查询。
其他
union
- select * from emp where job in(‘MANAGER’, ‘SALESMAN’);
select from emp where job=’MANAGER’ union select from emp where job=’SALESMAN’
limit 的使用
mySql 提供了 limit,主要用于提取前几条或者中间某几行数据
select * from table limit m,n
其中 m 是指记录开始的 index,从 0 开始,表示第一条记录
n 是指从第 m+1 条开始,取 n 条。
- select * from table limit m
取得前 m 条数据
- select * from tablename limit 2,4
即取出第 3 条至第 6 条,4 条记录
limit作用:将查询结果集的一部分取出来。通常使用在分页查询当中。百度默认:一页显示10条记录。分页的作用是为了提高用户的体验,因为一次全部都查出来,用户体验差。可以一页一页翻页看。
注意:mysql当中limit在order by之后执行!!!!!!
分页
每页显示3条记录
第1页:limit 0,3 [0 1 2]
第2页:limit 3,3 [3 4 5]
第3页:limit 6,3 [6 7 8]
第4页:limit 9,3 [9 10 11]
每页显示pageSize条记录
第pageNo页:limit (pageNo - 1) * pageSize , pageSize
public static void main(String[] args){
// 用户提交过来一个页码,以及每页显示的记录条数
int pageNo = 5; //第5页
int pageSize = 10; //每页显示10条
int startIndex = (pageNo - 1) * pageSize;
String sql = "select ...limit " + startIndex + ", " + pageSize;
}
记公式:
limit (pageNo-1)*pageSize , pageSize
DQL语句的大总结
select …from…where…group by…having…order by…limit…
1)内连接
SQL99语法:select …from 表a inner join 表b on a和b的连接条件 where 筛选条件 //inner可以省略
2)外连接
右外连接:select …from 表a right outer join 表b on a和b的连接条件 where 筛选条件 //outer可以省略
左外连接:select …from 表a left outer join 表b on a和b的连接条件 where 筛选条件 //outer可以省略
3)多表查询
select …from a join b on a和b的连接条件 join c on a和c的连接条件 right join d on a和d的连接条件
4)子查询:select嵌套
5)