Oracle数据库常见sql

-新建表:
create table table_name(
id varchar2(300) primary key,
name varchar2(200) not null
);

--插入数据
insert into table_name (id,name) values ('aa','bb');

--更新数据
update table_name set id = 'bb' where id='cc';

--删除数据
delete from table_name where id ='cc';

--删除表
drop table table_name;

--修改表名:
alter table table_name rename to table_name_1;

--表数据复制:
insert into table1 (select * from table2);

--复制表结构:
create table table1 select * from table2 where 1>1;

--复制表结构和数据:
create table table1 select * from table2;

--复制指定字段:
create table table1 as select id, name from table2 where 1>1;

--条件查询:
select id,name (
case gender when 0 then '男'
when 1 then '女' end ) gender
from table1

字符函数
--字符函数
select substr('abcdefg',1,5)substr, --字符串截取
instr('abcdefg','bc') instr, --查找子串

'Hello'||'World' concat, --连接

trim(' wish ') trim, --去前后空格
rtrim('wish ') rtrim, --去后面空格
ltrim(' wish') ltrim, --去前面空格

trim(leading 'w' from 'wish') deleteprefix, --去前缀
trim(trailing 'h' from 'wish') deletetrailing, --去后缀
trim('w' from 'wish') trim1,

ascii('A') A1,
ascii('a') A2, --ascii(转换为对应的十进制数)
chr(65) C1,
chr(97) C2, --chr(十进制转对应字符)

length('abcdefg') len, --length

lower('WISH')lower,
upper('wish')upper,
initcap('wish')initcap, --大小写变换

replace('wish1','1','youhappy') replace, --替换

translate('wish1','1','y')translate, --转换,对应一位(前面的位数大于等于后面的位数)
translate('wish1','sh1','hy')translate1,

concat('11','22') concat          --连接


from dual;

 

--to_number

--to_number(expr)
--to_number(expr,format)
--to_number(expr,format,'nls-param')

select to_number('0123')number1, --converts a string to number
trunc(to_number('0123.123'),2) number2,
to_number('120.11','999.99') number3,
    to_number('0a','xx') number4, --converts a hex number to decimal
to_number(100000,'xxxxxx') number5

from dual;

数学函数
--绝对值:abs()
select abs(-2) value from dual; --(2)

--取整函数(大):ceil()
select ceil(-2.001) value from dual; --(-2)

--取整函数(小):floor()
select floor(-2.001) value from dual; --(-3)

--取整函数(截取):trunc()
select trunc(-2.001) value from dual; -- (-2)

--四舍五入:round()
select round(1.234564,4) value from dual; --(1.2346)

--取平方:Power(m,n)
select power(4,2) value from dual; --(16)

--取平方根:SQRT()
select sqrt(16) value from dual; --(4)

--取随机数:dbms_random(minvalue,maxvalue)
select dbms_random.value() from dual; (默认是0到1之间)
 select dbms_random.value(2,4) value from dual; (2-4之间随机数)

--取符号:Sign()
  select sign(-3) value from dual; --(-1)
  select sign(3) value from dual; --(1)


--取集合的最大值:greatest(value)
select greatest(-1,3,5,7,9) value from dual; --(9)

--取集合的最小值:least(value)
select least(-1,3,5,7,9) value from dual; --(-1)

--处理Null值:nvl(空值,代替值)
select nvl(null,10) value from dual; --(10)
  
select nvl(score,10) score from student;

日期函数
--日期
--年 yyyy yyy yy year
--月 month mm mon month
--日+星期 dd ddd(一年中第几天) dy day
--小时 hh hh24
--分 mi
--秒 ss

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')currenttime,
to_char(sysdate,'yyyy') year,
to_char(sysdate,'mm') month,
to_char(sysdate,'dd') day,
to_char(sysdate,'day') week,
to_char(sysdate,'hh24')hour,
to_char(sysdate,'mi') minute,
to_char(sysdate,'ss') second
from dual;

select to_date('2009-07-04 05:02:01','yyyy-mm-dd hh24:mi:ss')currenttime,
to_char(to_date('2009-07-04 05:02:01','yyyy-mm-dd hh24:mi:ss'),'yyyy')year,
to_char(to_date('2009-07-04 05:02:01','yyyy-mm-dd hh24:mi:ss'),'mm')month,
to_char(to_date('2009-07-04 05:02:01','yyyy-mm-dd hh24:mi:ss'),'dd') day,
to_char(to_date('2009-07-04 05:02:01','yyyy-mm-dd hh24:mi:ss'),'day') week,
to_char(to_date('2009-07-04 05:02:01','yyyy-mm-dd hh24:mi:ss'),'day','NLS_DATE_LANGUAGE=American') week, --设置语言
to_char(to_date('2009-07-04 05:02:01','yyyy-mm-dd hh24:mi:ss'),'hh24')hour,
to_char(to_date('2009-07-04 05:02:01','yyyy-mm-dd hh24:mi:ss'),'mi') minute,
to_char(to_date('2009-07-04 05:02:01','yyyy-mm-dd hh24:mi:ss'),'ss') second
from dual;

