朴实无华但实用的SQL大全,超乎你想象

简介: 朴实无华但实用的SQL大全,超乎你想象

一.DQL数据查询


1.1 基本select语句


三种方式别名
select a.empno as id,a.ename username,a.hiredate "My Hirdate" from emp a;



267239fe188240c3aab51a40791732e5.png

拼sql
需求:查询emp表,用户的工作
select b.ename|| q'\ 's job is: \' || b.job from emp b
使用引用符  q'\??????\'

0b55eedf407142afb4c863bd89f186a6.png

1.2.函数类型


a.字符函数


需求:用户名大写、小写、首字母大写
select upper(a.ename),lower(a.ename),initcap(a.ename) from emp a


a88d502260ea44c0b59dbe6ac1f682d3.png


b.数字函数


--需求:四舍五入、取模、截取
select round(45.456,2) from dual --四舍五入
select trunc(5.456,2) from dual --截取位数
select mod(1600,300) from dual  --取余数

261fc5fe96c546fd9518c46146675a90.png


c.日期函数


alter session set nls_date_format ='YYYY-MM-DD';
select sysdate,trunc(sysdate,'mm') from dual;


cf3f008af531462a92002028d6f76b8c.png


d.转换函数


字符转日期:
select to_date('19810101','yyyymmdd') from dual;
数字转字符串:
select to_char(sal,'$9,999.00') from emp;

94ceba7df2dc41738cef3765102d2f8d.png


1.3 过滤和排序


1.基本语法
a.where子句中不能出现列的别名
b.order by放最后
c.字符串和日期需要用单引号
2 数据库默认日期格式
SYS@PROD> alter session set nls_date_format='yyyy/mm/dd hh24:mi:ss';
3.where过滤条件
= > < !=
betweeen 1 and  20
in 
like: %(多个) _(单个)
is null或者is not null
4 order by 子句
5.like:模糊匹配
%:1个或多个字符;_:1个字符;escape:指定转义符
select * from emp where ename like '%$_%' escape '$';


e9e69f7f1c1a40429bc0bf472e9afd12.png

1.4 分组函数


类型:avg\max\min\sum\count
需求:查询emp表销售人员工资的平均值,最大值、最小、工资总和
select avg(a.sal),max(a.sal),min(a.sal),sum(a.sal) from emp a
--group by
需求:查询各个部门平均工资
select a.deptno,avg(a.sal) from emp a
group by a.deptno
--having排除
查询部门最高工资大于2900的部门?
select a.deptno,max(a.sal) from emp a
group by a.deptno
having max(a.sal) >2900


6d98295387854d49bce024a7b35f33b3.png


1.5 多表查询


5.1 内连接(等值)
需求:统计每个部门的部门和名称
select a.deptno,b.dname from emp a,dept b
where a.deptno = b.deptno
5.2 外连接
a.左连接
需求:统计每个员工所有部门信息?
select * from dept m,emp n
where m.deptno = n.deptno(+)
b.右外连接
需求:统计部门的员工信息
select * from emp m,dept n
where m.deptno = n.deptno(+)
c.全外连接
select n.*,m.* from dept m,emp n
where m.deptno = n.deptno(+)
union
select m.*,n.* from emp m,dept n
where m.deptno = n.deptno(+)
select * from emp m full outer join dept n
on (n.deptno= n.deptno)


1.6 子查询


需求:查询emp表谁的工资最少的员工
select * from emp b
where b.sal = (select min(a.sal) from emp a)
需求:查询工资比各个部门平均工资都高的员工
select * from emp m where m.sal > all (
select avg(a.sal) from emp a group by a.deptno)
> all :大于最大值
< all:小于最小值
!=all :not in
< any:小于最大值
> any: 大于最小值
= any:in 

945fb054fd044db1a3bdf547b4cfe013.png


二、DML数据操纵


2.1 insert语句


##案例1
向表dept中插入两行数据
insert into dept values(50,'IT','beijing');
##案例2
向emp表插入指定列的数据
insert into emp(empno,ename,job,hiredate,sal) values(1008,'jem','it',sysdate,2300);
--创建表
create table emp1 as select * from emp where 1=2;
insert into emp1
select * from emp t where t.empno =1008;


2.2 update语句


##案例1
把emp表7782员工从10号部门调到20号部门
update emp t set t.deptno = 20 where t.empno =7782;
##案例2(多列子查询)
修改emp表7698号员工的职位和部门号与7499一样
update emp t set(t.job,t.deptno) = 
(select a.job,a.deptno from emp a where a.empno=7499)
where t.empno =7698;
##更新空值
update emp set job=null;
update emp set job ='';


