Data QueryLanguage 就是select查询语句

数据库

dept(部门)
DEPTNO 部门号
DNAME 部门名
LOC 地址
salgrade
GRADE 薪资等级
LOSAL 最低
HISAL 最高
emp(员工)
EMPNO 员工号
ENAME 员工名
JOB 职位
MGR 领导编号
HIREDATE 出生日期
SAL 薪资
COMM
DEPTNO 部门号


image.pngimage.pngimage.png

概念

连接查询:也可以叫跨表查询,需要关联多个表进行查询
连接查询(DQL) - 图4

笛卡尔积

1)当两张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是两张表条数的乘积,这种现象被称为:笛卡尔积现象。
image.png

  • select ename,dname from emp, dept;//无筛选,笛卡尔积现象

image.pngimage.pngimage.png
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;

image.png

内连接

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;

image.png

3、自连接

所谓自连接,顾名思义就是自我连接的意思。技巧:一张表看成两张表。

eg:查询员工的上级领导,要求显示员工名和对应的领导名?

  • select e.ENAME yg, l.ENAME ld from emp e inner join emp l on e. MGR=l.EMPNO;
  • image.png

    外连接

    右外连接: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

  1. public static void main(String[] args){
  2. // 用户提交过来一个页码,以及每页显示的记录条数
  3. int pageNo = 5; //第5页
  4. int pageSize = 10; //每页显示10条
  5. int startIndex = (pageNo - 1) * pageSize;
  6. String sql = "select ...limit " + startIndex + ", " + pageSize;
  7. }

记公式:
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)