--months_between
select months_between(to_date('03-31-2014','MM-DD-YYYY'),to_date('12-31-2013','MM-DD-YYYY')) "MONTHS"
FROM DUAL;

--next_day
select sysdate today, next_day(sysdate,6) nextweek from dual;

--时间区间
select cardid, borrowdate from borrow where to_date(borrowdate,'yyyy-mm-dd hh24:mi:ss')
between
to_date('2014-02-01 00:00:00','yyyy-mm-dd hh24:mi:ss') and
to_date('2014-05-01 00:00:00','yyyy-mm-dd hh24:mi:ss');

--interval 间隔
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') currenttime,
to_char(sysdate - interval '7' year,'yyyy-mm-dd hh24:mi:ss') intervalyear,
to_char(sysdate - interval '7' month,'yyyy-mm-dd hh24:mi:ss') intervalMonth,
to_char(sysdate - interval '7' day,'yyyy-mm-dd hh24:mi:ss') intervalday,
to_char(sysdate - interval '7' hour,'yyyy-mm-dd hh24:mi:ss') intervalHour,
to_char(sysdate - interval '7' minute,'yyyy-mm-dd hh24:mi:ss') intervalMinute,
to_char(sysdate - interval '7' second,'yyyy-mm-dd hh24:mi:ss') intervalSecond
from dual;


--add_months 增加月份
select add_months(sysdate,12) newtime from dual;

--extract
select extract(month from sysdate) "This Month",
extract(year from add_months(sysdate,36)) " Years" from dual;


聚合函数
--count
select count(1) as count from student;--效率最高
select count(*) as count from student;
select count(distinct score) from student;

--avg
--distinct|all
select avg(score) score from student;
select avg(distinct score) from student;
select classno,avg(score) score from student group by classno;

--max
--distinct|all
select max(score) from student;
select classno, max(score) score from student group by classno;

--min
--distinct|all
select min(score) from student;
select classno, min(score) score from student group by classno;

--stddev(standard deviation)标准差
select stddev(score) from student;
select classno, stddev(score) score from student group by classno;

--sum
select sum(score) from student;
select classno, sum(score) score from student group by classno;

--median--中位数
select median(score) from student;
select classno, median(score) score from student group by classno;

伪列rownum
--rownum小于某个数时可以直接作为查询条件(注意oracle不支持select top)
select * from student where rownum <3;

--查询rownum大于某个数值,需要使用子查询,并且rownum需要有别名
select * from(
select rownum rn ,id,name from student
)
where rn>2;

select rownum rn, student.* from student
where rn >3;

--区间查询
select * from (
select rownum rn, student.* from student)
where rn >3 and rn<6;

--排序+前n条
select * from (
select rownum rn, t.* from (
select d.* from DJDRUVER d order by drivernumber)t
)p where p.rn<10;

--排序+区间查询1
select * from (
select rownum rn, t.* from (
select d.* from DJDRIVER d order by DJDRIVER_DRIVERTIMES
)t
)p where p.rn<9 and p.rn>6;