2.3 delet语句


##案例1
删除dept表部门号为50,60的数据
delete from dept w where w.deptno in (50,60);


2.4 Merge语句


#案例1
merge into test1 t1
using test2 t2 
on(t1.deptno=t2.deptno)
when matched then
update set t1.dname=t2.dname,t1.loc=t2.loc
when not matched then
insert(deptno,dname,loc) values(t2.deptno,t2.dname,t2.loc);
注解:条件满足更新,不满足时候是插入



三、DCL数据控制


3.1 用户登陆


密码验证方式
sqlplus scott/tiger
conn scott/tiger
OS认证的方式:sqlplus / as sysdba


3.2. 创建用户


##创建用户damon
create user damon identified by damon;
##给用户解锁
select USERNAME,ACCOUNT_STATUS from dba_users;
alter user hr identified by hr account unlock;


3.3. 系统权限


系统权限都把包括:
create session;
create table;
create sequence;
create view;
create procedure;
##新建的用户如何赋予向系统权限
创建角色,把权限给角色,再把角色赋予用户
SYS@PROD> create role manger;
SYS@PROD> grant create session to manger;
SYS@PROD> grant manger to damon;
##赋予系统默认的角色(保证使用数据最基本的一些功能)
SQL> select * from role_sys_privs where role in ('CONNECT','RESOURCE');
SYS@PROD> grant connect,resource to damon;


3.4. 对象权限


SYS@PROD> grant select on scott.emp to DAMON;


3.5. 权限数据字典


select * from role_sys_privs;
select * from user_tab_privs_recd;
select * from user_sys_privs;



四、DDL数据定义


4.1 创建表


用户要建表,需要有 create table 权限,有存储空间(表空间) 
一张表中最多有 1000 个列
create table test 
(
dname varchar2(14),
col1 number,
col2 date default sysdate
);
create table DEPT01 AS select * from scott.dept  --复制表

dbecac7d957143d6ae5c40c0414f3f8e.png


4.2 数据类型


#字符
char(n) 固定长度字符数据,读取效率快,存储时使用空格填满空白内容。
--n 默认值 1,范围 1~2000 字节。
varchar2(n) 可变长度字符数据,节省存储空间。
--n 必须指定,范围 1~4000 字节。
 #数字
 number(p,s) 数值数据,包括零、负数、正数。
 --p 是 precision 精度,总有效数据位数,最大值是 38,默认是 1;
 --s 是 scale 刻度,小数点后位数;
#日期
date 日期和时间值,包括世纪、年、月、日、小时、分、秒,必须指定年、月、日
timestamp(n):时间戳,表示日期和时间,比 date 更精准
--n 表示秒向下划分的精度范围, n 取值 0~9,默认 6
select systimestamp from dual; 
#大对象
BLOB:Binary Large Object (二进制大对象),例如图片、视频、音频。
CLOB:Character Large Object(字符型大对象),例如文本


4.3 修改表


#添加一个新列
为 dept01 表新增加一列 job ,类型 varchar2(9)
alter table dept01 add (job varchar2(9)); 
#修改现有的列的长度
alter table dept01 modify (ename varchar2(15));
#新的列定义默认值
alter table dept01 modify (ename varchar2(20) default 'jem'); 
#删除一列
删除列job
alter table dept01 drop column job;
生产中建议使用以下命令:
设置列不可用:alter table dept_bak SET UNUSED (LOC);
删除不可用的列:alter table dept_bak drop unused columns;
#重命名列
重命名列deptno为ID
alter table dept01 rename column deptno to id;
#将表更改为只读状态(备份时用)
alter table dept01 read only;
alter table dept01 read write;


4.4 约束


常用的约束
非空(not null)、唯一(unique)、主键(primary key)、外键(foreign key)、检查(check)
#增加非空约束(emp1表empno)
alter table emp1 modify empno not null;
#增加主键(emp1表empno)
唯一+非空
alter table emp1 add primary key (EMPNO);
#外键
为emp表增加一个外键约束,保证员工不能安排到一个不存在于dep中的部门
create table emp as select * from scott.emp;
create table dept as select * from scott.dept;
满足条件:
基表的字段必须是主键
alter table dept add primary key (deptno);
alter table emp add constraint fk_emp_deptno 
foreign key (deptno) references dept(deptno)
测试数据
insert into emp(empno,deptno) values(1008,40)


4.4.视图


