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
…
以上关键字只能按照这个顺序来
执行顺序?
- from
- where
- group by
- having
- select
- order by
- limit
从某张表中查询数据,先经过where 条件筛选出有价值的数据,
对这些有价值的数据进行分组,
分组之后可以使用having 继续筛选。
select 查询出来
最后排序输出
distinct (把查询结果去除重复记录)
注意:原表中的数据不会被修改,只是查询结果去重
select distinct ename from emp;
distinct 只能出现在所有字段的最前方
distinct 出现在俩个字段之前,表示俩个字段联合起来去重
连接查询
- 连接查询?
emp 表 和dept 表联合起来查询数据,从emp表中取员工名字,从dept表中取部门名字。这种跨表查询,多张表联合起来查询数据,被称为连接查询。
- 连接查询的分类?
根据表连接的方式分类:
内连接:
等值连接
非等值连接
自连接
外连接:
左外连接
右外连接
全连接 - 当俩张表进行连接查询时,没有任何限制条件会发生什么现象?
当俩张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是俩张表条数的乘积,这种现象被称为:笛卡尔积现象。 - 怎么避免笛卡尔积现象?
连接时加条件,满足这个条件的记录筛选出来!
注意:通过笛卡尔积现象得出,表的连接次数越多效率越低,尽量避免表的连接次数。 - 内连接之等值连接
sql92 的缺点: 结构不清晰,表的连接条件,和后期进一步筛选的条件,都放到了where后面。
sql99优点: 表连接的条件的独立的,连接之后,如还需要进一步筛选,再往后继续添加where。//inner 内连接
sql99 语法:
select
…
from
a
join
b
on
a 和 b 的连接条件
where
筛选条件
- 内连接之非等值连接
select
e. ename ,e.sal, s.grade
from
emp e
inner join (inner 可省略)
salgrade s
on
e.sal between s.losal and s.hisal;// 条件不是一个等量关系,称为非等值连接。
- 内连接之自连接
技巧:一张表看成俩张表
select a.ename as’员工号’,b.ename as ’ 领导名’
from emp a
join emp b
on a. mgr = b.empno
- 外连接
右外连接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中内连接和外连接可以混合,都可以出现!
子查询
- 什么是子查询?
select 语句中嵌套select 语句,被嵌套的select语句成为子查询。
- 子查询都可以出现在哪里?
select
…(select) …
from
…(select)…
where
…(select)…
- 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); - 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; - 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
- limit 是将查询结果集的一部分取出来,通常使用在分页查询当中。
- limit 怎么用?
完整用法:limit startIndex ,length
startIndex是起始下标,length 是长度。
起始下标从0开始。
缺省用法:limit 5 ; //这是取前5.
案列: 按照薪资降序,取出排在前5米名的员工?
select ename ,sal
from emp
order by sal desc
limit 5; 取前
- 注意: mysql中limit 在order by 之后执行!!
- 分页
每页显示三条记录
第一页:limit 0,3
第二页:limit 3,3
第三页:limit 6,3
第四页:limit 9,3
每页显示pagesize条记录
第pageno页:limit (pageno-1)*pagesize , pagesize