--排序+区间查询2
select * from (
select rownum rn, t.* from (
select d.* from DJDRIVER d order by DJDRIVER_DRIVERTIMES
where rownum<9
where p.rn>6;--效率远高于方式一

分页查询
--假设每页显示10条

--效率低

select * from (
select rownum rn, d.* from DJDRIVER d )p
where p.rn<=20 and p.rn>=10;

select * from (
select rownum rn, d.* from DJDRIVER d )p
where p.rn between 10 and 20;

--效率高

select * from (
select rownum rn, d.* from DJDRIVER d where rownum<=20 )p
where p.rn>=10;


--排序+区间查询1(效率低)

select * from (
select rownum rn, t.* from (
select d.* from DJDRIVER d order by DJDRIVER_DRIVERTIMES
)t
)p
where p.rn<=20 and p.rn>=10;

select * from (
select rownum rn, t.* from (
)t
)p
where p.rn between 10 and 20;

--排序+区间查询2(效率高)

select * from (
select rownum rn, t.* from (
select d.* from DJDRIVER d order by DJDRIVER_DRIVERTIMES
where rownum<=20
)p
where p.rn>=10;

//=====================================

一.单词
Database 数据库 Manipuation 操纵、控制 Table 表格、桌子
Row 行、路 Grant 授予、承认 Column 列、圆柱
Select 选择、查询 Commit 确认、犯罪 Dual 二重的
System 系统、制度 Actomicity 原子性 Char 烧焦、
Unicode 万国码、统一码 Isolation 隔离 Varchar 可变字符
Insert 插入、嵌入 Create 产生、创作 Delete 删除
Update 更新、修正 Alter 改变、修改 Language 语言
Query 询问、问题 Values 价值、标准 Drop 退出、结束
Revoke 撤销、取消 Durability 持续性、永久性 concat 联系、字符串函数
Rollback 回降、返回 Desc 降序、查询 upper 上面、内地
Consistency 一致性 Modify 修改 lower 下方、底部
intcap 因特普 cookie 饼干、缓存 session 阶段、会期、缓存
distinct 不同的、确切的 trim 截取、整理 distinct 不同的、卓越的
pad 补位、衬垫 substr 子串 round 四舍五入、圆形的
trunc 功能截取、躯干 mod 取模函数、国防部 sysdate 相册
hiredate 入职时间 systimetamp 集成电路 initcap 首字母大写
constraint 约束、限制 primary 主要、要素 index 指数、索引
sequence 序列 nextval 自动增长 increment 增量
unique 唯一、独特的 default 违约、默认 check 检查、核对
ceil “天花板” floor “地板”

【Dual 】: 伪表(一个专门用于演示的表)

备注:SQL:数据查询(DQL);数据操作(DML):insert update delete;
数据定义(DDL):create drop ;数据控制语句(DCL):grant revoke ;
事务控制语句(TCL):commit rollback 特性:原子性、一致性、隔离性和永久性(持续性) ;

二.代码

1.查询结构: desc 表名; 如,desc ZQ_009;
2. 删除表格: drop table 表名; 如,drop table ZQ_009;
3. 增加列表: alter table 表名 add(字段名 数据类型及长度,字段名 数据类型及长度…); 如,alter table stu_jp001 add(物理 number(3),英语 number(3));
4. 删除列/字段: alter table 表名 drop(字段,字段…);如,alter table stu_jp001 drop(物理,英语);
5. 修改现有表格(字段名):alter table 表名 modify(字段名 数据类型及长度,字段名 数据类型及长度…); 如,alter table stu_jp001 modify(性别 number(1),语文 varchar(10));
6. 嵌入数据: insert into 表名 values(数据A,数据B…); 如,insert into stu_jp001 values(‘小明’,16,‘男’,1805,to_date(‘2000-05-07’,‘yyyy-mm-dd’),‘上海’,80,90);
7. 部分嵌入数据:insert into 表名(字段A,字段B…) values(数据A,数据B…);
如,insert into stu_jp001 (姓名,年龄,性别,地址) values(‘张无忌’,28,‘男’,‘光明顶’);
8.修改表中数据:update 表名 set 字段A=数据A,字段B=数据B… where 条件判 断语句; 如,update stu_jp001 set 年龄=18,语文=100 where 姓名=‘张无忌’;
说明:如果没有where条件,则全部修改
9.删除数据: delete from 表名 where 条件判断语句; 如,delete from stu_jp001 where 姓名=‘小米’;
10.查询全部数据: select * from 表名; 如,select * from stu_jp001;
11. 部分查询: select 字段A,字段B… from 表名; 如,select 姓名,生日,地址 from stu_jp001;
12.创建表格:creat table 表名(字段名A 数据类型及长度,字段名B 数据类型及长度… ); 如,create table stu_jp001(姓名 varchar(30),年龄 number(3),性别 char(3),
13.班级 number(4),生日 date,地址 varchar(120),语文 number(3),数学 number(3)
14.);

案例①:创建表格
姓名 年龄 男 班级 生日 地址 语文 数学
小明  16   男   1805  2000-05-07  上海  80    90小红  16   女   1805  2000-03-20  江苏  70    95小李  16   男   1805  2000-09-02  安徽  100   80小张  16   女   1805  2000-11-12  浙江  60    100 小刚 16   男  1805  2000-11-12  浙江  null  null

第一步:创建一个学生信息表
姓名 年龄 性别 班级 生日 地址 语文 数学

create table stu_jp001(姓名 varchar(30),年龄 number(3),性别 char(3),
班级 number(4),生日 date,地址 varchar(120),语文 number(3),数学 number(3)
);
desc stu_jp001; ——查询表格结构
第二步:嵌入数据

insert into stu_jp001 values(‘小明’,16,‘男’,1805,to_date(‘2000-05-07’,‘yyyy-mm-dd’),‘上海’,80,90);
insert into stu_jp001 values(‘小红’,16,‘女’,1805,to_date(‘2000-03-20’,‘yyyy-mm-dd’),‘江苏’,70,95);
insert into stu_jp001 values(‘小李’,16,‘男’,1805,to_date(‘2000-09-02’,‘yyyy-mm-dd’),‘安徽’,100,80);
insert into stu_jp001 values(‘小张’,16,‘女’,1805,to_date(‘2000-11-12’,‘yyyy-mm-dd’),‘浙江’,60,100);
insert into stu_jp001 values(‘小刚’,16,‘男’,1805,to_date(‘2000-11-12’,‘yyyy-mm-dd’),‘浙江’,null,null);

——提交:commit;

② 向“stu_jp001”表中嵌入下面部分数据

姓名 年龄 性别 地址 语文 数学
金毛狮王 45 男 冰火岛 100 100
张无忌    28  男  光明顶
 小昭      20     乾坤洞
 紫衫龙王      女  灵蛇岛
 周芷若    21  女  峨眉山

insert into stu_jp001 (姓名,年龄,语文,数学) values(‘金毛狮王’,45,100,100);
insert into stu_jp001 (姓名,年龄,性别,地址) values(‘张无忌’,28,‘女’,‘光明顶’);
insert into stu_jp001 (姓名,年龄,性别,地址) values(‘小昭’,20,‘女’,‘乾坤洞’);
insert into stu_jp001 (姓名,年龄,性别,地址) values(‘紫衫龙王’,20,‘女’,‘灵蛇洞’);
insert into stu_jp001 (姓名,年龄,性别,地址) values(‘周芷若’,21,‘女’,‘峨眉山’);

案例2:
——创建表格

Create table ZQ_001(enpno number(4),–员工编号
ename varchar(10),–员工名字
Job varchar(9),–员工职位
mgr number(4),–上级编号
Hiredate date,–入职日期
salary number(7,2),–员工月薪
bonus number(7,2),–员工奖金
depotno number(2)–部门编号
);

——查询表格结构: Desc ZQ_001;

嵌入下面14组数据:

Insert into ZQ_001 values(7369,‘SMITH’,‘CLERK’,7902,to_date(‘1980-12-17’,‘yyyy-mm-dd’),800,null,20);
insert into ZQ_001 values(7499,‘ALLEN’,‘SALESMAN’,7698,to_date(‘1981-2-20’,‘yyyy-mm-dd’),1600,800,30);
insert into ZQ_001 values(7521,‘WARD’,‘SALESMAN’,7698,to_date(‘1981-2-22’,‘yyyy-mm-dd’),1250,500,30);
insert into ZQ_001 values(7566,‘JONES’,‘MANAGER’,7839,to_date(‘1981-4-2’,‘yyyy-mm-dd’),2975,null,20);
insert into ZQ_001 values(7654,‘MARTIN’,‘SALESMAN’,7698,to_date(‘1981-9-28’,‘yyyy-mm-dd’),1250,1400,30);
insert into ZQ_001 values(7698,‘BLAKE’,‘MANAGER’,7839,to_date(‘1981-5-1’,‘yyyy-mm-dd’),2850,null,30);

insert into ZQ_001 values(7782,‘CLARK’,‘MANAGER’,7839,to_date(‘1981-6-9’,‘yyyy-mm-dd’),2450,null,10);
insert into ZQ_001 values(7788,‘SCOTT’,‘ANALYST’,7566,to_date(‘1987-4-19’,‘yyyy-mm-dd’),3000,null,20);
insert into ZQ_001 values(7839,‘KING’,‘PRESIDENT’,null,to_date(‘1981-11-17’,‘yyyy-mm-dd’),5000,null,10);
insert into ZQ_001 values(7844,‘TURNER’,‘SALESMAN’,7698,to_date(‘1981-9-8’,‘yyyy-mm-dd’),1500,0,30);
insert into ZQ_001 values(7876,‘ADAMS’,‘CLERK’,7788,to_date(‘1987-5-23’,‘yyyy-mm-dd’),1100,null,20);
insert into ZQ_001 values(700,‘JAMES’,‘CLERK’,7698,to_date(‘1980-12-3’,‘yyyy-mm-dd’),950,null,30);
insert into ZQ_001 values(7902,‘FORD’,‘ANALYST’,7566,to_date(‘1981-12-3’,‘yyyy-mm-dd’),3000,null,20);
insert into ZQ_001 values(7934,‘MILLER’,‘CLERK’,7782,to_date(‘1982-1-23’,‘yyyy-mm-dd’),1300,null,10);

——查询表格:select * from ZQ_001;
——确认:commit;

15.去空制换函数: nvl(a,b)
释义: a表示需要被判断的字段名 b表示需要被置换的值使用规则

当a不为空值null时,直接使用a的值;当a为空值null时,将null替换成b的值。

——清列员工表中所有员工的姓名、月薪、月奖和月收入
Select ename,SALARY,BONUS*12,SALARY+nvl(BONUS,0) from ZQ_001;——正确写法

Select ename,SALARY,BONUS*12,SALARY+BONUSfrom ZQ_001;——错误写法

–起别名
select ename,salary,bonus,salary+nvl(bonus,0) MONTH_SALATY from ZQ_001;

select ename,salary,bonus,salary+nvl(bonus,0) “MONTH_SALATY” from ZQ_001;

Select ename,salary,bonus,salary+nvl(bonus,0) as MONTH_SALATY from ZQ_001;

注意:起别名只是在当次查询时有效,原表格的原名字段不会改变。

16.条件查询 where
Select 字段A,字段B…from 表名 where 条件判断语句 如,select * from ZQ_001 where enpno=7788;——请列出员工表中工号“778”的员工的所有信息;
如,select ename,salary,depotno from ZQ_001 where ename=‘ALLEN’;——请列出员工"ALLEN"的姓名、月薪和部门编号 ;如,select * from ZQ_001 where salary>=3000;——请列出员工表中薪水不低于3000的员工的所有信息

–请列出员工表中所有员工的姓名和年薪(包含奖金)
select ename,(salary+nvl(bonus,0))*12 年薪 from ZQ_001;
select ename,(salary+nvl(bonus,0))*12 “年薪” from ZQ_001;
select ename,(salary+nvl(bonus,0))*12 as 年薪 from ZQ_001;
select ename,(salary+nvl(bonus,0))*12 year from ZQ_001;

 

17.条件控制关键字(一)

案例分析: a>b 并且ab 或者 a>c

OR:或者,当2个以上条件时,or表示满足“or”两边任意一个条件,即条件成立。

And:和/并且,但遇到2个以上条件时,and表示必须同时满足“and”两边条件,才算成立。

例如:请列出员工工号“7788”和“7521”的员工信息
Select * from ZQ_001 where enpno=7788 or enpno=7521;
Select * from ZQ_001 where enpno in(7788,7521);

例如:请列出员工“SMITH”“ALLEN”“WARD”的员工信息
select * from ZQ_001 where ename=‘SMITH’ or ename=‘ALLEN’ or ename=‘WARD’;
select * from ZQ_001 where ename=‘smith’ or ename=‘ALLEN’ or ename=‘WARD’;——”smith”小写错误(进可查询2条信息:“ALLEN”“WARD”)
select * from ZQ_001 where ename in(‘SMITH’, ‘ALLEN’ ,‘WARD’);

备注:①数据信息查询中要注意大小写;②条件语句中字符(字母、汉字)要加“单引号”,数字看不加。

18.条件控制关键字(二)

In:在…里,当判断的字段是同一个,且拥有多个数据值时使用

Between and :在…与…之间 ,当判断某字段的数据在某2个数据值之间,同时包含边界值时使用。

例如:–列出10号部门里薪水高于1000且低于3000的员工信息

select * from ZQ_001 where depotno=10 and salary>1000 and salary<3000;

select * from ZQ_001 where depotno=10 and not salary<=1000 and not salary>=3000;

select * from ZQ_001 where depotno=10 and salary between 1000 and 3000 and
not salary in(1000,3000);

select * from ZQ_001 where depotno=10 and salary between 1000 and 3000 and
not salary=1000 and not salary=3000;

19 . and 和 or :and 优先级高于 or
例如:where (A and B) or C 和 where C or A and B 意思是一样的

例如:select * from ZQ_001 where depotno=20 and salary>2000 or depotno=10;——请列出20号部门薪水大于2000的员工信息和10号部门员工所有信息

例如:请列出20,30号部门里薪水在1000余3000之间的员工信息(5种以上方式)
select * from ZQ_001 where depotno in(20,30) and
salary>1000 and salary<3000;–1

select * from ZQ_001 where depotno in(20,30) and
salary between 1000 and 3000 and not salary in(1000,3000);–2

select * from ZQ_001 where depotno in(20,30) and
not salary<=1000 and not salary>=3000;–3

select * from ZQ_001 where depotno in(20,30) and
not (salary<=1000 or salary>=3000);–4

select * from ZQ_001 where depotno in(20,30) and
salary between 1000 and 3000 and not salary=1000 and not salary=3000;–5

select * from ZQ_001 where depotno in(20,30) and
salary between 1000 and 3000 and not (salary=1000 or salary=3000);–6

select * from ZQ_001 where depotno=20 and salary>1000 and salary<3000
or depotno=30 and salary>1000 and salary<3000;–7

19.Is 与 null(空值):非空数据判断必须使用运算符“=”,而空值的判断职能用“is”
update ZQ_001 set bonus=null where bonus=0;——请将员工表中所有奖金为“0”的人的奖金设置为“null”
update ZQ_001 set bonus=0 where bonus is null;-——请将员工表中所有奖金为“null”的人的奖金设置为“0”

20.字符函数:解决字符串链接问题
① Concat(charA,charB) 次括号中只允许有2个参数
②“||”连接符,表示“+”
如,要求显示“某某的月薪是XX元,月奖金是XX元,职位是XX”
Select concat(concat(concat(concat(concat(concat(ename,‘的月薪是’),salary),‘元,月奖金是’),nvl(bonus,0)),‘元,职位是’),job) from ZQ_001;

select ename ||‘的月薪是’|| salary || ‘元,月奖金是’ || nvl(bonus,0) || ‘元,职位是’ || job from ZQ_001;

21.取反查询 not :写在判断字段之前(判断空值null是可以将“not”写在“is”后面)
如,select * from ZQ_001 where not job=‘MANAGER’;——请列出员工表中职位不是“MANAGER”的员工信息

22.Upper(char)/ lower(char)/ initcap(char)函数 :转换英文字母大小写
Upper:将字母转换为大写形式;lower:将字母转换为小写形式;intcap:将字符串中每个单词首字母转换为大写,其余为小写,之间用空格或字母表示。
如,select upper(‘hello world’) from dual;——HELLO WORLD
select initcap(‘hello world’) from dual;——Hello World
select initcap(‘HELLO WORLD’) from dual;——Hello World
如,select * from ZQ_001 where ename=‘SMITH’; select * from ZQ_001 where lower(ename)=‘smith’; —-请列出员工“SMITH”的所有信息

23.模糊匹配查询:like(像、类似)
“ _”:表示占有一个位置的字符,有且仅有一个;”%”:表示占有多个位置的字符(0~无穷)

select * from ZQ_001 where ename like ‘A%’ and ename like '%E’; 或 select * from ZQ_001 where ename like ‘A%E’ or ename like ‘EA’; ——列出员工表中姓名第二个字母为大写A,且倒数第二个位大写E

24.排序查询:order by(永远写在末尾) 格式: select * from 表名 order by 排序的字段名(Oracle 数据库中,null默认最大值)

如,select ename,salary from ZQ_001 order by salary; ——排序查询:对员工薪水进行排序,显示员工姓名和薪水(升序)
如,select ename,bonus from ZQ_001 order by bonus;——-对员工奖金排序,显示姓名和奖金
如,select ename,hiredate from ZQ_001 order by hiredate;——对员工入职日期排序,显示姓名和入职日期
如,select ename,bonus from ZQ_001 where not bonus=0 and bonus is not null
order by bonus;——请列出员工表中没有奖金的员工姓名和奖金,按姓名排序显示

25.降序查询:desc 格式:select * from 表名 order by 字段名 desc;
如,select ename,salary from ZQ_001 order by salary desc,ename desc;——对员工表中的薪水进行降序排序,若薪水相同,则按姓名降序排序,显示员工姓名和薪水

注意:①ASC与DESC:排序默认为升序排列(系统默认设置值为ASC),ASC表示升序,DESC表示降序;②当多个字段为排序依据时,首先按第一个字段排序,然后再按照第二个字段排序,以此类推,每个字段都需单独设置排序方式。

 

 

27.空值函数:nul2(A,B,C) 功能与nvl()函数类似,但不一样
使用方法:首先判断A是否为空值null:若A值为null,则取C值;若A值不为Null值,则取B值。

如,select ename,nvl2(bonus,bonus,100) from ZQ_001;——请列出员工表中所有员工的姓名和奖金,奖金为空的值额外发放100元补助
1
28.置换函数replace(A,B,C)
首先判断A的值是否为B:条件成立,则替换成C的值;条件不成立,则不变。
如,select ename,replace(bonus,0,null) from ZQ_001;
select ename,nvl2(bonus,bonus,100) from ZQ_001;——请列出员工表中所有员工的姓名和奖金,没有奖金的员工额外发放100元补助(包括0和null)

29.聚合函数:5大常用
Max() 最大值函数; min() 最小值函数; avg() 平均值函数; sum() 求和函数; count() 计数函数;

如,请列出员工表中拿最高薪水的员工姓名和他本人的薪水(思考题)
select max(salary) from ZQ_001;——-第一步:列出最高薪水
select ename,salary from ZQ_001 order by salary desc; ——依据最高薪水,列出姓名和对应薪水
如,select avg(salary) from ZQ_001;——请列出所有员工表中所有员工的平均薪水
如,select sum(salary) from ZQ_001;——请列出员工表中全部员工的薪水总和
如,select count(‘job’)from ZQ_001; select count(ename) from ZQ_001;
select count(mgr) from ZQ_001;–错误,有空值null
select count(salary) from ZQ_001;
如,select ename,salary,depotno from ZQ_001 where salary>(select avg(salary) from ZQ_001);——请列出员工表中薪水高于平均薪水的员工姓名,薪水和部门编号

注释:对于计数函数count()内的参数可以使用表中任意一个字段名,其提示该字段名zing没有空值null;标准写法:select count(*) from 表名;

30.条件查询符合:“>” “<” “<=” “>=” “!=” “<>”
注释:“!=”,“<>”都表示“不等于”
如,select * from ZQ_001 where not depotno=10; select * from ZQ_001 where depotno!=10;
select * from ZQ_001 where depotno<>10; ——列出员工部门不是10号部门的员工信息(多种方式)

31.去重关键字:distinct
修饰词,直接写在字段名前,删除重复的数据值,只保留一个

如,请列出员工表中经理有哪些,显示其排名(排除老板)
select mgr from ZQ_001;–列出所有的上级编号
select ename from ZQ_001 where enpno in(select mgr from ZQ_001);–依据上级编号列出姓名
select ename from ZQ_001 where enpno in(select mgr from ZQ_001) and mgr is not null;–排除老板 —— 01

select ename from ZQ_001 where enpno in(select distinct mgr from ZQ_001) and mgr is not null;——02

32.分组查询: group by 格式:select 分组字段名,聚合函数(字段名) from 表名
Group by 分组字段名
-如,请列出员工表中各部门薪水最高的员工部门号和最高薪水(并按部门号升序排序)
select depotno,max(salary) from ZQ_001 group by depotno order by depotno asc;

思考题(一)
请安经理号分组和列出每组下属的最高薪水,列出经理号和对应的最高薪水
第一步:所有经理下属的最高薪水 < 方式一>
select max(salary) from ZQ_001 where not mgr
in(select enpno from ZQ_001 where mgr is null) group by mgr;
–对应的经理号和经理手下最高薪水员工
select mgr,salary from ZQ_001 where salary in(
select max(salary) from ZQ_001 where not mgr
in(select enpno from ZQ_001 where mgr is null) group by mgr);

所有经理的编号 <方式二>
select enpno from ZQ_001 where enpno
in(select distinct mgr from ZQ_001 ) and mgr is not null;
–对应的经理号和经理手下最高薪水员工
select max(salary),mgr from ZQ_001 where mgr in(
select enpno from ZQ_001 where enpno in(
select distinct mgr from ZQ_001) and mgr is not null) group by mgr;

–思考题(二)
–按经理号分组列出其下属中的最高薪水,需列出姓名,经理号和对应的最高薪水
select ename,mgr,salary from ZQ_001 where salary in(selectmax(salary) from ZQ_001
where not mgr in(select enpno from ZQ_001 where mgr is null) group by mgr
);

注释:嵌入条件查询时,条件类型(或者说字段名)必须与嵌入类型对应并且是单一的(程序报错为:值过多) 如,select ename,enpno,salary from ZQ_001 where depotno=30 and bonus is not null ;——正确

select job,ename,enpno from ZQ_001 where salary in(
select salary,mgr from ZQ_001 where depotno=30 and bonus is not null
);——错误表达

33.Trim ltrim rtrim 函数 :这三个函数都是用于截取字串符
格式:
Trim(c2 from c1) 表示c1的前后截取c2 如,select trim (‘e’ from ‘elite’) from dual;–lit
Ltrim(c1 ,c2) 表示c1的左边截取c2 如,select ltrim (‘elite’,‘e’) from dual;–lite
Rtrim(c1 ,c2) 表示c1的右边截取c2 如,select rtrim (‘elite’,‘e’) from dual;–elit

34.补位函数lpad rpad
格式:
Lpad(char1,n,char2) 左补位函数; rpad(char1,n,char2) 右补位函数
注释:在字符串参数char1的左端/右端,用char2进行补位”n”位,其中char2可以多次出现

如,select lpad(salary,6,’$’) from ZQ_001;—— $KaTeX parse error: Can't use function '$' in math mode at position 27: …rpad(salary,8,'$̲') from ZQ_001;…$$$

35.截取字符串 substr
格式:select substr(char,m,n) from 表名
注释:当m=0时,则从首字符开始,如果是负数则从尾部开始;如果没有设置”n”或“n”长度度超过了char的长度,则取到末尾为止(“m”表示起始位置,“n”表示结束位置)
如,select substr(‘Doctor Who Travels in TRDIS’,8,18) from dual;–Who Travels in TRD
select substr(‘Doctor Who Travels in TRDIS’,0,18) from dual;–Doctor Who Travels
select substr(‘Doctor Who Travels in TRDIS’,8) from dual;–Who Travels in TRDIS
select substr(‘Doctor Who Travels in TRDIS’,-7,7) from dual;–n TRDIS
注释:空格也表示一个字符

36.数值函数:常见五中(round trunc mod ceil floors)

1) Round() : 用于“四舍五入” 格式:round(n,m) “n”数字(或字段名),“m”小数位数
如,select round(35.78903,2) from dual; --35.79
select round(35.78903,0) from dual; --36
select round(35.78903,-1) from dual; --40
select round(salary,-2) from ZQ_001; --800 1600 1300 3000

2)功能截取 trunc(n,m)
如,select trunc(35.78903,2) from dual; – 35.78
select trunc(35.78903,0) from dual; – 35
select trunc(35.78903,-1) from dual; – 30
3)取模(余)函数 mod(n,m)
如,select ename,salary,mod(salary,1000) from ZQ_001; --800 600 250 975
注释:作用,返回”m “除以”n”后的余数,如果“n”位数字“0”则直接返回“m”