#创建简单视图
create or replace view emp_view as 
select empno,ename,job from emp1
select * from emp_view
--查看视图sql文本
select d.view_name, d.text from user_views d 
where d.view_name = 'EMP_VIEW'
#静态数据字典 
select * from dba_users;
select * from dba_tables;
select * from dba_tab_cols
where table_name='EMP1';
DBA_ :数据库拥有的所有对象(dba权限) 
ALL_:用户拥有及可以操作其他用户的记录
USER_:用户拥有的对象
#动态性能视图:
select * from v$sql;
select * from v$session;


4.5 索引


目的是加快Oracle查询的速度,数据自动维护,以空间换时间
```bash
#唯一索引
create unique index emp1_idx on emp1(ename);
#非唯一索引
create index emp1_idx on emp1(ename);
#创建函数索引
create index fun_emp1_job on emp1(lower(job));
#删除索引
drop index fun_emp1_job;


4.6 序列


可共享,不同的用户可共同调用,如果Number型号,可以按照顺序产生
#如何创建序列
create sequence dept_seq
increment by 1
start with 100
maxvalue 9999999
nocache
nocycle;
--nocache:不往内存缓存
--nocycle到最大值后从1请开始
---cycle:可以指定4
select * from user_sequences d
where d.sequence_name ='DEPT_SEQ'
##生成序列号
select DEPT_SEQ.Nextval from dual


4.7 同义词


Oracle当中,表名比较长,或者某个用户表经常被访问,简化对象的访问,可以创建同义词
public:共有同义词,只要有权限的用户都可以访问
私有同义词:只能自己访问


SYS@PROD> show user
USER is "SYS"
##授权用户创建同义词的权限
SYS@PROD> grant create public synonym to scott;  --公有同义词
SYS@PROD> grant create synonym to scott;  --私有同义词
##创建共有同义词
SYS@PROD> conn scott/tiger
SCOTT@PROD> create public synonym scottemp for emp;
##其他用户访问
SCOTT@PROD> conn hr/hr
HR@PROD> select * from scottemp;
select * from scottemp
              *
ERROR at line 1:
ORA-00942: table or view does not exist
##管理员授权
HR@PROD> conn / as sysdba
SYS@PROD> grant select on scott.emp to hr;
HR@PROD> select * from scott.emp;


五、TCL事务控制


5.1 属性(ACID)


原子性:事务必须都完成,或者不完成
一致性:查询的结果必须与开始查询的状态一致
隔离性:做出变更的会话,其他会话看不到未提交的记录
持久性:事务一旦完成,所有的用户立即看到


5.2 事务的开始和结束


SYS@PROD> update emp t set t.ename='jem' where t.empno =7369;
1 row updated.
SYS@PROD> commit;   --提交
SYS@PROD> rollback;  --回滚
DDL语句:默认提交


目录
相关文章
|
1月前
|
SQL 移动开发 算法
SQL 的困难源于关系代数
SQL 作为结构化数据计算的主要语言,虽然广泛应用于关系数据库和大数据平台,但在复杂计算场景中表现不佳,如股票连涨天数和大集合中的 TopN 计算。这些问题源于 SQL 的理论基础——关系代数,缺乏必要的数据类型和运算。相比之下,esProc SPL 通过引入“离散数据集”这一新代数体系,能够更简洁高效地处理复杂计算任务。
|
6月前
|
SQL 存储 算法
数据库编程大赛:一条SQL计算扑克牌24点
参加NineData举办的数据库编程大赛,展示你的技术才华!用一条SQL语句解决扑克牌24点的计算表达式。这场比赛面向数据库爱好者、开发者、程序员、DBA等,展示你的编程技能,并有机会赢得丰厚奖励。欢迎大家来挑战!
257 0
数据库编程大赛:一条SQL计算扑克牌24点
|
SQL 数据挖掘 数据库
《数据库查询大师:掌握SQL的终极技艺》
《数据库查询大师:掌握SQL的终极技艺》
38 0
|
SQL 移动开发 Oracle
【SQL应知应会】分析函数的点点滴滴(一)
【SQL应知应会】分析函数的点点滴滴(一)
|
SQL 移动开发 Oracle
【SQL应知应会】分析函数的点点滴滴(三)
【SQL应知应会】分析函数的点点滴滴(三)
137 0
|
SQL 移动开发 Oracle
【SQL应知应会】分析函数的点点滴滴(二)
【SQL应知应会】分析函数的点点滴滴(三)
113 0
|
SQL
你与写的一手好sql的大佬可能就差这一道题!
你与写的一手好sql的大佬可能就差这一道题!
99 0