sql基础,本人基于Oracle所学笔记总结

SQL
sql基础,本人基于Oracle所学笔记总结
1.DQL语言

select * from emp;
(工作中一般不用*,效率低,直接查列名)
select empno (as) 员工号 from emp;
select distinct empno from emp;
(distinct去重)

伪表dual,只查一行一列,一般用来测试数据

order by
select deptno from emp order by sal asc ;
asc升序,可不写,desc降序
Order by deptno asc,sal desc; 先排第一列再二

group by
Select deptno from emp group by deptno;
having 分组后过滤

null 空值函数

202002-----数值
‘202002’------字符串
202002------to_data(20200201,‘yyyymmdd’) from dual -----日期
Select a from emp;
a当作列名,'a’字符串,“a”强制转换

2.数据类型
1.数值型
Oracle:统一用number
number(5,2);
2.字符串 char()
Chat(10)-----固定字长,多余的是空格
Verchar( 10)-----可变字长,多余的不占空间(所有数据库通用)
Verchar2-----oracle扩展
nverchar
Nverchar2
汉字占两个字节,数字字母占一个,空格不占字节占空间
3.日期型
Yyyy–4位年份,mm–月份,dd----天(如果加24,强制转换224小时制),hh—小时,mi—分钟,ss—秒
星期几
Select to_char(hiredate,‘dd’);----天
Select to_char(hiredate,‘day’);----天
4.大文件 lob(clo文本b,blob图片,bfile独立文件)
存图片jpg-----html -------- 二进制010100010101001
5.特殊字符
null与空字符串
Oracle没有布尔型

建表
1.create
Create table stu_1(
Id number,
Numid number,
Name verchar2(30),
Sex char(2),
fDate date,
);