4)Ceil(n) “天花板” ,大余或等于“n”的最小整数值
Floor(n) “地板” ,去小于或等于“n”的最大整数值
如,select ceil(salary) from ZQ_001; --800 1600 1250 2975
select ceil(9.4567) from dual; --10
select floor(9.4567) from dual; --9

37.日期操作关键字 :
1)获取“系统时间”
如,select to_char(sysdate,‘yyyy-mm-dd day hh24:mi:ss’) as 当前系统时间 from dual;
2)精确到毫秒
如,select to_char(systimestamp,‘yyyy-mm-dd day hh24:mi:ss.ff’) as 当前系统时间 from dual;
3)Add_months(date,i) 返回日期“date(日期字段名)”加上“i”个月后的日期
如.列出员工表中所有员工入职20周年的纪念日,显示员工姓名和纪念日
select ename,add_months(hiredate,1220)“20周年纪念日” from ZQ_001; ①
select ename 姓名,add_months(hiredate,1220) as “20周年纪念日” from ZQ_001; ②

 

38 约束
1)非空约束not null
如,create table Test_01 (id number(2) not null,name varchar(20),age number(2)
);
insert into Test_01(name,age)values(‘jack’,20); 因id受限,Jack数据无法嵌入表
insert into Test_01(name,id) values(‘rows’,02);
注释:用于确保数据表中某个或某几个字段没有空值
2)check 约束
如,create table Test_02 (姓名 varchar(20) ,性别 char(3) check(性别 in(‘男’,‘女’)),年龄 number(2)
);
insert into Test_02(姓名,性别) values(‘jack’,‘男’);
insert into Test_02(姓名,性别) values(‘rows’,‘妖’); --受限
注释:在表的字段中增加额外的检查约束

