sql结构化查询语言

mysql, Oracle,db2, sybase

表(table)是一种结构化的文件。

DQL:

数据查询语言(凡是带有select 关键字的都是查询语言)

select…

DML :

数据操作语言(凡是对表当中的数据进行增删改的都是DML)

insert delete update

insert 增

delete 删

update 改

这个主要是操作表中的数据data.

DDL :

数据定义语言

凡是带有create,drop,alter的都是DDL

DDL主要操作的是表的结构,不是表中的数据。

create:新建,等同于增

drop:删除

alter :修改

这个增删改和DML不同,这个主要是对表结构进行操作

TCL: 事务控制语言

包括: 事务提交:commit;

事务回滚: rollback;

DCL:数据控制语言。

例如: 授权grant ,撤销语言 revoke…

having 不能单独使用 必须和group by 一块使用

where 和having ,优先选择where,where完成不了,再使用having

单表的查询

select

from

where

group by

having

order by

limit

以上关键字只能按照这个顺序来

执行顺序?

  1. from
  2. where
  3. group by
  4. having
  5. select
  6. order by
  7. limit
    从某张表中查询数据,先经过where 条件筛选出有价值的数据,
    对这些有价值的数据进行分组,
    分组之后可以使用having 继续筛选。
    select 查询出来
    最后排序输出
distinct (把查询结果去除重复记录)

注意:原表中的数据不会被修改,只是查询结果去重

select distinct ename from emp;

distinct 只能出现在所有字段的最前方

distinct 出现在俩个字段之前,表示俩个字段联合起来去重

连接查询
  1. 连接查询?

emp 表 和dept 表联合起来查询数据,从emp表中取员工名字,从dept表中取部门名字。这种跨表查询,多张表联合起来查询数据,被称为连接查询。

  1. 连接查询的分类?
    根据表连接的方式分类:
    内连接:
    等值连接
    非等值连接
    自连接
    外连接:
    左外连接
    右外连接
    全连接
  2. 当俩张表进行连接查询时,没有任何限制条件会发生什么现象?
    当俩张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是俩张表条数的乘积,这种现象被称为:笛卡尔积现象。
  3. 怎么避免笛卡尔积现象?
    连接时加条件,满足这个条件的记录筛选出来!
    注意:通过笛卡尔积现象得出,表的连接次数越多效率越低,尽量避免表的连接次数。
  4. 内连接之等值连接
    sql92 的缺点: 结构不清晰,表的连接条件,和后期进一步筛选的条件,都放到了where后面。
    sql99优点: 表连接的条件的独立的,连接之后,如还需要进一步筛选,再往后继续添加where。//inner 内连接
    sql99 语法:
    select

    from
    a
    join
    b

on

a 和 b 的连接条件

where

筛选条件

  1. 内连接之非等值连接
    select
    e. ename ,e.sal, s.grade
    from
    emp e
    inner join (inner 可省略)

    salgrade s
    on
    e.sal between s.losal and s.hisal;// 条件不是一个等量关系,称为非等值连接。
  1. 内连接之自连接
    技巧:一张表看成俩张表

select a.ename as’员工号’,b.ename as ’ 领导名’

from emp a

join emp b

on a. mgr = b.empno

  1. 外连接

右外连接right/左外连接 left:

select e.ename ,d.ename

from emp e

//outer 可以省略,带着可读性强

right outer join dept d

on e.deptno = d. deptno;

right 代表什么:表示将join关键字右边的这张表看成主表,主要为了将这张表的数据全部查询出来,捎带着关联查询左边的表。

在外连接当中,俩张表连接,产生了主次关系。

带有right 的是右外连接,又叫右连接。

带有left的是左外连接,又叫左连接。

任何一个右连接都有左连接的写法。

任何一个左连接都有右连接的写法。

外连接的查询结果条数一定是>= 内连接的查询结果的条数

9 . 三张表,四张表怎么连接?

语法:

select …

from a

join b

on a和b的连接条件

join c

on a和c的连接条件

right join

on a和d的连接条件

一条sql中内连接和外连接可以混合,都可以出现!

子查询
  1. 什么是子查询?

select 语句中嵌套select 语句,被嵌套的select语句成为子查询。

  1. 子查询都可以出现在哪里?

select

…(select) …

from

…(select)…

where

…(select)…

  1. where 子句中的子查询
    where子句中不能直接使用分组函数。
    案例:找出比最低工资高的员工的姓名和工资?
    第一步:查询最低工资是多少
    selcet min(sal) from emp;
    第二步:找出大于最低工资的
    select ename,sal from emp where sal > 最低工资;
    第三步:合并
    select ename , sal from emp where sal > (select min(sal) from emp);
  2. from子句中的子查询
    注意: from后面的子查询,可以将子查询的查询结果当做一张临时表。(技巧)
    案例:找出每个工作岗位的平均工资的薪资等级。
    第一步:找出每个岗位的平均工资(按照岗位分组求平均值)
    select job ,avg(sal) from emp group by job;
    第二步: 把以上的查询结果就当做一张真实存在的表t。
    select * from salgrade ;s表
    t表和s表进行表连接,条件:t表 avg(sal) between s.losal and s.hisal;
    select t.*,s.grade
    from (select job ,avg (sal) as avg sal from emp group by job) t
    join salgrade s
    on t.avgsal between s.losal and s.hisal;
  3. select后面的子查询
    案例: 照吃每个员工的部门名称,要求显示员工名,部门名?
    select ename ,(select d.dname from dept d where e.deptno and d.deptno ) as dname from emp e;
union合并查询结果集

案例: 查询工作岗位是MAXNAGER 和SALESMAN 的员工?

select ename ,job from emp where job = ‘MAXNAGER’

union

select ename ,job from emp where job =’ SALESMAN’;

union的效率要高一些。对于表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积,成倍的翻。但是union可以减少匹配的次数。在减少匹配次数的情况下,还可以完成俩个结果集的拼接。

a 连接 b 连接 c

a 10条记录

b 10条记录

c 10条记录

匹配次数是:1000

a连接 b 一个结果: 10*10—>100 次

a 连接c 一个结果: 10*10---->100次

使用union的话是:100次 + 100次 =200 次(union 把乘法变成了加法)

union 在进行结果集合并的时候,要求俩个结果集的列数相同。

union要求结果集合并时列和列的数据类型一致。mysql 可以不一致,oracle 语法严格,不可以,报错。

limit
  1. limit 是将查询结果集的一部分取出来,通常使用在分页查询当中。
  2. limit 怎么用?
    完整用法:limit startIndex ,length
    startIndex是起始下标,length 是长度。
    起始下标从0开始。
    缺省用法:limit 5 ; //这是取前5.
    案列: 按照薪资降序,取出排在前5米名的员工?
    select ename ,sal

from emp

order by sal desc

limit 5; 取前

  1. 注意: mysql中limit 在order by 之后执行!!
  2. 分页
    每页显示三条记录
    第一页:limit 0,3
    第二页:limit 3,3
    第三页:limit 6,3
    第四页:limit 9,3
    每页显示pagesize条记录
    第pageno页:limit (pageno-1)*pagesize , pagesize