Primary key 主键约束:不能约束,不能为null
外键约束:可以为null
Unique 唯一约束:不能重复,但是可以为null
Not null非空约束:只能在列级
(Check sex in(‘男’,‘女’);检查约束:

2.alter修改表结构
可通过右键exit自动生成语句
3.drop删表(不可恢复)

Create table emp_1 as select *from emp;镜像(没有约束)
excel可完成重复代码
随机数
Select dbms_random.value from emp;
随机排序
Select * from student order by dbms_random.value;

4.增删改查
Ddl:create alter drop
Dml:insert update delete
Insert into emp(job,sal) values(1,1);
高级插入
Insert into emp1 select * from emp;

Update emp set ename=‘cx’ where empno=7369;

Delete from emp where ;
区别drop删表,delete删数据,truncate删除所有数据

模糊查询
From emp where ename LIKE ‘A’
From emp where ename LIKE ‘_A%’
_ 1个字符
% 0到多个字符

逻辑运算符
not > and > or
In 相当于=
Between 闭区间
And
Any
all

限制返回结果集
前三行:MySQL: select * from emp limit 3;
Sqlserver: select top 3* from emp;
Oracle : 伪列rownum和rowid
Select rownum, 列名 from emp where rownum<=3;(只适用于rownum=1,rownum<=n,每次提取都当作第一行处理)
……………rowid……………………………………

集合的操作
并集 select ename from emp union select job from emp;
union会自动去重
不去重union all

交集
Intersect

差集(A-B)
Minus/except(sql server)

子查询
嵌套分部查询
in/=all
多行多列子查询
空数据判断关键词exists,用于判断子查询是否有数据返回。如果有数据返回,则exists结构返回true,反之,返回false。

视图
Create view v_1 as select deptno,job from emp;
Select * from v_1;
修改视图:
Oracle: create or replace view as select……
其余sql
Alter view v_1…………

*和rownum同时出现,需要给表取别名才行

函数
单行函数:每次处理一行
Round:四舍五入函数,有两个参数,第二个参数是小数点后位数精度
Trunc:截断函数,不四舍五入的round
Nvl():转换函数
Select sal ,nvl(comm,0),sal+comm from emp;
Nvl(comm,0)……如果comm是空值,自动转化成0
Nvl(comm,1,2)………非空,返回1,空值,返回2

日期类型
获取当前时间
Select sysdate from dual;
Select sysdate+1 from dual; 时间变成明天了
Yyyy, mm ,dd , hh , hh24 ,mi ,ss
Select to_char(sysdate, ‘yyyymmdd’) from emp;
20200213
To_date(20200113,'yyyymmdd ')
对天数sysdate+2
对月份 add_months(sysdate,1) from dual; 只能进行正负整数操作
如果是闰年,2.28+1月———3.31
6.30+1——7.31,系统会识别月末
Select months_between(sysdate,hiredate) from emp;前面减后面
Select last_date from dual;取本月最后一天
Last_date+1 下月初
Add_months(to_date(‘20200231’,‘yyyymmdd’),1) 月份加一
Trunc 对时间截断
Select trunc(sysdate, ‘yyyy’ ) from dual;截取到本年首天
Select trunc(sysdate, ‘dd’ ) from dual;截取到今天零点

今天周五,则下周六是明天,而不是下周的周六
Next_day(sysdate , ‘星期一’) from dual; 定位到下周一

字符串函数
Length(ename) 求长度
拼接函数:concat() 或者||
Select concat(ename,job) from emp; 只能连两个
Select ename||ename||job from emp; 连多个
首字母大写 initcap()
小写 lower() 大写 upper()
替换函数
Select replace(ename,‘A’,’@’) from emp;
截取
Select substr (ename,2,4) from emp;从第二位开始截四位
Select substr (ename,2) from emp;从第二位开使截到尾
*****instr查询字符串位置,返回数值雷星
Select enamel,instr(ename,‘A’,2) from emp; 从第二位开始找
不写默认从第一位找
Select enamel,instr(ename,‘A’,2,4) from emp; 从第二位开始找,第四次出现A
倒着找:

Case when函数 三种写法等同
1。 select e.,
Case when deptno=10 then ‘低级’
when deptno=20 then ‘中级’
when deptno=30 then ‘高级’
end sss
From emp e;
1.Select e.
,
Case deptno
when 10 then ‘低级’
when 20 then ‘中级’
when 30 then ‘高级’
end sss from emp;
3.decode() (只有ocacle)
select e.*,
Secode (septno,10,‘初级’,20,‘中级’,‘高级’)
end sss from emp;

多行函数(组函数,聚合函数)----select ,having后面(where只能对单行操作)
count()……计数 max () mix () avg () sum()
count计数时自动忽略空格
Count(1)/count(*)对整行进行操作
Select max(sal) from emp;
形参,实参
Select sysdate from dual:获取当前时间(Oracle)

数值函数
Mod()------求余数
Abs()-------绝对值
Power()------幂指函数

补充函数
Wm_concat 列拼接
Select wm_concat(ename) from emp;
填充 pad(列名,15,’@’)
Lpad 左填 rpad 右填
Select * from emp for update; 解锁,可直接在表中改数据
列去空格 trim()
Ltrim() rtrim()

数学判断符号
< >= <= =< !
!Sql: <>
= sql

计算 1-2月-1988 是星期几
Select to_char(to_date(‘19880201’,‘yyyymmdd’),‘day’) from dual;

布尔表达式 ………if exists true false;
数学表达式 sal>2000 3=6 i=5

表连接
集合,函数,分组排序,开窗函数,子查询,视图
Select * from emp,dept;
Select * from emp cross join dept;
当有相同的列----取别名 emp.deptno as eno

笛卡尔积(交叉连接)—哈希连接—散列连接
Select * from emp cross join dopt;

内连接
Select * from emp e,dept d where e.deptno=d.deptno;
转换 select * from emp e (inner) join dept d on e.deptno=d.deptno;
只能关联有效的

外连接 5种join where
select * from dept e join emp d on e.deptno=d.deptno;
Select * from emp e,dept d where e.deptno(+)=d.deptno;
Left ( outer ) join
Right outer join
A lrft join b
b right join a

全外连接
Full join

Abs( - ) 绝对值

Dba
select * from emp;
Select * from v_1;

数据字典
Select table

扩展 using
Select * from emp e join dept d on e.deptno=d.deptno
=Select * from emp e join dept d using(deptno);
自然连接natural join
Select * from emp natural join dept;
不等值连接

Eg 员工的姓名,工资,及工资等级

数据库三大范式
1NF:所有元素不可分割(每个元素都是原子性)
2NF:所有列不允许部份依赖于主键列(复合主键)
3NF:所有列不允许传递依赖于主键

4NF
NF 巴斯-科德
5NF 完美范式

事务:ACID(重要
A:原子性
C:一致性
I:隔离性
D:持久性

对象:表,视图,序列。。。。
序列:等差数列
Create sequence cx
Start with 5 increment by 2;
Select cx.currval,cx.nextval from dual;

Insert into emp(id) values(cx.nextval)

多表联合更新(重要)
开窗函数