39 添加加默认值
1)default
如,create table Test_03(姓名 varchar(20) ,年龄 number(2),语文 number(3) default 100
);
insert into Test_03(姓名,语文) values(‘jack’,60);
insert into Test_03(姓名,年龄) values(‘rows’,20); --成绩默认100
注释:在建表示某字段后添加default,那么该字段就会用有一个默认值,向表中添加数据记录时,若该字段没有导入数据,则系统默认添加默认值
2)having
注释:功能类似where,但有很多差异。①Having 子句多用于判断或筛选聚合函数②having 子句一般跟在group by 分组后面
如,
–列出员工表中各部门平均薪水高于2000的部门编号和对应的平均薪水
select depotno,avg(salary) from ZQ_001 group by depotno having avg(salary)>2000 ;

–列出30号部门的平均薪水
select avg(salary) from ZQ_001 where depotno=30;

–列出部门里最低薪水的员工的部门编号和最低薪水,且部门编号不能为空
select depotno,min(salary) from ZQ_001 group by depotno
having depotno is not null;
select depotno,min(salary) from ZQ_001
where depotno is not null group by depotno;

注释:①where 通常用于比较原表格中字段内的实际数据
②having 通常比较组合后的新数据
③不可以用where判断聚合函数,但是如有分组可以使用having判断表中字段内的实际数据
④为了提高SQL语句的查询效率,对于字段的判断,一般先判断再分组列出

