文章目录
- 一、SQL语句分类
- 二、DDL(Data Define Language)
- 三、DML(Data Manipulate Language)
- 四、DQL(Data Query Language)
一、SQL语句分类
- DDL:数据定义语言 - 表
-
create
-
add
-
drop
-
truncate
-
rename
-
+…alter
-
- DML:数据操作语言 - 数据库 要配合TCL
-
insert
-
update
-
delete
-
- DQL:数据查询语言(重点)
-
select
-
- DCL:数据控制语言
- 数据库用户、权限
-
create user
-
grant
-
- 数据库用户、权限
- TCL:事务控制语言
- 事务
-
commit
-
rollback
-
savepoint
-
- 事务
二、DDL(Data Define Language)
- 创建表——
create
CREATE table user (
-- 字段 类型
id number(6),
name varchar2(20),
className varchar2(20),
score number(5, 1)
);
- 删除表,不可逆——
drop
- 查看表结构
- 添加字段——
add
alter table user ADD (
-- 建表写法一样
birthday date
);
alter table user ADD (
-- 建表写法一样
score number(4,1)
);
- 删除字段——
drop
- 修改属性——
modify
-- 修改字段 修改类型,不能修改字段名
alter table user MODIFY (
className varchar2(10) not null
);
alter table student.user MODIFY (
className varchar2(10) default 'java'
);
- 修改表名——
rename
- 删除表中所有数据——
truncate
三、DML(Data Manipulate Language)
- 插入数据——
insert into
-- 值的个数和顺序必须按照表中定义
insert into user values
(1, 'rose', 'java', sysdate, 92.3);
-- 即使设置默认值,也不能主动添加null值
insert into user values
(null, 'lucy', null, sysdate, 92.3);
-- 指定部分字段添加值, 值的顺序按照指定顺序添加
insert into user(name, BIRTHDAY, score)
values ('rose', sysdate, 93);
- 修改表中数据——
update
-- 修改指定表中数据
update user set classname = 'python';
-- 同时修改多个字段
update user
set classname = 'python',
score = 100;
-- 筛选:where 条件 所有字段都可以作为条件
update user set classname = 'python'
where name = 'lucy';
- 删除表中数据——
delete
-- 删除指定表中所有数据
delete from user;
-- 条件删除
delete from user where id = 1;
- TCL事务管理
-
commit
-
rollback
-
savepoint
-
-- TCL事务管理 commit rollback savepoint
-- 只有DML需要配合TCL来使用,TCL是让DML对于数据的操作生效或者撤销
-- 不同的会话 - 连接,都有单独的事务,如果DML没有进行事务提交,操作是不生效
-- 提交事务 - 当前会话的DML操作生效
commit;
-- 回滚事务 - 当前会话的DML操作从上一次提交后的地方撤销
rollback;
-- 一次事务中,可以执行多次SQL语句
insert into user(id) values(2);
insert into user(id) values(3);
update user set score = 90;
-- 保存一个事务节点,事务没有结束
savepoint a;
update user set name = 'allen';
-- 回滚到指定保存的节点
rollback to a;
rollback;
-- 事务结束的途径:提交、回滚、关闭连接
四、DQL(Data Query Language)
-
select...from...
- 常用函数
-- || 字符串拼接,多次拼接 select 'ha' || 'hei' || 'heng' from dual; -- concat只能传2个参数 select concat('ha','hei') from dual; -- 函数可以嵌套 select concat(concat('ha','hei'),'heng') from dual; -- 字符串长度 select length('lucy') from dual; -- 字符串补齐 StringUtils select lpad('haha', 10, '*') from dual; select rpad('haha', 10, '*') from dual; -- 字符串切割 指定字符串 从第n个字符开始(n从1开始数) 取m个字符 select substr('hi! how are u! i am fine.', 3, 11) from dual; -- n可以为负数,意味着倒着数第n个字符开始 select substr('hi! how are u! i am fine.', -3, 11) from dual; -- 全变大写、小写、首字母变大写 select LOWER('rOse') from dual; select Upper('rOse') from dual; select initcap('rOse') from dual; select * from USER_bonnie where upper(name)='ROSE'; -- trim 截取, 去除左右两边指定的字符串 select trim('h' from 'hhhi! how are u! i am fine.hhh') from dual; select ltrim('hhhi! how are u! i am fine.hhh', 'h') from dual; select rtrim('hhhi! how are u! i am fine.hhh', 'h') from dual; select rtrim(' i! how are u! i am fine.hhh ') from dual; -- indexOf 功能 , 不包含子串,返回0 select instr('hi! how are u! i am fine.', 'i') from dual; select instr('hi! how are u! i am fine.', 'i', 10) from dual; -- 指定位置为负数,倒着数 select instr('hi! how are u! i am fine.', 'i', -5) from dual; -- 数字有关函数 Math.round ceil floor mod -- 四舍五入,可以保留小数点,也可以从整数部分四舍五入 select round(44.56789, 0) from dual; select round(44.56789, 2) from dual; select round(46.56789, -1) from dual; -- 向上、向下取整,只有一个参数 select ceil(44.56789) from dual; select floor(44.56789) from dual; -- 截取,直接舍弃 select TRUNC(15.79, 1) FROM DUAL; select TRUNC(15.79, -1) FROM DUAL; -- 取余数 取模 select mod(10, 3) from dual; -- 时间 date timestamp select sysdate from dual; -- 2019-07-17 select systimestamp from dual; select * from user_bonnie; insert into user_bonnie (birthday) values('20-NOV-20'); insert into user_bonnie (birthday) values(to_date('2019-02-28', 'yyyy-mm-dd')); -- 变成日期 select to_date('2019-02-28', 'yyyy-mm-dd') from dual; -- 变成字符串 select to_char(sysdate, 'yyyy-MM-dd') from dual; select to_char(systimestamp, 'yyyy"年"MM"月"dd"日" hh24:mi:ss day') from dual; -- 所在日期当月最后一天 select last_day(sysdate) from dual; -- 提取 Calendar.get() day month year select extract(day from sysdate)from dual; -- 在指定时间上添加月份 select add_months(sysdate, -2) from dual; select months_between( to_date('2019-07-17', 'yyyy-mm-dd'), to_date('2019-02-28', 'yyyy-mm-dd') ) from dual; select round(months_between( to_date('2019-07-17', 'yyyy-mm-dd'), to_date('2019-02-28', 'yyyy-mm-dd') )) from dual; -- nvl2(comm, val1, val2): 如果comm为null,取val2,否则取val1 select nvl2(comm, 0, 1000) from emp; -- 查询所有人的年薪=sal*12 + comm -- select 后可以跟字段、表达式、函数 -- nvl(comm, 0) :如果comm为null,则取0 -- as 后跟列的别名,as可以省略 select ename, sal * 12 + nvl(comm, 0) as salary from emp; -- nvl2(comm, val1, val2): 如果comm为null,取val2,否则取val1 select nvl2(comm, 0, 1000) from emp; -- 查询出来的员工,按照入职时间排序 - 默认升序 asc 降序 desc select * from emp order by hiredate asc; select * from emp order by hiredate desc; select * from emp where -- 在部门20的人 = deptno = 20; -- 工资大于3000的人 > >= -sal >= 3000; -- 工资小于3000的人 < <= -sal < 3000; -- 工资不等于3000的人 <> -sal <> 3000; -- 大于3000或者小于3000 or and (and优先级更高) (sal > 3000 or sal < 3000) and deptno = 20; -- job是salesman的 字符串比较 = 大小写敏感,借助函数 lower(job) = 'salesman'; -- 名字长度超过5位, 借助length函数 length(ename) > 5; -- 名字中以 s 开头的人 -- like 配合 %:0个或多个* _:1个,模糊查询 ename like 'S%'; -- 名字中有 s 的人 ename like '%S%'; -- 没有领导的人 -- null值很特殊,不能判断、不能计算,代表无穷大,或者无穷小 mgr is null; -- is not null -- 工资大于 3000,1500,1200 任意一个 sal > any (3000, 1500, 1200); -- 工资大于 3000,1500,1200 每一个 sal > all (3000, 1500, 1200); -- 工资等于 3000,1500,1200 任意一个 sal in(3000, 1500, 1200);
- 分组函数
-- 分组函数、聚合函数 max min sum avg count select count(empno) from emp; -- 分组函数 忽略null值 select count(comm) from emp_hh; select count(1) from emp; -- 每个部门最高工资 select deptno, max(sal) from emp group by deptno; -- 注意:错误!ename 14条,max(sal) 1条 -- 结论:select子句中出现的字段,必须同时出现在group by子句中 select ename, max(sal) from emp ; select deptno, max(sal), min(comm), avg(comm), sum(empno) from emp group by deptno; -- 通过emp表查询员工部门都有哪些 select deptno from emp; select distinct deptno from emp; -- 去重复 select distinct deptno , mgr from emp; -- 去重复