ORACLE知识 OracleSQLC#C++C
程序员文章站
2024-02-05 16:28:40
...
环境变量
ORACLE_SID
sqlplus 客户端
user_name:amdin
password:admin
sqlplus command:
desc/describe --
--buffer sql 语句
list
edit --vi 编辑器来修改 sql 语句
clear screen--清屏
set pause on --可实现分屏显示
set pause off --取消分屏显示
set pause “Please enter Enter Key”--增加提示信息
col{umn}---定义选择的宽度,格式等。
sql 语句:
select first_name,salary from s_emp;
运行:;回车
当上一天语句没有以;结束,既未运行。可用/运行。
例:
SQL> select first_name
2 form e_emp
SQL>/-----此时可运行最后执行的那个 sql 语句
select 语句可用+ - * /
要防止空值,所以要使用空值转换
NVL(start_date,'01-JAN-95')
NVL(title, 'No Title Yet')
NVL(salary,1000);
例算年薪
SQL>select first_name,salary*12*(1+nvl(commission_pct,0)/100) from s_emp;
给列取别名:
select first_name,salary*12 “annual salary”from s_emp;
|| 拼接字符
取别名时用双引号,拼字符时用单引号
select first_name||''||last_name
拼接可自动生成一些 sql 脚本。
Select 'select * from'||table_name from user_tabels;
Distinct --排序功能,联合唯一?
Order By 字段名(别名,字段位置) DESC(降序)
where 子句 跟条件表达式。
比较运算符 = > >= < <=
字符串单引 字符串大小写敏感
注意:数据类型,逻辑关系,where 子句的关系。
Between and 是一个闭区间 [ ]
IN 后跟集合,相当于 or 的意思 =any
where (dept_id=41 or dept_id=42) and salary>1000
Like 通配符 %0或多个符 _任意一个字符
转义字符\
select table_name from user_tables where table_name like 'S\_%' escape '\';
IS NULL 判断一个字段为空
single Row Functions
字符函数:LOWER(‘SQL COURTSE’)转小
UPPER
INITCAP
CONCAT('GOOD','String') GoodString;
SUBSTR('String',1,3) Str
LENGTH('String') 6
数值函数:ROUND 四舍五入
TRUNC 截取
multiple row functions
日期处理:Century year,month,day,hours,minutes,seconds
default date display is DD-MON-RR
alter session set nls_date_format='yyyy mm dd hh24:mi:ss';设置 oracle 时间格式
十分钟之后的时间
select sysdate+1/144 from dual;
日期函数:
MONTHS_BETWEEN(日期一,日期二)
ADD_MONTHS(日期,加的天数)
NEXT_DAY(日期,星期)例:next_day(‘’,‘friday');
LAST_DAY(日期)
ROUND(显示的日期,按年或月截取)什么都无就截掉时分秒
TRUNC (显示的日期,按年或月截取)
将日期转成字符 fmt—转换的格式 YEAR DAY,MM,HH24:MI:SS
TO_CHAR(DATE,'fmt')
AM
ddspth DD “of” MONTH
select to_char(start_date,'YEAR') from s_emp
将字符转为日期
TO_DATE('','fmt')
insert into test values(to_date('2009 01 10 20:29:40','yyyy mm hh24:mi:ss')
日期是格式敏感的 那么 钱呢? 货币?
千年虫 RR 格式在跨世纪时将不会出现问题。YY 就会出现问题!
Y2K
字符和数字的转换: 格式有:9,0,$ L . ,
to_char(number,'fmt')
TO_NUMBER('字符',格式)
业务需求要变成 sql 语句
Oracle
vi 关键命令
a 下一字符编辑
i 插入
o 换行输入
左,下,上,右
h,j,k,l
r 替换
d 删除,dd 删除一行
u 撤消
:wq 保存退出
执行脚本:sqlplus asd0811/asd0811 @demobld.sql
Join
内连接:严格匹配
等值连接:
表里数据要对应能找到
select e.ename,s.grade from emp e,salgrade s where e.salary between s.hightsal and
s.lowsal
自连接:select e.first_name “Employee”,m.first_name “Manager”
from s_emp e,s_emp m
where e.manager_id(+)=m.id
外连接:一个也不能少 (+)
连接要注意表结构和表关系,很重要!
Group Functions 多行函数 所有组函数处理的都是非空值
AVG(DISTINCT|ALL|n)
COUNT(DISTINCT|ALL|expt|*)
MAX(DISTINCT|ALL|expr)
MIN(DISTINCT|ALL|expr)
SUM(DISTINCT|ALL|expr)
处理非空值
COUNT(dept_id)
COUNT(distinct dept_id) 处理非空的且排除重复的
group by 字段 按字段分组 字段越多分的粒度越细,结果集越少!
有了 Group by 子句 select 后跟字段与 group by 后字段一样
<>不等
过滤方式
having
与 where 区别。where 过滤的是一行一行的记录。单行函数
having 过滤的是分组后的结果。组函数
group by 与 having 有严格顺序
子查询:select last_name,title from s_emp where title = (select title from s_emp
where last_name='Smith')
and last_name<>'Smith'
查询平均公资大于部门号是 32 号的部门
select dept_id,avg(salary) from s_emp group by dept_id
having avg(salary) > (select avg(salary) from s_emp where dept_id=32)
select table_name from user_tables;查看有多少表
distinct 排重
数字+ - * / 字符 拼接 ||
% 任 0 个或多个 _任一个
转义字符 \
order by 默认是升序 desc 表降序
后跟字段。或字段的序号 order by 2 表选择的第二个字段
select e.first-aname,m.first_name from s_emp e left outer join s_emp m on
e.manager=m.id;
left outer join; full outer join right outer join;inner join
组函数忽略空值,但不排重!
数据库的设计
懂业务,懂技术,B/S,C/S 设计。
Design E-R 实体关系图--->表(sql 脚本)---->存数据库
通过流程帮助客户提出需求。
Build and Document
Database Design
Performance 性能 Integrated application 集成 Intergration with other system
选型
。。。
Entity 实体 一个抽象的概念
Examples: customers,sales
属性 描述实体
Attribute
Relationship 关系
Examples: orders and items,customers and sales
表名大写,属性小写。 Unique Identifier # 表不能重复 唯一 Mandatory marked with *
必需要有。非空
Primary marked with #
可有可无,
Opitonal marked with o
虚线表 may be 实线表 must be
one to one one to many many to many
范示:
第一范示(first normal form):all attributes must be single-valued 每一个属性只
有一个值 会有数据冗余
第二范示(second normal form):an attribute must depend upon its entity's entire
UID 在第一范示基础上增加了一个主属性标识。会有数据冗余。非主属性不完全依懒于主
属性,非主属性与非主属性之间存在依懒关系。
第三范示(three normal form):No mon-UID attribute can be dependent upon another
non-UID attribute 在第二范示基础上,非主属性严格依懒于主属性
看需求来确定使用何种范示
完整性约束
primary key ,unique key ,foreign key
主键约束---唯一且非空。用来标识一条记录。一张表只能有一个主键。
联合主键 composite primary key
外键---foreign key 唯一可非空。外键是主键一部分时,不能为空。If an FK is
part of a PK,then it cannot be NULL.
唯一性约束,非空约束,检查性约束。
PK,UK,FK,CK,NN
用户自定义约束 触发器
数据库设计步骤:
约定命名习惯
设计索引 design the indexes
定义视图 establish view definitions
数据空间存储 plan the physical storage space
定义约束 redefine integrity constraints
E-R 图转换成数据表:
Map Entities to Tables table
Map the attributes to Columns
Map Unique Identifiers to Primary Keys
Map Relationships to Foreign Keys
TABLE
create table
datatype: varchar2 char,number,
char 定长,varchar2 变长。
没有指定数字宽度 number(4,2) 4 表示有效位数,3 表示多少位小数(四舍五入)。
Insert into test(c2) values (123)---错误。超出了有效位。
字符串用单引号引起 空用 NULL,
CLOB---Character date up to 4GB
BLOB—Binary data up to 4GB
DATE
dual is a dummy table used to view sysdate.
Default date display is DD-MON-RR
YYYY YEAR MM MONTH DY DAY
函数:
to_date
to_char
select first_name,to_char(start_date) from s_emp where to_char(start_date,'MM'))='03'
to_char(start_date,'fmmm')=
'3'
RR 时间保证跨世纪: 0-49 50-99
当前
0-49 Before
当前
50-99 After
has an fm element to remove padded blanks or suppress leading zeros 前导零
select to_char(trunc(last_day(sysdate)+1),'yyyy-mm-dd hh24:mi:ss') from dual; 下个月的
第一天。
INDEX 索引
每条记录的地址
创建 1:自动创建 define a PRIMARY KEY or UNIQUE constraint
创建 2:手工创建 create non-unique indexes
CREATE INDEX test_ind_name ON test(name);
user_indexes 系统索引表 user_ind_columns 约束索引字段表
适合建索引的情况:字段列常用作查询,字段列值范围广,大量的空值,有时要使用联合
索引,并非越多索引效率越好。
不适合建情况:表太小,字段列不常用作查询条件,常更新
UNIQUE 唯一性索引
Non-unique 非唯一性索引,加快查询速度
单值索引
Single column
多值索引
Concatenated or composite
DROP INDEX 删除索引
视图:CREATE VIEW myview AS SELECT * FROM test WHERE id<10;
视图不占空间, 可简化查询操作。
CREATE OR REPLACE VIEW empinfo(id,enam,rname) AS SELECT e.id,e.first_name,r.name
FROM s_emp e,s_region r WHERE ....; 创建或替换
视图里是聚合信息时不能插入单个细节记录。
基表不存在也可以创建视图用 CREATE FORCE VIEW myview 默认是 NOFORCE。
CREATE OR REPLACE VIEW myview AS SELECT ...FROM WHERE .
WITH CHECK OPTION CONSTRAINT emp_ck. 视图添加约束。约束为 WHERE 条件。 符号 V
WITH READ ONLY 只读视图。O
字查询里不能用 ORDAR BY。
Inline view 内联视图
哪些员工的工资比本部门的平均工资高?
SELECT first_name,salary,avg
2 FROM s_emp,(SELECT dept_id,avg(salary) avg
3 FROM s_emp
4 GROUP BY dept_id) a
5 WHERE s_emp.dept_id=a.dept_id
6* AND salary>avg
rownum 记录的位置,必须等于 1 或<=一个数
工资排名前五名
1 SELECT first_name,salary
2 FROM (SELECT rownum,first_name,salary
3 FROM s_emp
4 ORDER BY salary DESC) a
5* WHERE rownum<=5
分页显示
SELECT r,a.*
FROM (SELECT rownum r,aa.*
FROM (SELECT *
FROM s_emp) aa
)a
WHERE r BETWEEN 1 AND 10
例 2:
SELECT r,first_name,salary
FROM ( SELECT rownum r,first_name,salary
FROM ( SELECT first_name,salary
FROM s_emp
ORDER BY salary DESC
)
WHERE rownum<=20
)
WHERE r BETWEEN 16 AND 20
排名相同的情况
去除掉重复后的排名,有两个 3 名就无第四名。
rank() over
dense_rank() over() 按顺序排名 有两个 3 名。第五名就将成为第四名
SELECT dense_rank() over(ORDER BY salary DESC) r,first_name,salary FROM s_emp;
limit
关联子查询:
who earn more than the average salary in their department 思路:将部门号传给子查
询取到部门的平均值。
SELECT last_name,salary,dept_id
2 FROM s_emp outer
3 WHERE salary > (SELECT AVG(salary)
4 FROM s_emp
5 WHERE dept_id=outer.dept_id)
6 ;
子查询是否存在。存在为真,不存在为假。
EXISTS
不存在为真,存在为假。
NOT EXISTS
SELECT first_name
2 FROM s_emp outer
3 WHERE EXISTS (
4 SELECT manager_id/常量。
5 FROM s_emp inner
6 WHERE outer.id=inner.manager_id);
chooes all courses
SELECT name FROM students s WHERE NOT EXISTS (SELECT 'x' FROM courses c WHERE
NOT EXISTS (SELECT 'x' FROM stu_cou sc WHERE s.id=sc.sid AND c.id=sc.cid) )
1 查询 zhaojun 同学有哪些课程没有选择
2 查询哪些同学 选择了 zhaojun 同学选的课程
3 查询哪些同学选择了和 zhaojun 同学相同的课程
1 查询 zhaojun 同学有哪些课程没有选择
SELECT name
FROM course c
WHERE NOT EXISTS (SELECT 1
FROM stu_course sc,student s
WHERE sc.s_id=s.sid AND s.name='zhaojun' AND sc.c_id=c.cid);
2 查询哪些同学(name) 选择了 zhaojun 同学选的课程
SELECT DISTINCT s_id
FROM stu_course outer
WHERE c_id IN (SELECT c_id
FROM stu_course sc WHERE sc.s_id=2)
SELECT DISTINCT s_id
FROM stu_course outer
WHERE EXISTS (SELECT 1
FROM stu_course sc WHERE sc.s_id=2 AND outer.c_id=sc.c_id);
3 查询哪些同学选择了和 zhaojun 同学相同的课程
SELECT s_id
FROM stu_course a
WHERE NOT EXISTS(SELECT DISTINCT s_id
FROM stu_course outer
WHERE NOT EXISTS (SELECT 1
FROM stu_course sc WHERE sc.s_id=2 AND
outer.c_id=sc.c_id) AND a.c_id=sc.c_id));
4 查询哪些同学选的课程不合 zhaojun 一样。
SELECT DISTINCT s_id
FROM stu_course outer
WHERE NOT EXISTS (SELECT 1
FROM stu_course sc WHERE sc.s_id=2 AND outer.c_id=sc.c_id);
也可以用 NOT IN
SELECT DISTINCT s_id
FROM stu_course outer
WHERE c_id NOT (SELECT c_id
FROM stu_course sc WHERE sc.s_id=2)
但此时如果有 zhaojun 同学一门课也没选,空记录将查不到
UNION 排重/UNION ALL 不排重。 联合 联合类型要一致。
交集。
INTERSECT
集合相减。
MINUS
ALTER 修改表结构。
ALTER TABLE ADD column 增加一个字段
ALTER TABLE test DROP 字段
修改字段名;
ALTER TABLE test RENAME COLUMN
。。MODIFY (title varchar2(50)) 修改字段类型
ALTER TABLE
ALTER TABLE s_emp ADD CONSTRAINT s_emp_manager_id_fk
增加约束
FOREIGN KEY (manager_id) REFERENCES s_emp(id)
ALTER TABLE s_emp DROP CONSTRAINT s_emp_manager_id_fk; 删除约束
级联删除主键。
ALTER TABLE s_dept DROP PRIMARY KEY CASCADE;
使约束失效
ALTER TABLE s_emp DISABLE CONSTRAINT s_emp_id_pk CASCADE
使约束恢复有效
ALTER TABLE s_emp ENABLE CONSTRAINT s_emp_id_pk;
ORACLE_SID
sqlplus 客户端
user_name:amdin
password:admin
sqlplus command:
desc/describe --
--buffer sql 语句
list
edit --vi 编辑器来修改 sql 语句
clear screen--清屏
set pause on --可实现分屏显示
set pause off --取消分屏显示
set pause “Please enter Enter Key”--增加提示信息
col{umn}---定义选择的宽度,格式等。
sql 语句:
select first_name,salary from s_emp;
运行:;回车
当上一天语句没有以;结束,既未运行。可用/运行。
例:
SQL> select first_name
2 form e_emp
SQL>/-----此时可运行最后执行的那个 sql 语句
select 语句可用+ - * /
要防止空值,所以要使用空值转换
NVL(start_date,'01-JAN-95')
NVL(title, 'No Title Yet')
NVL(salary,1000);
例算年薪
SQL>select first_name,salary*12*(1+nvl(commission_pct,0)/100) from s_emp;
给列取别名:
select first_name,salary*12 “annual salary”from s_emp;
|| 拼接字符
取别名时用双引号,拼字符时用单引号
select first_name||''||last_name
拼接可自动生成一些 sql 脚本。
Select 'select * from'||table_name from user_tabels;
Distinct --排序功能,联合唯一?
Order By 字段名(别名,字段位置) DESC(降序)
where 子句 跟条件表达式。
比较运算符 = > >= < <=
字符串单引 字符串大小写敏感
注意:数据类型,逻辑关系,where 子句的关系。
Between and 是一个闭区间 [ ]
IN 后跟集合,相当于 or 的意思 =any
where (dept_id=41 or dept_id=42) and salary>1000
Like 通配符 %0或多个符 _任意一个字符
转义字符\
select table_name from user_tables where table_name like 'S\_%' escape '\';
IS NULL 判断一个字段为空
single Row Functions
字符函数:LOWER(‘SQL COURTSE’)转小
UPPER
INITCAP
CONCAT('GOOD','String') GoodString;
SUBSTR('String',1,3) Str
LENGTH('String') 6
数值函数:ROUND 四舍五入
TRUNC 截取
multiple row functions
日期处理:Century year,month,day,hours,minutes,seconds
default date display is DD-MON-RR
alter session set nls_date_format='yyyy mm dd hh24:mi:ss';设置 oracle 时间格式
十分钟之后的时间
select sysdate+1/144 from dual;
日期函数:
MONTHS_BETWEEN(日期一,日期二)
ADD_MONTHS(日期,加的天数)
NEXT_DAY(日期,星期)例:next_day(‘’,‘friday');
LAST_DAY(日期)
ROUND(显示的日期,按年或月截取)什么都无就截掉时分秒
TRUNC (显示的日期,按年或月截取)
将日期转成字符 fmt—转换的格式 YEAR DAY,MM,HH24:MI:SS
TO_CHAR(DATE,'fmt')
AM
ddspth DD “of” MONTH
select to_char(start_date,'YEAR') from s_emp
将字符转为日期
TO_DATE('','fmt')
insert into test values(to_date('2009 01 10 20:29:40','yyyy mm hh24:mi:ss')
日期是格式敏感的 那么 钱呢? 货币?
千年虫 RR 格式在跨世纪时将不会出现问题。YY 就会出现问题!
Y2K
字符和数字的转换: 格式有:9,0,$ L . ,
to_char(number,'fmt')
TO_NUMBER('字符',格式)
业务需求要变成 sql 语句
Oracle
vi 关键命令
a 下一字符编辑
i 插入
o 换行输入
左,下,上,右
h,j,k,l
r 替换
d 删除,dd 删除一行
u 撤消
:wq 保存退出
执行脚本:sqlplus asd0811/asd0811 @demobld.sql
Join
内连接:严格匹配
等值连接:
表里数据要对应能找到
select e.ename,s.grade from emp e,salgrade s where e.salary between s.hightsal and
s.lowsal
自连接:select e.first_name “Employee”,m.first_name “Manager”
from s_emp e,s_emp m
where e.manager_id(+)=m.id
外连接:一个也不能少 (+)
连接要注意表结构和表关系,很重要!
Group Functions 多行函数 所有组函数处理的都是非空值
AVG(DISTINCT|ALL|n)
COUNT(DISTINCT|ALL|expt|*)
MAX(DISTINCT|ALL|expr)
MIN(DISTINCT|ALL|expr)
SUM(DISTINCT|ALL|expr)
处理非空值
COUNT(dept_id)
COUNT(distinct dept_id) 处理非空的且排除重复的
group by 字段 按字段分组 字段越多分的粒度越细,结果集越少!
有了 Group by 子句 select 后跟字段与 group by 后字段一样
<>不等
过滤方式
having
与 where 区别。where 过滤的是一行一行的记录。单行函数
having 过滤的是分组后的结果。组函数
group by 与 having 有严格顺序
子查询:select last_name,title from s_emp where title = (select title from s_emp
where last_name='Smith')
and last_name<>'Smith'
查询平均公资大于部门号是 32 号的部门
select dept_id,avg(salary) from s_emp group by dept_id
having avg(salary) > (select avg(salary) from s_emp where dept_id=32)
select table_name from user_tables;查看有多少表
distinct 排重
数字+ - * / 字符 拼接 ||
% 任 0 个或多个 _任一个
转义字符 \
order by 默认是升序 desc 表降序
后跟字段。或字段的序号 order by 2 表选择的第二个字段
select e.first-aname,m.first_name from s_emp e left outer join s_emp m on
e.manager=m.id;
left outer join; full outer join right outer join;inner join
组函数忽略空值,但不排重!
数据库的设计
懂业务,懂技术,B/S,C/S 设计。
Design E-R 实体关系图--->表(sql 脚本)---->存数据库
通过流程帮助客户提出需求。
Build and Document
Database Design
Performance 性能 Integrated application 集成 Intergration with other system
选型
。。。
Entity 实体 一个抽象的概念
Examples: customers,sales
属性 描述实体
Attribute
Relationship 关系
Examples: orders and items,customers and sales
表名大写,属性小写。 Unique Identifier # 表不能重复 唯一 Mandatory marked with *
必需要有。非空
Primary marked with #
可有可无,
Opitonal marked with o
虚线表 may be 实线表 must be
one to one one to many many to many
范示:
第一范示(first normal form):all attributes must be single-valued 每一个属性只
有一个值 会有数据冗余
第二范示(second normal form):an attribute must depend upon its entity's entire
UID 在第一范示基础上增加了一个主属性标识。会有数据冗余。非主属性不完全依懒于主
属性,非主属性与非主属性之间存在依懒关系。
第三范示(three normal form):No mon-UID attribute can be dependent upon another
non-UID attribute 在第二范示基础上,非主属性严格依懒于主属性
看需求来确定使用何种范示
完整性约束
primary key ,unique key ,foreign key
主键约束---唯一且非空。用来标识一条记录。一张表只能有一个主键。
联合主键 composite primary key
外键---foreign key 唯一可非空。外键是主键一部分时,不能为空。If an FK is
part of a PK,then it cannot be NULL.
唯一性约束,非空约束,检查性约束。
PK,UK,FK,CK,NN
用户自定义约束 触发器
数据库设计步骤:
约定命名习惯
设计索引 design the indexes
定义视图 establish view definitions
数据空间存储 plan the physical storage space
定义约束 redefine integrity constraints
E-R 图转换成数据表:
Map Entities to Tables table
Map the attributes to Columns
Map Unique Identifiers to Primary Keys
Map Relationships to Foreign Keys
TABLE
create table
datatype: varchar2 char,number,
char 定长,varchar2 变长。
没有指定数字宽度 number(4,2) 4 表示有效位数,3 表示多少位小数(四舍五入)。
Insert into test(c2) values (123)---错误。超出了有效位。
字符串用单引号引起 空用 NULL,
CLOB---Character date up to 4GB
BLOB—Binary data up to 4GB
DATE
dual is a dummy table used to view sysdate.
Default date display is DD-MON-RR
YYYY YEAR MM MONTH DY DAY
函数:
to_date
to_char
select first_name,to_char(start_date) from s_emp where to_char(start_date,'MM'))='03'
to_char(start_date,'fmmm')=
'3'
RR 时间保证跨世纪: 0-49 50-99
当前
0-49 Before
当前
50-99 After
has an fm element to remove padded blanks or suppress leading zeros 前导零
select to_char(trunc(last_day(sysdate)+1),'yyyy-mm-dd hh24:mi:ss') from dual; 下个月的
第一天。
INDEX 索引
每条记录的地址
创建 1:自动创建 define a PRIMARY KEY or UNIQUE constraint
创建 2:手工创建 create non-unique indexes
CREATE INDEX test_ind_name ON test(name);
user_indexes 系统索引表 user_ind_columns 约束索引字段表
适合建索引的情况:字段列常用作查询,字段列值范围广,大量的空值,有时要使用联合
索引,并非越多索引效率越好。
不适合建情况:表太小,字段列不常用作查询条件,常更新
UNIQUE 唯一性索引
Non-unique 非唯一性索引,加快查询速度
单值索引
Single column
多值索引
Concatenated or composite
DROP INDEX 删除索引
视图:CREATE VIEW myview AS SELECT * FROM test WHERE id<10;
视图不占空间, 可简化查询操作。
CREATE OR REPLACE VIEW empinfo(id,enam,rname) AS SELECT e.id,e.first_name,r.name
FROM s_emp e,s_region r WHERE ....; 创建或替换
视图里是聚合信息时不能插入单个细节记录。
基表不存在也可以创建视图用 CREATE FORCE VIEW myview 默认是 NOFORCE。
CREATE OR REPLACE VIEW myview AS SELECT ...FROM WHERE .
WITH CHECK OPTION CONSTRAINT emp_ck. 视图添加约束。约束为 WHERE 条件。 符号 V
WITH READ ONLY 只读视图。O
字查询里不能用 ORDAR BY。
Inline view 内联视图
哪些员工的工资比本部门的平均工资高?
SELECT first_name,salary,avg
2 FROM s_emp,(SELECT dept_id,avg(salary) avg
3 FROM s_emp
4 GROUP BY dept_id) a
5 WHERE s_emp.dept_id=a.dept_id
6* AND salary>avg
rownum 记录的位置,必须等于 1 或<=一个数
工资排名前五名
1 SELECT first_name,salary
2 FROM (SELECT rownum,first_name,salary
3 FROM s_emp
4 ORDER BY salary DESC) a
5* WHERE rownum<=5
分页显示
SELECT r,a.*
FROM (SELECT rownum r,aa.*
FROM (SELECT *
FROM s_emp) aa
)a
WHERE r BETWEEN 1 AND 10
例 2:
SELECT r,first_name,salary
FROM ( SELECT rownum r,first_name,salary
FROM ( SELECT first_name,salary
FROM s_emp
ORDER BY salary DESC
)
WHERE rownum<=20
)
WHERE r BETWEEN 16 AND 20
排名相同的情况
去除掉重复后的排名,有两个 3 名就无第四名。
rank() over
dense_rank() over() 按顺序排名 有两个 3 名。第五名就将成为第四名
SELECT dense_rank() over(ORDER BY salary DESC) r,first_name,salary FROM s_emp;
limit
关联子查询:
who earn more than the average salary in their department 思路:将部门号传给子查
询取到部门的平均值。
SELECT last_name,salary,dept_id
2 FROM s_emp outer
3 WHERE salary > (SELECT AVG(salary)
4 FROM s_emp
5 WHERE dept_id=outer.dept_id)
6 ;
子查询是否存在。存在为真,不存在为假。
EXISTS
不存在为真,存在为假。
NOT EXISTS
SELECT first_name
2 FROM s_emp outer
3 WHERE EXISTS (
4 SELECT manager_id/常量。
5 FROM s_emp inner
6 WHERE outer.id=inner.manager_id);
chooes all courses
SELECT name FROM students s WHERE NOT EXISTS (SELECT 'x' FROM courses c WHERE
NOT EXISTS (SELECT 'x' FROM stu_cou sc WHERE s.id=sc.sid AND c.id=sc.cid) )
1 查询 zhaojun 同学有哪些课程没有选择
2 查询哪些同学 选择了 zhaojun 同学选的课程
3 查询哪些同学选择了和 zhaojun 同学相同的课程
1 查询 zhaojun 同学有哪些课程没有选择
SELECT name
FROM course c
WHERE NOT EXISTS (SELECT 1
FROM stu_course sc,student s
WHERE sc.s_id=s.sid AND s.name='zhaojun' AND sc.c_id=c.cid);
2 查询哪些同学(name) 选择了 zhaojun 同学选的课程
SELECT DISTINCT s_id
FROM stu_course outer
WHERE c_id IN (SELECT c_id
FROM stu_course sc WHERE sc.s_id=2)
SELECT DISTINCT s_id
FROM stu_course outer
WHERE EXISTS (SELECT 1
FROM stu_course sc WHERE sc.s_id=2 AND outer.c_id=sc.c_id);
3 查询哪些同学选择了和 zhaojun 同学相同的课程
SELECT s_id
FROM stu_course a
WHERE NOT EXISTS(SELECT DISTINCT s_id
FROM stu_course outer
WHERE NOT EXISTS (SELECT 1
FROM stu_course sc WHERE sc.s_id=2 AND
outer.c_id=sc.c_id) AND a.c_id=sc.c_id));
4 查询哪些同学选的课程不合 zhaojun 一样。
SELECT DISTINCT s_id
FROM stu_course outer
WHERE NOT EXISTS (SELECT 1
FROM stu_course sc WHERE sc.s_id=2 AND outer.c_id=sc.c_id);
也可以用 NOT IN
SELECT DISTINCT s_id
FROM stu_course outer
WHERE c_id NOT (SELECT c_id
FROM stu_course sc WHERE sc.s_id=2)
但此时如果有 zhaojun 同学一门课也没选,空记录将查不到
UNION 排重/UNION ALL 不排重。 联合 联合类型要一致。
交集。
INTERSECT
集合相减。
MINUS
ALTER 修改表结构。
ALTER TABLE ADD column 增加一个字段
ALTER TABLE test DROP 字段
修改字段名;
ALTER TABLE test RENAME COLUMN
。。MODIFY (title varchar2(50)) 修改字段类型
ALTER TABLE
ALTER TABLE s_emp ADD CONSTRAINT s_emp_manager_id_fk
增加约束
FOREIGN KEY (manager_id) REFERENCES s_emp(id)
ALTER TABLE s_emp DROP CONSTRAINT s_emp_manager_id_fk; 删除约束
级联删除主键。
ALTER TABLE s_dept DROP PRIMARY KEY CASCADE;
使约束失效
ALTER TABLE s_emp DISABLE CONSTRAINT s_emp_id_pk CASCADE
使约束恢复有效
ALTER TABLE s_emp ENABLE CONSTRAINT s_emp_id_pk;
推荐阅读
-
oracle 主键自增函数 博客分类: oracle oralcefunction函数主键自增
-
ORACLE知识 OracleSQLC#C++C
-
创建触发器,以便为t_forum表生成主键 博客分类: oracle Oracle序列触发器主键自增
-
ORACLE知识 OracleSQLC#C++C
-
Solaris综合管理知识总结 博客分类: LINUX/SOLARIS Solaris配置管理SSHMobileOffice
-
RHEL5上裸设备上面安装Oracle 10g
-
javascript 学习笔记(八)javascript对象_基础知识
-
在Linux上Oracle如何启用异步IO?
-
获取Oracle SQL语句中绑定变量值的方法
-
Oracle错误 ORA-12514 解决方法