40.关联查询:实际应用中所需数据经常会出现在2个或2个以上的表内,使用关联
查询来实现
格式一:select tableA.字段, tableB.字段 from tableA,tableB where tableA.depotno=tableB.depotno; “depotno”外键

格式二:select tableA.字段,tableB.字段 from tableA join tableB on
1
(tableA.depotno=tableB.depotno);

如,结合员工表和部门表列出所有员工的姓名,职位和部门所在地
select e.ename,e.job,d.loc from ZQ_001 e,dept_ZQ002 d ----- ①
where e.depotno=d.depotno; —“e”"d"分别代表员工表和部门表“别名”

select e.ename,e.job,d.loc from ZQ_001 e join dept_ZQ002 d ----②
on (e.depotno=d.depotno);

41.笛卡尔现象
如,select e.ename,e.job,d.loc from ZQ_001 e,dept_ZQ002 d —共56条数据(42条重复)
1)等值连接查询:又称为“内连接查询”
“内连接”查询:即返回连个关联表中所有“满足”连接条件的记录
“外链接”查询:即返回连个关联表中所有“满足”连接条件的记录时,还返回连个关联表中“不满足连接条件的记录”

注释:“外连接”查询分为:“左外连接”“右外连接”“全外连接”
inner join
左外连接:以“左表”为驱动表,“左表”中不满足连接条件的记录会被列出
select e.ename,d.dname from ZQ_001 e left join dept_ZQ002 d
on(e.depotno=d.depotno); ----16条记录

