2、SQL语言的分类、查询、函数
sql语言的分类:
1.DQL:数据查询语言:是数据库中使用最频繁的语言主要关键字:select
2.DML:数据操纵语言:主要是用来改变数据库对象中的数据的一种语言,主要关键字:insert update delete
3.DDL:数据定义语言:主要就是针对数据库对象的创建,修改和删除操作:create alter drop truncate
4:TCL:事务控制语言:主要就是正对数据库中的事务操作的语句:commit rollback savepoint
事务特性:原子性,一致性,隔离性,持久性
5:DCL: 数据控制语言:主要是正对权限进行操作:grant revoke
SQL查询:
语法:select [distinct|all] 列名,..
[into 变量]
from 表名|视图名
[where 过滤条件]
[group by 分组字段,...]
[having 分组过滤]
[order by 排序字段 [desc|asc],....]
sql语句的执行顺序:
from-----where-----group by----having-----select----order by
单表查询:
多表关联查询:
1.普通关联:select * from A,B where 关联条件;
2.内连接: select * from A [inner] join B on 关联字段
3.外连接:left [outer] join ...on
right [outer] join ...on
full [outer] join ...on
有两张表A和表B,其中表A有16条数据,表B有9条数据,表A中有15条数据和表B相关联,表B中有4条数据和表A相关
请问:A 内连接B有几条数据? 15 (取关联数据多的表的关联条数)
A 左连接B有几条数据? 16 (内连接结果+左表不相关的条数)
A 右连接B有几条数据? 20 (内连接结果+右表不相关的条数)
A 全连接B有几条数据? 21 (内连接结果+右表不相关的条数+左表不相关的条数)
4.自然连接: natural join
5.自连接:自己连接自己
一般会有一个自引式外键:表中有一个字段的值引用自己表的主键作为外键。
--查询员工表中员工的姓名以及领导的姓名。
SELECT e1.ename 员工,e2.ename 领导 FROM emp e1,emp e2 WHERE e2.empno=e1.mgr;
6.交叉连接: cross join
子查询:
1.单行子查询:子查询的结果返回一行数据
配合运算符:> < >= <= <> =
--查询工资最高的员工的编号,姓名,职位和工资
SELECT max(sal) FROM emp;
SELECT empno,ename,job,sal FROM emp WHERE sal=(SELECT max(sal) FROM emp);
2.多行子查询:子查询的结果返回多行数据
运算符:in any all
in 等同于 =any
not in 等同于 <>all
注意:一般没有=all 或者是<>any的写法。
3.关联子查询:子查询的执行必须要依赖于外查询的条件字段,不能单独执行。
[not] exists:用来判断子查询结果是否在外查询中存在
语法:select * from 表 a where [not] exists(select * from 表B where 关联字段=a.关联字段)
注意:1.如果子查询数据量比较小,推荐使用in
2.如果子查询的数据量比较大,推荐使用exists.
常用的函数:
1.字符串函数:
2.算术类函数:
3.转换函数:
4.时间函数:
sysdate:获取系统当前的时间对象
last_day():获取指定日期对应的月的最后一天
add_months(d,n):在指定的日期上加上或者减去n个月
--十天前
SELECT SYSDATE-10 FROM dual;
--一分钟之后
SELECT SYSDATE+1/24/60 FROM dual;
months_between(d1,d2):
查询两个之间之间相差的月份数,是一个小数
SELECT hiredate 入职日期,round(months_between(SYSDATE,hiredate)/12) FROM emp;
trunc(d,'参数'):(重要)
可以将时间截断到指定的参数的开始位置。
SELECT SYSDATE,TRUNC(SYSDATE)天,TRUNC(SYSDATE,'mm')月,TRUNC(SYSDATE,'q')季度,TRUNC(SYSDATE,'yy')年,trunc(SYSDATE,'day')本周第一天,TRUNC(SYSDATE,'iw')本周星期一,TRUNC(SYSDATE,'ww')上周六 FROM dual;
extract(year|month|day|hour|... from 时间对象|时间戳对象):
截取具体的一个年,或者月或者天。。。。。;
注意:如果要截取年月日,则直接从date类型截取
如果要截取时分秒,则需要从timestamp类型截取。
5.分支类的函数:
1.case ..when
语法一:case 字段 when 值1 then 语句1
when 值2 then 语句2
......
else 语句n
end
执行顺序:如果字段的值等于值1则执行语句1,否则如果等于值2则执行语句2....如果都不相等则执行语句n
注意:该种方式只能进行等值匹配
语法二:case when 条件1 then 语句1
条件2 then 语句2
。。。。
else 语句n
end
执行顺序:如果条件1成立,则执行语句1,否则如果条件2成立,则执行语句2,.....如果都不成立则执行语句n;
2.1 nvl(字段,值):如果字段的值为null则返回值,否则返回字段的值。
SELECT e.*,NVL(comm,100) FROM emp e;
2.2 nvl2(字段,值1,值2):如果字段的值不为空则返回值1,否则返回值2.
--如果原来有奖金则增加100,如果原来没有奖金则设置200.
SELECT e.*,NVL2(comm,comm+100,200) FROM emp e;
3.decode(): 只能做等值匹配
语法一:decode(字段,值1,值2,值3):如果字段的值等于值1则返回值2,否则返回值3.
SELECT e.*,DECODE(comm,NULL,200,comm+100) FROM emp e;
语法二:decode(字段,值1,语句1,值2,语句2,.......,语句n):
如果字段的值等于值1则返回语句1,否则如果等于值2则返回语句2,......如果都不匹配则返回语句n
SELECT e.*,DECODE(job,'CLERK','办事人员','SALESMAN','销售人员','MANAGER','管理人员','无名小卒') FROM emp e;
6.表集合操作:
1.并集操作:union [all]
将两个结果集进行上下合并在一起。
select 语句1
union [all]
select 语句2
union [all]
......
注意:1.合并的结果集必须要具有相同的列数。
2.如果设置了all关键字则不会去重,直接将两个结果集合并到一起,如果不写all会进行去重。
2.交集操作:intersect
返回两个结果集中相同的数据
select 语句1
intersect
select 语句2
intersect
......
注意:1.结果集必须要具有相同的列数。
3.差集操作:minus
返回前面表减去后面表中相同的数据之后的数据。
select 语句1
minus
select 语句2
minus
......
注意:1.结果集必须要具有相同的列数。

浙公网安备 33010602011771号