-- 函数的学习
-- 函数的用途
-- 函数的参数的个数 以及参数的数据类型 to_date( , )
-- 函数的返回值类型
-- 内关联 根据关联字段取交集
select E.*,D.*
from emp e join dept d on e.deptno = d.deptno
where d.loc = 'NEW YORK' ;
-- 去重 distinct
select distinct deptno from emp ;
select deptno from dept ;
-- 外关联
-- 左外关联
select 字段 from 表1 -- 主表 驱动表
left [ outer ] join 表2 --从表
on 关联条件
and 过滤条件 ;
-- 找出 部门在 new york 的员工信息
select
e.empno,
e.ename,
e.job,
e.mgr,
e.hiredate,
e.sal,
e.comm,
e.deptno,
d.dname,
d.loc
from emp e -- 主表
left outer join dept d -- 从表
on e.deptno = d.deptno ;
-- 主从 换位置
select
d.deptno,
d.dname,
d.loc,
e.deptno ,
e.empno,
e.ename,
e.job,
e.mgr,
e.hiredate,
e.sal,
e.comm
from dept d -- 主表
left outer join emp e -- 从表
on e.deptno = d.deptno ;
-- 左外关联 加过滤条件
select
d.deptno,
d.dname,
d.loc,
e.empno,
e.ename,
e.job,
e.mgr,
e.hiredate,
e.sal,
e.comm
from dept d -- 主表
left outer join emp e -- 从表
on e.deptno = d.deptno and d.loc = 'NEW YORK' ;
-- 左外关联在where 过滤
select
d.deptno,
d.dname,
d.loc,
e.empno,
e.ename,
e.job,
e.mgr,
e.hiredate,
e.sal,
e.comm
from dept d -- 主表
left outer join emp e -- 从表
on e.deptno = d.deptno
where d.loc = 'NEW YORK' ;
on 和 where 中的过滤 有什么区别 ?
1. 在内关联中 on 和 where 是等效的
2. 在外关联中 on 只过滤 从表的数据 ,不过滤主表的数据
3. 在where 中 是对 两个表关联之后的结果 进行过滤 ,
所以过滤条件既会影响从表也会影响主表
-- 右外关联
select 字段 from 表1 -- 从表
right [ outer ] join 表2 -- 主表 驱动表
on 关联条件
and 过滤条件 ;
select
d.deptno,
d.dname,
d.loc,
e.empno,
e.ename,
e.job,
e.mgr,
e.hiredate,
e.sal,
e.comm
from emp e right outer join dept d -- 主表
on e.deptno = d.deptno ;
-- 全外关联
-- 建表语句
create table 表名
as
查询语句 ;
-- 案例:
create table emp_test
as
select * from emp ;
-- 查询结果
select * from emp_test ;
-- 添加数据
insert into 表名 values ( 值1 ,值2 ...) ;
commit ;
注意 : 1. 值的个数要和原表保持一致
2. 值得数据类型要保持一致
insert into emp_test
values( 1234 ,'扫地僧','扫地',7788, to_date('2000-01-01','YYYY-MM-DD'),5000,NULL ,50 ) ;
COMMIT ;
SELECT * FROM EMP_TEST ;
-- 删 表
drop table EMP_TEST ;
-- 删某条 数据
delete emp_test where empno = 1234 ;
--全外关联
select 字段 from 表1
full join 表2
on 关联条件
and 过滤条件 ;
--案例
select * from emp_test e
full join dept d
on e.deptno = d.deptno ;
--
select nvl(d.deptno ,e.deptno ) 部门编号, e.ename ,d.loc from emp_test e
full join dept d
on e.deptno = d.deptno ;
-- 不等值 关联
select * from salgrade ;
-- 算出每个人的工资等级
select e.ename,e.sal ,sl.grade ,sl.losal, sl.hisal
from emp e
join salgrade sl
on e.sal >= sl.losal
and e.sal <= sl.hisal ;
-- 用 between改写
select e.ename,e.sal ,sl.grade ,sl.losal, sl.hisal
from emp e
join salgrade sl
on e.sal between sl.losal and sl.hisal ;
-- 练习1 查询 各部门的部门名称 ,以及对应的 经理姓名
-- 部门名称 部门编号 部门经理姓名
select * from emp ;
select D.DNAME ,D.DEPTNO ,E.ENAME
from dept d
left join emp e
on d.deptno = e.deptno
AND e.job = 'MANAGER' ;
-- 聚合函数
-- 同时对多行进行操作, 并返回一个结果
-- max() 求最大值
-- min() 求最小值
-- sum() 求和
-- avg() 平均值
-- count() 返回查询结果的行数
-- 案例
select
max(e.sal) 最高工资 ,
min(e.sal) 最低工资 ,
sum(e.sal) 工资总和 ,
round(avg(e.sal ) ,2) 平均工资 , -- round 四舍五入
count(e.empno) 公司总人数
from emp e ;
-- 聚合函数 会跳过 空值
select
max(e.comm) 最高奖金 ,
min(e.comm) 最低奖金 ,
sum(e.comm) 工资总和 ,
round(avg(e.comm ) ,2) 平均工资 , -- round 四舍五入
count(e.comm) 公司总人数
from emp e ;
-- 错误演示
select
deptno ,
max(e.comm) 最高奖金 ,
min(e.comm) 最低奖金 ,
sum(e.comm) 工资总和 ,
round(avg(e.comm ) ,2) 平均工资 , -- round 四舍五入
count(e.comm) 公司总人数
from emp e ;
-- 分组 GROUP BY
-- 算出 不是 10部门 各部门的 最高工资 .....
select
deptno 部门编号 ,
max(e.sal) 最高工资 ,
min(e.sal) 最低工资 ,
sum(e.sal) 工资总和 ,
round(avg(e.sal ) ,2) 平均工资 , -- round 四舍五入
count(e.empno) 部门总人数
from emp e
where e.deptno <> 10
group by e.deptno ;
-- 小练习 算出 各岗位 人数 ,最高工资 , 平均工资
select
e.job 岗位名称,
count(e.empno) 人数,
max(e.sal) 最高工资,
round( avg(e.sal ) ,2) 平均工资
from emp e
group by e.job ;
-- 各年份 各部门 入职的人数
select
to_char( e.hiredate ,'YYYY' ) 入职年份,
deptno 部门 ,
count(e.empno) 人数
from emp e
group by to_char( e.hiredate ,'YYYY' ) , deptno ;
总结 :
1. 聚合函数可以单独使用 ; -- select count(empno) from emp ;
2. 聚合函数还可以分组的字段结合起来使用
select deptno ,count(empno) from emp group by deptno ;
3. select 后面 只能 分组字段 和 其他聚合函数
错误案例 select deptno , job ,count(empno) from emp group by deptno ;
-- having 对聚合结果进行筛选
-- 求 部门人人数 大于4 部门部门
select
deptno ,
count(empno)
from emp e
-- WHERE JOB = 'MANAGER'
group by deptno
having count(empno) > 4 ;
-- 求出 各平均工资 大于 2500 的岗位 , 并列出岗位人数
select
e.job ,
count(e.empno ) --
from emp e
group by e.job
having avg(e.sal) > 2500 ;
-- 找出 部门 20 按照岗位进行分组 , 岗位人数大于一 ,并且最低薪资大于1000 , 的部门
按照 岗位人数进行排序
-- 列出 岗位名称 , 岗位最低工资 ,岗位最高工资 ,岗位人数
select
e.job 岗位名称 ,
min(e.sal) 最低工资 ,
max(e.sal) 最高工资 ,
count(e.empno) 岗位人数
from emp e
where
e.deptno = 20
group by e.job
having count(e.empno) >1 and min(e.sal) > 1000
order by 岗位人数 ;
-- 整个sql 的执行顺序
FROM -- 第一步 加载表
WHERE -- 第二步 筛选表中的数据
GROUP BY -- 第三步 分组
HAVING -- 第四步 对分组后的结果进行过滤
SELECT -- 第五步 列出需要展示的字段
ORDER BY -- 第六步 对查询结果进行排序
-- 数学函数
-- 求绝对值 ABS(X)
SELECT ABS( -19) FROM DUAL ;
-- 取余 MOD(X,Y) X除以y的余数
SELECT MOD( 8, 3) FROM DUAL ;
-- 幂运算 POWER( X ,Y) X 的 y 次方
SELECT POWER( 2, 3 ) FROM DUAL ;
-- 截取 TRUNC( X ,Y) 对x 截取 y 位
SELECT TRUNC( 3.1415 , 3 ) FROM DUAL ;
-- 正负代表方向 , y 代表位数
SELECT TRUNC( 314.15 , -2 ) FROM DUAL ;
-- 向上取整 CEIL( X)
SELECT CEIL( 3.14) FROM DUAL ;
-- 向下取整 FLOOR( X)
SELECT FLOOR( 3.14) FROM DUAL ;
-- 将 数字 634.47 处理成630
SELECT TRUNC(634.47, -1) FROM DUAL ;
-- 将 数字 634.47 处理成 634.4
SELECT TRUNC(634.47, 1) FROM DUAL ;
-- 日期函数
-- 截取日期 TRUNC 年份 当年的 1号
SELECT TRUNC( SYSDATE , 'YYYY' ) FROM DUAL ;
-- 截取 月份 得到当月的一号
SELECT TRUNC( SYSDATE , 'MM' ) FROM DUAL ;
-- 截取 日 得到当天的 0时
SELECT TRUNC( SYSDATE , 'DD' ) FROM DUAL ;
-- 截取 季度 得到当季度的 1号
SELECT TRUNC( SYSDATE , 'Q' ) FROM DUAL ;
-- 截取 周 得到当 周的 1号
SELECT TRUNC( SYSDATE , 'D' ) FROM DUAL ;
-- 小练习 用 TRUNC 算出每年 入职员工数
select TRUNC( E.HIREDATE , 'YYYY' ) ,COUNT(E.EMPNO) 人数 FROM EMP E
GROUP BY TRUNC( E.HIREDATE , 'YYYY' ) ;
-- 小练习 用 TRUNC 算出 1981年 每个季度的 入职员工数
select TRUNC( E.HIREDATE , 'Q' ) ,COUNT(E.EMPNO) 人数 FROM EMP E
WHERE TO_CHAR(E.HIREDATE , 'YYYY' ) = '1981'
GROUP BY TRUNC( E.HIREDATE , 'Q' ) ;
-- 对年份 四舍五入 ROUND 极限值 7月
SELECT ROUND(SYSDATE ,'YYYY' ) FROM DUAL ;
SELECT ROUND( TO_DATE('20220630','YYYYMMDD' ) ,'YYYY' ) FROM DUAL ;
SELECT ROUND( TO_DATE('20220701','YYYYMMDD' ) ,'YYYY' ) FROM DUAL ;
-- 对月份 四舍五入 极限值 16号
SELECT ROUND(SYSDATE ,'MM' ) FROM DUAL ;
SELECT ROUND( TO_DATE('20220216','YYYYMMDD' ) ,'MM' ) FROM DUAL ;
-- 对天 四舍五入 极限值 中午 12点
SELECT ROUND(SYSDATE ,'DD' ) FROM DUAL ;
SELECT ROUND( TO_DATE('20220216 11:59:59','YYYYMMDD HH:MI:SS' ) ,'DD' ) FROM DUAL ;
SELECT ROUND( TO_DATE('20220216 13:59:59','YYYYMMDD HH24:MI:SS' ) ,'DD' ) FROM DUAL ;
-- 对周 四舍五入 极限值 周三的 12点
SELECT ROUND(SYSDATE ,'D' ) FROM DUAL ;
SELECT ROUND( TO_DATE('20220823','YYYYMMDD' ) ,'D' ) FROM DUAL ;
SELECT ROUND( TO_DATE('20220824 01:59:59','YYYYMMDD HH24:MI:SS' ) ,'D' ) FROM DUAL ;
-- 数学函数
-- 求绝对值 ABS(X)
SELECT ABS( -19) FROM DUAL ;
-- 取余 MOD(X,Y) X除以Y的余数
SELECT MOD( 8, 3) FROM DUAL ; -- 判断奇数或者是偶数
-- 幂运算 POWER( X ,Y) X 的 Y 次方
SELECT POWER( 2, 3 ) FROM DUAL ;
-- 截取 TRUNC( X ,Y) 对X 截取 Y 位
SELECT TRUNC( 3.1415 , 3 ) FROM DUAL ;
-- 正负代表方向 , Y 代表位数
SELECT TRUNC( 314.15 , -2 ) FROM DUAL ;
-- 向上取整 CEIL( X)
SELECT CEIL( 3.14) FROM DUAL ;
-- 向下取整 FLOOR( X)
SELECT FLOOR( 3.14) FROM DUAL ;
-- 将 数字 634.47 处理成630
SELECT TRUNC(634.47, -1) FROM DUAL ;
-- 将 数字 634.47 处理成 634.4
SELECT TRUNC(634.47, 1) FROM DUAL ;
-- 日期函数
-- 截取日期 TRUNC 年份 当年的 1号
SELECT TRUNC( SYSDATE , 'YYYY' ) FROM DUAL ;
-- 截取 月份 得到当月的一号
SELECT TRUNC( SYSDATE , 'MM' ) FROM DUAL ;
-- 截取 日 得到当天的 0时
SELECT TRUNC( SYSDATE , 'DD' ) FROM DUAL ;
-- 截取 季度 得到当季度的 1号
SELECT TRUNC( SYSDATE , 'Q' ) FROM DUAL ;
-- 截取 周 得到当 周的 1号
SELECT TRUNC( SYSDATE , 'D' ) FROM DUAL ;
-- 小练习 用 TRUNC 算出每年 入职员工数
SELECT TRUNC( E.HIREDATE , 'YYYY' ) ,COUNT(E.EMPNO) 人数 FROM EMP E
GROUP BY TRUNC( E.HIREDATE , 'YYYY' ) ;
-- 小练习 用 TRUNC 算出 1981年 每个季度的 入职员工数
SELECT TRUNC( E.HIREDATE , 'Q' ) ,COUNT(E.EMPNO) 人数 FROM EMP E
WHERE TO_CHAR(E.HIREDATE , 'YYYY' ) = '1981'
GROUP BY TRUNC( E.HIREDATE , 'Q' ) ;
-- 对年份 四舍五入 ROUND 极限值 7月
SELECT ROUND(SYSDATE ,'YYYY' ) FROM DUAL ;
SELECT ROUND( TO_DATE('20220630','YYYYMMDD' ) ,'YYYY' ) FROM DUAL ;
SELECT ROUND( TO_DATE('20220701','YYYYMMDD' ) ,'YYYY' ) FROM DUAL ;
-- 对月份 四舍五入 极限值 16号
SELECT ROUND(SYSDATE ,'MM' ) FROM DUAL ;
SELECT ROUND( TO_DATE('20220216','YYYYMMDD' ) ,'MM' ) FROM DUAL ;
-- 对天 四舍五入 极限值 中午 12点
SELECT ROUND(SYSDATE ,'DD' ) FROM DUAL ;
SELECT ROUND( TO_DATE('20220216 11:59:59','YYYYMMDD HH:MI:SS' ) ,'DD' ) FROM DUAL ;
SELECT ROUND( TO_DATE('20220216 13:59:59','YYYYMMDD HH24:MI:SS' ) ,'DD' ) FROM DUAL ;
-- 对周 四舍五入 极限值 周三的 12点
SELECT ROUND(SYSDATE ,'D' ) FROM DUAL ;
SELECT ROUND( TO_DATE('20220823','YYYYMMDD' ) ,'D' ) FROM DUAL ;
SELECT ROUND( TO_DATE('20220824 01:59:59','YYYYMMDD HH24:MI:SS' ) ,'D' ) FROM DUAL ;
-- 月份的加减 ADD_MONTHS(DATE , VALUE )
SELECT ADD_MONTHS( SYSDATE , -1 ) FROM DUAL ;
SELECT ADD_MONTHS( SYSDATE , 2 ) FROM DUAL ;
-- 天数的加减 +1
SELECT SYSDATE + 1 FROM DUAL ;
-- 两个日期相差的 月数 MONTHS_BETWEEN( DATE1 ,DATE 2) DATE1 - DATE2
SELECT MONTHS_BETWEEN(SYSDATE , TO_DATE( '20000101' ,'YYYYMMDD') ) FROM DUAL
-- 小练习 算出 20000101 出生的人 今年 多大?
SELECT CEIL( MONTHS_BETWEEN(SYSDATE , TO_DATE( '20000101' ,'YYYYMMDD') )/12 ) FROM DUAL ;
-- 两个日期相差的天数
SELECT CEIL( (SYSDATE - TO_DATE( '20000101' ,'YYYYMMDD') ) ) FROM DUAL ;
-- 返回指定日期 当月 的最后一天 LAST_DAY( DATE)
SELECT LAST_DAY( SYSDATE) FROM DUAL ;
-- 字符串函数
-- 字符串的拼接 CONCAT( 值1 , 值2 )
SELECT CONCAT( '小明' , '去电影院' ) FROM DUAL ;
-- 将 EMP 表中 员工编号 和员工姓名 拼到一起 中间用 : 隔开 例子 : 7369:SMITH
SELECT CONCAT(CONCAT( EMPNO ,':' ),ENAME ) FROM EMP E ;
-- 多个值得拼接 ||
select empno || ':' || ename from emp ;
-- 将一列中的多行 ,拼成 1 行 wm_concat( 字段)
select wm_concat(ename ) from emp ;
select deptno ,wm_concat(ename ) from emp
group by deptno ;
-- to_char
-- 返回字符串的字符长度 LENGTH(X)
SELECT LENGTH( 'SCOTT' ) FROM DUAL ;
SELECT LENGTH( '我吃西红柿' ) FROM DUAL ;
-- 返回字符串的字节长度 LENGTHB(X)
SELECT LENGTHB( 'SCOTT' ) FROM DUAL ;
SELECT LENGTHB( '我吃西红柿' ) FROM DUAL ;
计算机中存储单位
1024
bit - byte(B) - KB - MB - GB - TB - PB
-- 字符串的查找 instr( 字段 , 需要查找的值 [,数值(从哪里开始找) ,数值(第几次出现)] ) string
SELECT INSTR( E.ENAME , 'S' ,1 ,1 ) , E.ENAME FROM EMP E ;
SELECT INSTR( E.ENAME , 'S' ) , E.ENAME FROM EMP E ;
-- 小练习 找到名字 t 第二次出现的位置
SELECT INSTR( E.ENAME , 'T' , 1 ,2 ) , E.ENAME FROM EMP E ;
-- 找出名字中带 S 员工
SELECT * FROM EMP E
WHERE INSTR( E.ENAME , 'S' ) > 0 ;
-- 字符串替换 replace( 字段, 旧值, 新值)
SELECT ename , replace( ename ,'S' ,'张' ) FROM EMP E
-- 小练习 将 各部门的 员工姓名 放入一行中 并且用 _ 分隔
select deptno ,replace(wm_concat(ename ),',', '_') from emp
group by deptno ;
-- 大小写转换
'SCOTT' , 'scott' ,'Scott'
-- 转小写 lower(x)
SELECT lower('SCOTT') FROM DUAL ;
--转大写 upper(x)
SELECT upper('scott') FROM DUAL ;
--使用案例:
select * from emp
where lower(ename) = 'scott' ;
SELECT FROM DUAL ;
-- 截取
-- 从左边截取 LTRIM( 字段 [,需要截取的内容 ])
SELECT LTRIM( 'SASADFG' ,'SA' ) FROM DUAL ;
SELECT LTRIM( 'SASAAAAAASSSSSDFG' ,'SA' ) FROM DUAL ; 'SA'- S - A
-- 小练习 'LSASAAAAAASSSSSDFG'
SELECT LTRIM( 'LSASAAAAAASSSSSDFG' ,'SA' ) FROM DUAL ;
-- 缺省
SELECT ' SDFSDFJK' 名字 FROM DUAL ; -- where ename = 'SCOTT' ;
SELECT LTRIM(' SCOTT' ) FROM DUAL ;
-- 从右边截取 RTRIM
SELECT RTRIM( 'SASADFGSSSSAAAA' ,'SA' ) FROM DUAL ;
-- 缺省
SELECT ('SCOTT ' ) FROM DUAL ;
SELECT RTRIM('SCOTT ' ) FROM DUAL ;
-- 从两边切 TRIM( 需要切的字符 FROM 字段 )
-- 1. 只能写单个字符
SELECT TRIM( 'AS' FROM 'AAAASADFGSSSSAAAA' ) FROM DUAL ;
-- 缺省
SELECT TRIM( ' AAAASADFGSSSSAAAA ' ) FROM DUAL ;
-- 按照字符的位数切 SUBSTR( 字段 , 从哪里开始切 [,切的长度] )
'2022-08-24 01:59:59'
SELECT SUBSTR('2022-08-24 01:59:59', 1 , 10 ) FROM DUAL ;
-- 将时分秒 切出来
SELECT SUBSTR('2022-08-24 01:59:59', 12 , 8 ) FROM DUAL ;
SELECT SUBSTR('2022-08-24 01:59:59', 12 ) FROM DUAL ;
SELECT SUBSTR('2022-08-24 01:59:59', -8 ) FROM DUAL ;
-- 实战演练
create table p_t as
SELECT '浙江省 杭州市 余杭区' ADDRESS FROM DUAL UNION ALL
SELECT '福建省 莆田市 仙游县' ADDRESS FROM DUAL UNION ALL
SELECT '广西壮族自治区 百色市 田林县' ADDRESS FROM DUAL UNION ALL
SELECT '云南省 德宏傣族景颇族自治州 瑞丽市' ADDRESS FROM DUAL UNION ALL
SELECT '新疆维吾尔自治区 乌鲁木齐市 水磨沟区' ADDRESS FROM DUAL ;
SELECT * FROM p_t ;
--- 需求 切出省份
SELECT SUBSTR( ADDRESS , 1 ,3 ) FROM P_T ;
---
SELECT ADDRESS ,SUBSTR( ADDRESS ,1 , INSTR( ADDRESS ,' ')-1 ) FROM P_T ;
-- 切出市
SELECT ADDRESS ,
SUBSTR( ADDRESS , INSTR( ADDRESS ,' ') +1 ,
INSTR( ADDRESS ,' ',1,2) - INSTR( ADDRESS ,' ') -1
) FROM P_T ;
--- 截取 区
SELECT ADDRESS ,
SUBSTR( ADDRESS , INSTR( ADDRESS ,' ',1,2 ) +1 ) FROM P_T ;
-- 子查询
-- 什么是子查询 ?
sql 语句中 另外一条 select 语句
-- 什么时候去使用子查询 ?
当你不知道条件是什么的时候
-- 查询 emp 表中 部门所在地是 new york 的 员工信息
-- 单行子查询
1.子查询 返回结果为 1行 2.只能返回一个字段
SELECT * FROM EMP
WHERE DEPTNO = ( select deptno from dept where loc = 'NEW YORK' ) ;
-- 小需求 找出 工资 比 SMITH 工资高的 员工 的信息
SELECT * FROM EMP E
WHERE E.SAL >(
-- 第一步 找出 smith 的工资
SELECT SAL FROM EMP WHERE ENAME = 'SMITH' ) ;
-- 多行子查询
-- 多行子查询 在 in 里面 使用
-- 找出 在 10 和20部门中 和 30 部门 岗位相同 员工信息
SELECT * FROM EMP E
WHERE JOB IN (
SELECT JOB FROM EMP WHERE DEPTNO =30 )
AND DEPTNO <> 30 ;
-- 多行子查询 在 any 里面 使用
-- any 任何的意思
sal > any( 500, 600 ,5000 )
select * from emp
where sal > any( 2000 ,2500 ,3000 ) ;
-- 表示 大于 集合中的最小值
-- 小需求 查出 emp 表中 工资高于 10 部门中 任意一个员工的 员工信息
select * from emp e where e.sal < any (
-- 查出 10 部门 的 员工工资
select sal from emp where deptno = 10) ;
-- 多行子查询 在 all 里面 使用
sal > all ( 2000 ,2500 ,3000 ) -- sal 大于最大值
-- 查出 emp 表中 工资高于 20部门所有人 工资的 员工信息
select * from emp e where e.sal > all (
-- 查出 10 部门 的 员工工资
select sal from emp where deptno = 20)
and deptno <> 20 ;
-- 总结 :
1. any 在 > 的比较中 是和最小值比较 , 在 < 的比较中 是比较最大值, sal < any( 3000, 4000,5000 )
2. all 在 > 的比较中 是和最大值比较 , 在 < 的比较中 是比较最小值
子查询:
1.可以在 from 中使用
select * from ( select ename , sal from emp
where deptno = 20 ) s1
where s1.sal > 2000 ;
2. 可以在 select 中使用
select ename , sal , ( select deptno from dept where deptno = 10 ) from emp
-- sql 语言的分类
DDL 数据定义语言 CREATE(创建) , ALTER( 修改 ) , DROP( 删除) , TRUNCATE( 截断/清空)
DML 数据操纵语言 INSERT(插入) ,UPDATE(更新) , DELETE(删除)
DQL 数据查询语言 基本的查询语句, order by ,group by
DCL 数据控制语言 GRANT( 授权 ) , revoke( 撤销)
TCL 事务控制语言 COMMIT(提交) , ROLLBACK(回滚)
--DDL 语句不能回滚
-- 建表
第一种建表
CREATE TABLE 表名(
字段名1 数据类型( 长度) ,
字段名2 数据类型( 长度) , ....
) ;
CREATE TABLE TEST_1
(
TNAME VARCHAR2(10) ,
AGE NUMBER -- 默认给38
) ;
-- 第二种建表 根据查询结果建表 ,既有表结构,又有数据
CREATE TABLE 表名
AS
查询语句 ;
create table emp_t
as
select ename 姓名 from emp ;
select * from emp_t ;
起名字的原则 :
1. 不要用中文
2. 不要用拼音
3. 不要拼音的首拼
原则:见名知意
常见的起名 :
1. 用下划线去 区分 不同的单词
2. 驼峰式 empTest
3. 小驼峰式 EmpTest
-- 第三种建表方式 只要表结构 不要数据
create table emp_t2
as
select * from emp where 1 = 2 ;
select * from emp_t2 ;
-- DROP TABLE 表名
DROP TABLE emp_t2 ;
-- TRUNCATE 清空和截断表
TRUNCATE table emp_t ;
select * from emp_t ;
-- insert 插入语句
-- 第一种 指定 插入字段
INSERT INTO 表名( 字段1 ,字段2 ...) values( 值1 ,值2 .... ) ;
INSERT INTO emp_t2( empno ,ename ) values( 1234 , '张三' ) ;
-- 第二种 不指定插入字段
INSERT INTO 表名 values( 值1 ,值2 .... ) ;
INSERT INTO emp_t2 values( 1234 , '张三' ) ;
-- 第三种 可以通过查询结果集插入数据
INSERT INTO 表名
查询语句;
insert into emp_t2
select * from emp ;
select * from emp_t2 ;
-- UPDATE 更新数据
update 表名 set 字段 = 值 ,字段2 = 值 ...
where 条件:
-- 案例
update emp_t2 set sal = 10000
where empno = 7369 ;
-- 给 所有与 smith 部门相同 的员工 工资涨到 6000
update emp_t2 e set sal = 6000
where e.deptno =
( select deptno from emp where ename = 'SMITH' )
;
SELECT * FROM emp_t2 ;
COMMIT ;