-右外连接:以“右表”为驱动表,“右表”中不满足连接条件的记录会被列出
select e.ename,d.dname from ZQ_001 e right join dept_ZQ002 d
on(e.depotno=d.depotno); -----15条记录

全外连接:返回满足连接条件的记录,也返回不满足连接条件的记录
1
select e.ename,d.dname from ZQ_001 e full outer join dept_ZQ002 d
on(e.depotno=d.depotno); -----17条数据记录

42.Exists : 存在的意思
格式:select * from T1 where exists(select 字段 from T2
Where T1 字段=T2 字段);
如,列出哪些有员工的部门的部门编号,部门名称和部门所在地
select * from dept_ZQ002 d where exists(select * from ZQ_001 e
where d.depotno=e.depotno);

案例1:列出各部门里最低薪水高于30号部门 最低薪水的部门信息,显示部门号和最低薪水

select min(salary) from ZQ_001 group by depotno; --第一步:各部门最低薪水

select min(salary) from ZQ_001 where depotno=30; – 第二步:部门最低薪水
select depotno,min(salary) from ZQ_001 group by depotno having min(salary)>(select min(salary) from ZQ_001 where depotno=30);

案例2:列出薪水比本部门平均薪水高的员工信息
分析:
第一步:各部门平均薪水:select depotno,avg(salary) avg_salary from ZQ_001 group by depotno
第二步:本部门平均薪水比较判断
where e.depotno=x.depotno and e.salary>x.avg_salary;

select * from ZQ_001 e ,
(select depotno,avg(salary) avg_salary from ZQ_001 group by depotno) x
where e.depotno=x.depotno and e.salary>x.avg_salary;

补充:数据填充:把原数据表A中的记录全部填充到另一张没有记录的相同字段(同表结构)表B中
格式:insert into 表B select * from 表A;s

补充:设置sqlplus显示格式
1
show linesize;显示一行的宽度 80(默认值)
set linesize 宽度;设置一行的字符宽度(临时有效)
3.清屏:clear screen;(Windows cmd清屏:cls)
4.部分转存:
格式:insert all
when 条件 then
into 表名1(列名1,列名2…) values(列名1,列名2…)
select 列名1,列名2… from 表名2;
如:insert all
when sal>1000 then
into test1(empno,sal,mgr) values(empno,sal,mgr)
select empno,sal,mgr from emp;

 

posted @ 2020-06-02 14:22  红尘沙漏  阅读(265)  评论(0编辑  收藏  举报