- 浏览: 409446 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (347)
- java基础 (58)
- ajax (10)
- s2sh (10)
- 版本控制 (4)
- 数据库 (34)
- 服务器 (4)
- 开发工具 (8)
- javascript (15)
- soockte (5)
- ext (2)
- 环境搭建 (7)
- struts2 (9)
- 找工作中的面试技巧 (2)
- 承接网站零活 (0)
- JNI+JONSE+OGNL (8)
- 性能优化 (4)
- Android开发 (5)
- xul (8)
- jquery (2)
- 线程 (3)
- jsp+jdbc (7)
- servlet (2)
- java对xml操作 (1)
- IO流的操作 (10)
- 项目开发前配置 (1)
- css (0)
- 上传、下载 (2)
- 知识探讨 (2)
- html (2)
- HQL (0)
- 工作技巧 (1)
- IT (1)
- Hibernate杂谈 (10)
- Spring杂谈 (35)
- DWR (5)
- JUnit测试 (3)
- EasyMock测试web (1)
- ibatis (6)
- maysql (5)
- C++ (0)
- 正则表达式(解剖) (1)
- 密码安全 (2)
- 上传 (1)
- socket (1)
- jni(java与c++结合) (1)
- jdk版本问题 (0)
- tomcat版本问题 (5)
- linux基本命令(初学) (7)
- linux项目发布 (1)
- 3年的经验总结 (1)
- 加解密 (2)
- 高级java阶段 (2)
- java内存分区 (1)
- 浏览器 (1)
- 职业规划 (1)
- 管理 (5)
- java语音 (1)
- SSH (1)
- jsp (3)
- extjs (1)
- uml (2)
- 加密 (1)
- web (2)
- Ant (1)
- 自述 (1)
- Linux (1)
- ssh源码解剖 (1)
- 代码优化 (1)
- 设计模式 (0)
- xml (2)
- JOSN (1)
- scala (0)
- hadoop (0)
- spark (0)
- hana (1)
- shior (1)
- java Word (6)
- java PDF (4)
- java Excel (0)
最新评论
-
高级java工程师:
ztao2333 写道谢谢。收藏下这个总结。呵呵
温习jdk和tomcat -
ztao2333:
大写的,不是大学的
温习jdk和tomcat -
ztao2333:
谢谢。收藏下这个总结。
温习jdk和tomcat -
the_small_base_:
你好,可以提供调用方法吗?需要的Jar,能发下源码吗?谢谢
java实现语音 -
高级java工程师:
文思涌动 写道楼主新年好。可否再传一遍给我,我没有收到, 不清 ...
s2sh整合
dual表,只有一条信息
关系型数据库理论:
1>数据库是由一系列的对象所组成: 如table,view,index;
2>通过一系列的操作(sql语句)作用于这些对象
3>为了保证数据的完整性,插入数据数据要遵循一定的规则 (约束)
主键(primary),外键,非空,唯一,自定义(check)
PL/SQL在标准sql上面增加过程化控制语句而来的,变量,控制语句,数据类型。只能用于oracle数据库
2.SQL语句的分类
1>数据获取语言() select
2>数据操纵语言(DML) insert, update, delete(可回滚)
3>数据定义语言(DDL) create, alter, drop, rename, truncate(删除,不可回滚)
4>事物控制语言 commit rollback
5>数据控制语言(DCL) grant(授权) revoke(回收权限)
三种登陆服务器的方法:
1,sqlplus
briup
briup 比较安全,从Unix下面看不到用户名及密码
2,sqlplus briup
briup 通过Unix下面可以查到用户名
3,sqlplus birup/briup
******
SQL> set linesize 500 设置行的宽度即可以显示多少只对当前的有效。
column address format a50; 设置单个列的宽度
列名 宽度
第一章: 查询
1.查询所有的列
select * from table_name;
* 与列名不能同时使用
2.给列指定别名;
在列名的后面加上空格, 再加上别名
select fist_name name from s_emp;
如果理的别名中有特殊字符,或者是列的另名是区分大小写,列的别名要放到双引号 " " 当中
SQL> select first_name "first name " from s_emp;
在Oracle中有且只有两上地方用双引号: 此是其一
在日期显示的时候,用“”表示,将其中的数字原样输出
3.如何将两个列的内容连接到一起
SQL> select first_name ||' '||salary from s_emp;
SQL> select 'briup_'||' '||first_name ||' '||last_name "total name" from s_emp;
4.null值的处理
在oracle中没有分配值的列就是Null,
在一个列中如果一个表达式为null,那么整个表达式都是null.
空值置换函数:
两个参数:第一个参数是可能为空的列。
第二个参数表示如果出现空值要替换成的值
nvl(commission_pct, 0)
SQL> select first_name, salary+salary*nvl(commission_pct,0)/100 "sal" FROM s_emp;
替换前后两个参数的类型一定要一致。
SQL> select first_name, salary+salary*nvl(commission_pct,0)/100 "sal" FROM s_emp;
5.去掉表中重复的记录(distinct)
出现的位置: 1.紧跟在select 关键字后面
select distinct first_name, last_name from s_emp;
****************************2.组函数中
*****6、oracle中常用的数据类型(oracle中没有boolean类型)
数字:number(p,s)p,精度,一个数字的有效数字。s:小数点后面有s个有效数字。
例:number(5,2) 2010.3256 先判断刻度,后四舍五入 为2010.33但是只能有5个有效数字故不能存放的下
201.3256 同样可以存下,而且存的数为201.33
number(3,-1) 2009 小数点向左移动,后四舍五入,整数部分后面的要补0,故实际值为2010,
它能存放的有效个数是3个,从最左边第一个不是0的数字开始算,到小数点移动到的位置,故可以放的下。
number(2,4) 0.003456 存放的数是 0.0035
number(5) <==> number(5,0)
如果p,s省略不写表示很大的值,
如果只有一个参数表示一个精度
字符串:
定长字符串,
char(n),n表示n个字节而不是n个字符。
char() <==> char(1)
变长的字符串 n不可以省略
varchar(n) abc varchar(5) 在此只占用的是3 个字节的长度
varchar2(n) oracle特有的类型,存放有更多的字符编码??
日期: date
七个时间分量
世纪,年,月,日,时,分,秒
7、查看表结构:(不是sql中的语句,是oracle的sqlplus提供的功能)
describe table_name
8、sqlplus 中的一些常用的命令:
a[ppend] text 追加内容
c[hange] /old/new:修改文本
cl[ear] buff[er]: 清空缓存
del n 删除行
i[nput] text 在当前的行下新增加一行
l[ist] n: 查看缓存中的内容
/ : 执行缓存中的内容
save filename 将buffer中内容保存在文件中。
get filename 将文件中的内容加载到buffer中
start filename 将文件中的内容加载到buffer中并用执行。
@filename 与start filename相同。
spool filename:录制屏幕,把所作的操作及结果存到文件中。以spool off 结束
!:暂时退出sqlplus 执行unix的命令
column:编辑查询语句返回的内容
第二章:
ORDER BY:
作用:对查出来的结果集进行排序 ,
位置:永远出现在一个查询语句的最后
分类: 升序(asc), 降序(desc)
后面可以跟的内容:
列名; 列名的别名; 列出现的顺序; 表达式
后面跟多个列的情况:
先根据第一个列进行排序,如果第一个列能够区分大小,就不会根据第二列进行排序
只有第一个列相同的情况下能会按第二个列进行排序 (以此类推)
null值:
在oracle中空值永远是最大的,升序出现在最后,降序出现在最前。
2。WHERE
作用:用来筛选结果集,
位置:紧跟着 from 子句后面
后面可以跟的内容:
3、常用的sql比较操作符
1>between....and.....表示一个包含的闭区间
保证小的值在前面,大的值在后面。
2>IN 表示在某几个固定的取值范围内
3>like:模糊匹配:
_通配一个任意字符
%通配0到多个任意字符
转义:任意一个字符都可以是转义字符,但是需要一定声明(escape)
select id,first_name,last_name from s_emp
where name like 'ab\_cd' escape '\'
第三章:
1、操作字符串的单行函数:
1>LOWER: 把字符串变成小写
2>UPPER: 把字符串变成大写
3>INITCAP:字符首字符变成大写,其他的变成小定
4>CONCAT:连接字符串,类似于 (||)
5>SUBSTR: 字符串
6>LENGTH:求字符串的长度
7>NVL:
2、操作数字
1、round: 四舍五入
2、trunc: 直接舍去
3、mod: 取余数
3、操作日期:
可以实现+ ,- ,以天为单位
两个日期做差,反加两个日期相差多少天
1>MONTH_BETWEEN: 两个日期相差多少个月。
2>ADD_MONTH: 给一个日期加上某(固定)几个月
3>NEXT_DAY: 离给定日期最近的下一个星期几
4>LAST_DAY: 一个月的最后一天
5>ROUND: 过一半就加一,没过就舍去
6>TRUNK: 直接舍去
4、转换函数 :
to_number: 转换成数字
to_char: 转换成字符串
to_date: 转换成日 期
字符串要是日期格式 字符串必须是数字
日 期 <---- 数字 <-----
----> 符串 字符串
TO_CHAR(date,'fmt')
SQL> SELECT TO_CHAR(sysdate, 'fmDD-MM-YYYY')
D: 一个星期的第几天
DD: 一个月的第几天
DDD: 一年的第几天
DAY: 表示星期
DY: 星期的前三个字符来表示
"#"出现的情况: SELECT TO_CHAR(1234567,'99,999')
TO_DATE()例子SQL> SELECT TO_DATE('12 JAN 2019', 'fmDD-MM-YYYY')
前面的字符串与后面的字符串进行批配。看是否批配,
最后显示的时候是用默认的格式显示。
将'12/1/2010 11:54:29' 转成'11-54-29 1/12/2010'
SELECT TO_CHAR(TO_DATE('2010-1-12 11:54:29','YYYY-MM-DD HH:MI:SS'), 'HH-MI-SS MM/DD/YYYY')
SQL> SELECT TO_CHAR(TO_DATE('2020-01-12 11:34:02',
2 'YYYY-MM-DD HH:MI:SS'),
3 'fmYYYY-MM-DD fmHH:MI:SS')
4 FROM dual;
第四章:select table_name from tabs; 查看所有的表
alter user scott account unlock;
1、笛卡尔积
一张表中的所有记录与另一张表的所有的记录匹配的结果
原因:(没有有效的连接条件或连接条件失效)
如果多个表中的列名有相同的情况,就在列的前面加上表的名字
SELECT s_emp.first_name,s_dept.name
2* FROM s_emp,s_dept
或者给表起别名
SELECT e.first_name,d.name
FROM s_emp e,s_dept d;
2、等连接
SELECT e.first_name,d.name
2 FROM s_emp e, s_dept d
3 WHERE e.dept_id = d.id;(连接条件)
3、不等连接
查询每个人的工资等级及名字
1 SELECT e.ename, e.sal, s.grade
2 FROM emp e, salgrade s
3* WHERE e.sal between losal AND hisal
4、外连接:
查询所有员工的名称及对应部门的名称, 有的话就加,没有的话就不加
1 select e.name, d.name
2 FROM t_emp e, t_dept d
3* WHERE e.dept_id = d.id(+)
在oracle中,如果出现空值的话哪边的少就在哪加一个(+)
右外连接 + = = + (左外连接)
等号在左,右 无 关系。
> select e.name, d.name
2 FROM t_emp eleft join t_dept d on
3 e.dept_id = d.id;
5、集合操作:
union(重复记录显示一次)
union all(重复的记录显示二次)
minus (差)
intersect(交集)
求所有的部门及员工
> SELECT d.name, e.name
2 FROM t_emp e, t_dept d
3 WHERE (d.id(+) = e.dept_id) union
4 SELECT d.name, e.name
5 FROM t_emp e, t_dept d
6 WHERE d.id = e.dept_id(+);
标准 sql中的
> select e.n ame, d.name
2 FROM t_emp e full join t_dept d on
3 e.dept_id = d.id;
6、自连接:
select m.id, m.first_name
from s_emp m, s_emp w
where m.id = w.manager_id 查找所有的领导
select m.id, m.first_name
from s_emp m, s_emp w
where w.manager_id = m.id 查找所有的有领导的员工
第五章:
所有的组函数都不会处理空值(NULL)
1、AVG:求平均数 只能作用于数字
2、COUNT: 求一张表的记录数 作用于所有类型
不会处理空值
3、MAX: 求最大值 作用于所有类型
4、MIN: 求最小值 作用于所有类型
5、SUM: 求和 只能作用于数字
2>GROUP BY (分组)
数据库根据 GROUP BY 子句后面的列进行分组,相同的分成一组,
然后再进行组函数的运算。
后面只能跟列名:
在where条件中不能出现组函数,
3>HAVING 子句
类似于where 子句,也是筛选结果集,但是与where 不同的是having子句中可以有组函数
1 select dept_id,avg(salary)
2 FROM s_emp
3 where dept_id > 20
4 GROUP BY dept_id
5 having avg(salary) >1500
6* ORDER BY
或者 :
1 SELECT dept_id, avg(salary)
2 FROM s_emp
3 GROUP BY dept_id
4 having avg(salary)>1500 and dept_id > 20
5* ORDER BY avg(salary) desc
SQL> select avg(salary) *3,组函数运算
2 FROM s_emp
3 WHERE dept_id > 20 **最先执行
4 GROUP BY dept_id *其次分组
5 having avg(salary)>1500 *4having(进行筛选)
6 ORDER BY avg(salary) desc;
如果 在一个查询语句中使用了组函数,且出现在select 后面但是没有
使用组函数的列一定要出现在group by 子句中。
select last_name,dept_id,avg(salary)
2 FROM s_emp
3 GROUP BY dept_id;
若没有last-name 则会报错
因为不能匹配,例有25个人,分到12个部门里面,一个部门中可能会能多个人
就不符合组函数意义,
多个语句一次只能输出一条语句。
第六章: 子查询
1、子查询的外围语句有三种
1>select语句,
子查询必须放在一个()内。
2>create table
SQL> create table yinxd_emp(id,name,sal)
2 as select id,first_name,salary from s_emp;
3>insert into....
insert into yinxd_tbl2(id,name)
select id,first_name from s_emp where id between 3 and 20;
2、子查询可以出现的位置:
1>where 子句
2>having 子句
3>from 子句
select dept_id,first_name,salary
FROM s_emp
WHERE dept_id in(select_id from s_emp where dept_id < 5)
查询工资大于smith所在部门的平均工资的员工的first_name,salary
SQL> select first_name,salary
2 FROM s_emp
3 where salary>
4 (SELECT avg(salary)
5 FROM s_emp
6 WHERE dept_id > (
7 SELECT dept_id
8 FROM s_emp
9 WHERE first_name = 'Ben'));
查询与“smith‘具有相同工资等级的员工的平均工资
//最终结果
1 select avg(sal)
2 from (select ename,sal,grade //查到了所属的部门的员工的姓名,等级,工资
3 from emp,salgrade
4 where sal between losal and hisal
5 intersect
6 select ename,sal,grade //SMITH所在的部门及工资
7 from emp,salgrade
8 where(select sal from emp //SMITH所属的等级
9 where ename='SMITH')
10* between losal and hisal)
select avg(e.sal) salary,g.grade
from emp e, salgrade g
group by g.grade
where e.sal between g.losal and g.hisal
having g.grade=(1)
***********
Rownum 伪列(用于动态显示每页的值)
从数据库中查数据每次查一部份数据而不是一次性的查出来,为了节省时间
以25个数据为例:
每页显示5个,即第一页:1-5,6-10,
但是不能保证id号是连续的,这时伪列就出现作用,保证了id号的连续性但
可以使用的比较操作符:
< <= between 1 and ?
要查询6-10。结合伪列加上子查询
select id,first_name,salary
from (select id, first_name, salary, rownum r from s_emp)
where r between 6 and 10;
意义:伪列生成的值是连续的。
把伪列的值,变成一个真实的表
用子查询:伪列
查询: 员工表中,工资前五名的人。(可以有重复的人)
select salary,last_name from()
select salary,last_name,rownum r from(1)
select distinct salary from (2) where r=3
select * from s_emp where salary >= (3)
select distinct salary from s_emp
select salary from (1) where rownum between 1 and 3;
select * from s_emp where salary in (2);
select first_name,salary from s_emp s1 where(
select count(*) from(
select distinct salary from s_emp) s2 where
s2.salary > s1.salary) < 5;
select distinct name from yin_temp;
select
第七章: 指定运行时变量
用法“&”+变量的名字
L> select count(*) from s_emp
2 where salary between &losal and &hisal;
Enter value for losal: 500
Enter value for hisal: 1000
后按一个"/"就可以继续运行。
可以替换的内容:
from语句,where语句,order by语句; 整条sql语句
1 select id, first_name
2 from s_emp
3* where &var
SQL> /
Enter value for var: id <10
old 3: where &var
一个数字加一个空格,即把当前行的缓存中的所有的数据替换
SQL> l
1* select first_name from s_emp
SQL> 1 &a;
SQL> l
1* &a
SQL> /
Enter value for a:
当修饰字符串的时候
select id,first_name
2 from s_emp
3 where lower(last_name) like &name;
Enter value for name: '%s%' //此时需要在输入的时候进行修饰
old 3: where lower(last_name) like &name
new 3: where lower(last_name) like '%s%'
3* where lower(last_name) like '&name' //直接在输入的时候输入字符就可以了
要输入的是一个单引号的话要输入 ''''
where name = '&name'
zs
'zs' 错误
''zs''
使用accept定义变量
1>改变提示信息
SQL> accept p_id prompt 'please enter your number:'
please enter your number:10
SQL> select id,first_name from s_emp where id <&p_id; 此时缺点,不能改变它的值,
给变量解除值:
1)undefine + 变量名称
SQL> undefine p_id;
SQL> /
Enter value for p_id: 20 解除后的结果,此时accept 不起作用了,
2)重新定义相同的变量
3)写入脚本文件中,每次都可以重新指定值
2>规定变量的类型
3>是否明文显示
从文本文件中读数据
1* select &1,&3,&2 from s_emp
SQL> save yinxd.sql
start yinxd.sql id salary first_name
其中的前面的数只能是1,2,3,等,传入的数,第一个就传给第一个,第二个就传给2的数,以此类推
old 1: select &1,&3,&2 from s_emp id last_name salary
new 1: select id,salary,last_name from s_emp
select &1,&3 from s_emp
同样传入三个数但是第二个数不显示
> start yinxd.sql first_name id salary
old 1: select &1,&3 from s_emp first_name id salary
new 1: select first_name,salary from s_emp
第八章:
1.约束:
1、主键:(primary key): 唯一,不重复(可以加在一个列上或者多个列上(联合主键))
如果是联合主键:要求是联合唯一,单列非空。
分为:
自然主键:有实际的意义,以学号为例
代理主键:无实际的意义,只是为了实现唯一,不重复的功能例如,id,从1开始往后加无实际意义
见意使用代理主键:自然主键可能会涉及到更新,与原来的主键可能会有的可能,代理主键不用更新。
--------------------------
id name gender
1 zx male
2 zx femal
3 sd male
4 sd female
2、外键:(foreign key):取值为与其相关的表中对应的列值,或者为空
外键关联到的另一张表的列,不一定是主键列,只要是唯一就可以
外键也可以关联到自己表中的列。统一要求具有唯一约束
----------------------------
tel atu_id
5454646 1
5131 2
3313 此位置可以为空但不能为5,6等
主键,外键: 为了保证插入数据的完整性、有效性,而不是为了查询
外键约束也有可能加在多个列上称为联合外键
即此时不是用atu_id,而是对应主键中的 联合主键,在此表中需要有多个列对应它
即要出现一个列对应name,一个列对应gender。
3、非空:取值不能为空
4、唯一:(unique)取值不能重复,如果唯一约束加在多个列上称为联合唯一
5、自定义(check):要求插入的数据必须满足用户自定义的规则(生死时间?姓别)
2、E-R图
1、属性:
#*: 将来表示这一列有主键约束
*: 表示非空
o: 表示没有任何的约束
(#)* 表示这一列有唯一非空约束
2、关系
______:表示必须有值:(在外键列上需要加非空约束)
------:可以为空:
->:要在此实体中额外的新增加外键列;表示多对一的关系
->|-: “|” 表示 外键列同时要作联合主键
3、范式:(六个范式)
第一范式:
一张表,行与列的交驻处只能有一个值。
第二范式:
一个非主键列的值取决于一个主键列的值
第三范式:
一个非主键的列不能取决于另一个非主键的列。
四,五,bc
第九章:创建表:
1、创建表的同时加上约束
SQL> create table yinxd_tbl3(
2 id number(5) primary key,
3 name varchar2(30) not null
4 );
1、列级别(约束跟列中间不需要逗号)
not null:只能在列级别上加
2、表级别(约束跟列中间需要逗号)
联合主键,联合外键,联合唯一,
如果check约束涉及到多个列的时候也只能在表级别上加
create table yinxd_tbl5(
2 id number(5),
3 name varchar2(30),
4 constraint yinxd_tbl5_id_pk primary key(id), //指定了约束的名称
5 unique(name) //没有指定约束的名称
6 );
2、在加约束的时候 自己指定名字
指定约束的时候,名字保证不重名,不能为空
> create table yinxd_tbl4(
2 id number(5) constraint yinxd_tbl4_id_pk primary key, 到此为止是给id 加约束(列约束)
3 name varchar2(30) constraint yinxd_tbl4_name_nn not null
4 );
3、外键约束
用的是列约束
QL> create table yinxd_tbl9(
2 id number(6) primary key,
3 name varchar2(20),
4 tbl5_id number(5) references yinxd_tbl5(id) 关联到首先是表的名称,列名
5 );
用的是表的约束
QL> create table yind_tbl10(
2 id number(6) primary key,
3 name varchar2(20),
4 tbl5_name varchar2(30), 外键约束名
5 constraint yinxd_tbl10_tbl5_name_fk
6 foreign key(tbl5_name) references yinxd_tbl5(name) 需要指定此是外键列,关联到哪张表的哪个列
7 );
联合外键:
SQL> create table yinxd_tbl11(
2 id number(5) primary key,
3 name varchar2(30),
4 tbl6_id number(5),
5 tbl6_name varchar2(30),
6 foreign key(tbl6_id,tbl6_name) references 多个列关联到多个列
7 yinxd_tbl7(id,name)
8 );
自定义的约束
SQL> create table yinxd_tbl12(
2 id number(5) primary key,
3 name varchar2(30),
4 gender char check(gender in('f','m')) char相当于char(1)
5 ); 列级别加的自定义约束
QL> create table yinxd_tbl13(
2 id number(5) primary key,
3 start_date date,
4 end_date date,
5 check(start_date < end_date) 表级别加的自定义约束,check涉及多个列只能在表级别上加
6 );
级联删除
QL> l
1 create table yinxd_phone(
2 id number(5) primary key,
3 tel varchar2(20),
4 stu_id number(5),
5* foreign key(stu_id) references yinxd_stu(id) on delete cascade)
删除表后根据表创建的 views,synonym,stored procedure,stored function 依然存在,但 views,synonym 变成非法的
通过子查询创建表:
通过子查询创建表的同时只能拷贝not null约束,其他约束不能拷贝。
SQL> create table yinxd_emp(id,name,sal)
2 as select id,first_name,salary from s_emp;
第十章(记录用户对数据库所做的操作)
1、常用的数据字典表的分类:
1>以user_开头:
记录当前用户所创建的对象的信息。
user_tables, 从此看表
user_views, 从此看视图
user_sequences, 从此看序列
user_objects 在不知道是表还是视图的情况下
2>以all_开头
记录当前用户所创建的对象的信息以及其它用户授权给当前用户的对象的信息
all_tables, 从此看表
all_views, 从此看视图
all_sequences, 从此看序列
all_objects 在不知道是表还是视图的情况下
SQL> select object_name from user_objects
2 where lower(object_type) like 'table';
3>以dba_开头
所有用户所创建的对象的信息
dba_tables, 从此看表
4>以v$开头的:
记录数据库本身的一些信息以及数据库运行时动态生成的信息
v$version:数据库的版本信息
select count(username) from v$session //当前连接数据库的人
select count(name) from v$databases: //查看数据库名称
SQL>SELECT * FROM v$filestat;可以查看IO数
dictionary: 数据字典表的视图(查看所有的数据列表)
table_privileges:表的权限
IND = user_indexes
tabs = user_tables;
查看所有的约束类型:
SQL> select distinct constraint_type from user_constraints;
dict_columns;数据字典表对应原列的信息
user_constraints:用户所创建约束的信息
user_cons_columns:用户所创建约束的对应的列的信息
> l
1* select constraint_name,constraint_type from user_constraints
查到了所属的名字,
相同的是table_name
* select table_name,column_name,constraint_name from user_cons_columns
第十一章:
1、插入数据
1>一次插入一条数据
insert into table_name [(column,...)] values(val,....);
省略列名时,要给所有的列都指定值,并且顺序要跟创建表的时候列的顺序一致。
如果有列名的话,但是不全,对没有指定的列的值就可以不用指定值:
给列值指定空值
insert into yinxd_tbl(id,name) values(1,'zs');
insert into yinxd_tbl values (2,'ww',null);
2>一次性插入多条语句
SQL> insert into yinxd_tbl2(id,name)
2 select id,first_name from s_emp where id between 3 and 20;
没有vlaues 关键字
用处:
注意:往其中加入数据的时候,注意是否有主键,唯一约束等 ,在where语句筛选条件时候
不能加入重复的。
3>更新数据
update table_name set column=val, column=val[where...]
SQL> update yinxd_tbl2 set age= null where id=1;
如果没有指定的where 则表示没有指定条件
4>删除数据
delete [from] table_name [where....]
from:没有任何区别,只是格式 上的不同。
只删除某几个列,只用把某几个列上设为空
5、事务(DML操作的时候必须要用事物)
事务是组合在一起的多个操作,这多个操作就像一个不可分割的原子一样,要么
同时成功,要么同时失败
四大特点:
1)原子性:这多个操作要么同时成功,要么同时失败,不可分割。
2)一致性:事务操作前后数据要保证一致
3)隔离性:多个事务同时进行的的过程中相互不可见
4)持久性:一个事务束以后要把数据持久的保存下来
6、ORACLE中事物的边界问题:
1>什么时候开始:
a、通过sqpplus连接到数据库服务器的时候
b、当一个事务事意味着另一个事务开始
2>什么时候结束:
a、执行commit(提交事务)
b、执行rollback(回滚事务)
3)回滚到指定的地方
a、设置回滚点
savepoint a,savepoint b,savepoint c
b、回滚到指定的回滚点(当前的回滚点不会被删除)
rollback to a; a 的回滚点不删除,a以后的回滚点都删除了
如果后面的回滚点设置的名字与前面的回滚点设置的名字相同就把前面的
a)提交事务(commit)
(1)所有的数据信息都写入到了数据库
(2)之前的所有操作都丢失了
(3)所有的用户都可以访问该数据
(4)作用于数据上的锁释放了
(5)所有的回滚点都擦除了
b)回滚事务(rollback)
(1)之前的所有操作都丢失了
(2)所有的用户都可以访问该数据
(3)作用于数据上的锁释放了
(4)所有的回滚点都擦除了
c)回滚到指定的回滚点
(1)通过savepoint a 设置回滚点
(2)通过rollback to a 回滚事务
4)语句级别的回滚
一个DML语句出错,只回滚当前的语句,其他的语句不会被回滚
5>执行COMMIT语句的状态
6>执行rollback语句后的状态
注意:一个DDL,DCL语句执行的时候自动提交
NOT NULL 特殊地方:
1、拷贝表的时候 只能拷贝它的非空的约束
2、在给一个列定义约束条件的时候只能非空约束加在列上
3、增加一个新的列(只能加非空约束)表中有数据的情况下会报错
4、给一个列增加一个非空约束,只能通过修改列的命令来实现。
第十二章:
1、表结构:
1>增加一个新的列(只能加非空约束)
alter table table_name add(column_name type [default exp] [not null])
其它的约束要使用增加约束的命令来实现。
SQL> alter table yinxd_tbl1 add(age number(3))
2>修改一个列:
alter table table_name modify(column_name type [default exp] [not null])
a>将一个列的类型改变为其他类型时候,要求表中没有记录或者是该列没有数据。
b>将一个列的宽度变窄时,要求表中没有记录或者是该列没有数据。
c>给一个列增加一个默认值,只对修改以后插入的记录起作用。修改之前的不会有作用
d>给一个列增加一个非空约束的前提是表中没有数据。
SQL> alter table yinxd_tbl1 modify(age varchar2(5));
3>修改列的名称:
alter table table_name rename column old_col_name to new_col_name;
SQL> alter table yinxd_tbl1 rename column name to userName;
4>删除一个列:
alter table table_name drop column col_name;
SQL> alter table yinxd_tbl1 drop column age;
2、约束
1)增加一个约束
alter table table_name add [constraint con_name] con_type(column);(类似于表结构的约束)
给一个列增加一个非空约束,只能通过修改列的命令实现
alter table table_name modify(column type not null);
SQL> alter table yin_temp modify(id number(6) not null);
SQL> alter table yinxd_constr add constraint yinxd_constr_id_pk
2 primary key(id);
2)约束只能生效或者失效,不能更改。(失效)
alter table table_name disable constraint con_name[cascade];
主键约束:
alter table table_name disable constraint primary key[cascade];
如果主键失效同时是别的表中的外键,则此时就没有唯一,非空的约束就不能充当外键因此需要级联删除
SQL> alter table yinxd_constr disable constraint yinxd_constr_id_pk;
当处理大量的数据的时候见意先使一些主键等约束失效,插入以后再把主键设过来,如果有异常再对个别
数据进行相关的处理。避免了大量数据插不进去的情况。
3)约束只能生效或者失效,不能更改。(生效)
alter table table_name enable constraint con_name;
alter table table_name enable constraint primary key;
SQL> alter table yinxd_constr enable constraint yinxd_constr_id_pk;
一个约束生效以后验证的是表中的全部数据,而不是只验证失效以后插入的数据
4)删除约束
alter table table_name drop constraint con_name[cascade];
3、删除表
drop table table_name [cascade constraints];
[cascade constraints]:级联删除与其相关的外键约束。
4、清空表
truncate table table_name;
drop > truncate > delete
1)事务不能回滚
2)解放表空间。
5、重命名一个表
rename old_name to new_name;
同样适用于数据库中的其他对象,表,视图,sequence
alter table table_name rename to new_name:只能重命名表
6、给表加注释
comment on table table_name is 'comments......';
针对表:SQL> comment on table yinxd_new is 'this is my first comment table';
comment on column table_name.column_name is 'comments......';
针对表中的列:
SQL> comment on column yinxd_new.ID is 'this is a colum comment';
清空注释:
把is后面的''里的东西写成空,即不写即可
查看注释:
SQL> l
1* select comments from user_tab_comments
2 where lower(table_name)like 'yinxd_new';
user_tab_comments:存放的是表的注释
user_col_comments:存放的是列的注释
第十三章:SEQUENCE(只有oracle,DB2)
从user_sequences的表中查看相应的结果
没有回滚一说,不管操作是否成功,都会产生下一个值
1、sequence
sequence是数据库中一种特殊的对象,可以产生一系列"连续"的整数,(按一定的规律)
通常用来作为主键值。数据库为了提高效率会在内存中缓存一部分数据。
2、如何创建sequence:
create sequence name
[increment by n] //步长,每次增长的数
[start with n] //从哪一个开始
[{maxvalue n | nomaxvalue}]
[{minvalue n | nominvalue}]
[{cycle | nocycle}]
[{cache n | nocache }] //一次性产生指定的个数的值放在内存中
如果想保证相对的连续,可以不设缓存,如果存在意外使缓存数据丢失。使数据“不连续"
同时如果多个表同时用一个sequence可以共同使用它们的sequence。
3、如何使用sequence:
nextVal:下一个可以使用的值
currVal:当前可以使用的值,要想用current的值至少要先使用一次nextVal
select seq_yin2.nextval from dual; //查看当前使用到的值
//查看最的一个记录 的数
1 select last_number from user_sequences
2* where lower(sequence_name) like 'seq_yin2'
//查看默认的表的一些属性:
SQL> select * from user_sequences了`
2 where lower(sequence_name)like 'seq_yin';
默认缓存为20,
SQL> insert into yin_temp values(seq.nextval,'lsajfsfs',seq.currval);
4、修改 sequence
alter sequence name
一个sequence 除了起始值不能修改其它的都可以修改。
5、删除 sequence
drop sequence seq_name;
第十四章: VIEW grant create view to briup
作用: 1、对表的访问的安全
2、简化访问(相当于结构化访问)
view 也是数据库中的一种对象,可以像表一样进行CRUD操作,但是它并没有表结构,只是一条select 语句。
表现: 一张表或者是多张表的部分内容
本质上: 一条有名字的select语句。
如何创建视图:
create [or replace][force|noforce] VIEW view
[(alias[,alias])...]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]
or replace:如果有同名的视图就替换。
force/noforce:如果子查询语中当中使用到的表存在或者不存在的时候,视图是否可以成功创建。
默认值是noforce:
[WITH CHECK OPTION]:对于视图进行DML操作时,只能限于子查询当中的条件
WITH READ ONLY:表示视图只能进行select 操作
1 create or replace view yinxd_view(
2 emp_id,emp_name,emp_salary) //别名,与下面的有顺序
3 as select id,first_name,salary from s_emp
4 where id<50 //限制 只能插入id 小于50的
5 with check option
SQL> create or replace view yinxd_view(
2 emp_id,emp_name,emp_sal)
3 as select id,first_name,salary from
4 s_emp where id<50
5 with check option;
关系型数据库理论:
1>数据库是由一系列的对象所组成: 如table,view,index;
2>通过一系列的操作(sql语句)作用于这些对象
3>为了保证数据的完整性,插入数据数据要遵循一定的规则 (约束)
主键(primary),外键,非空,唯一,自定义(check)
PL/SQL在标准sql上面增加过程化控制语句而来的,变量,控制语句,数据类型。只能用于oracle数据库
2.SQL语句的分类
1>数据获取语言() select
2>数据操纵语言(DML) insert, update, delete(可回滚)
3>数据定义语言(DDL) create, alter, drop, rename, truncate(删除,不可回滚)
4>事物控制语言 commit rollback
5>数据控制语言(DCL) grant(授权) revoke(回收权限)
三种登陆服务器的方法:
1,sqlplus
briup
briup 比较安全,从Unix下面看不到用户名及密码
2,sqlplus briup
briup 通过Unix下面可以查到用户名
3,sqlplus birup/briup
******
SQL> set linesize 500 设置行的宽度即可以显示多少只对当前的有效。
column address format a50; 设置单个列的宽度
列名 宽度
第一章: 查询
1.查询所有的列
select * from table_name;
* 与列名不能同时使用
2.给列指定别名;
在列名的后面加上空格, 再加上别名
select fist_name name from s_emp;
如果理的别名中有特殊字符,或者是列的另名是区分大小写,列的别名要放到双引号 " " 当中
SQL> select first_name "first name " from s_emp;
在Oracle中有且只有两上地方用双引号: 此是其一
在日期显示的时候,用“”表示,将其中的数字原样输出
3.如何将两个列的内容连接到一起
SQL> select first_name ||' '||salary from s_emp;
SQL> select 'briup_'||' '||first_name ||' '||last_name "total name" from s_emp;
4.null值的处理
在oracle中没有分配值的列就是Null,
在一个列中如果一个表达式为null,那么整个表达式都是null.
空值置换函数:
两个参数:第一个参数是可能为空的列。
第二个参数表示如果出现空值要替换成的值
nvl(commission_pct, 0)
SQL> select first_name, salary+salary*nvl(commission_pct,0)/100 "sal" FROM s_emp;
替换前后两个参数的类型一定要一致。
SQL> select first_name, salary+salary*nvl(commission_pct,0)/100 "sal" FROM s_emp;
5.去掉表中重复的记录(distinct)
出现的位置: 1.紧跟在select 关键字后面
select distinct first_name, last_name from s_emp;
****************************2.组函数中
*****6、oracle中常用的数据类型(oracle中没有boolean类型)
数字:number(p,s)p,精度,一个数字的有效数字。s:小数点后面有s个有效数字。
例:number(5,2) 2010.3256 先判断刻度,后四舍五入 为2010.33但是只能有5个有效数字故不能存放的下
201.3256 同样可以存下,而且存的数为201.33
number(3,-1) 2009 小数点向左移动,后四舍五入,整数部分后面的要补0,故实际值为2010,
它能存放的有效个数是3个,从最左边第一个不是0的数字开始算,到小数点移动到的位置,故可以放的下。
number(2,4) 0.003456 存放的数是 0.0035
number(5) <==> number(5,0)
如果p,s省略不写表示很大的值,
如果只有一个参数表示一个精度
字符串:
定长字符串,
char(n),n表示n个字节而不是n个字符。
char() <==> char(1)
变长的字符串 n不可以省略
varchar(n) abc varchar(5) 在此只占用的是3 个字节的长度
varchar2(n) oracle特有的类型,存放有更多的字符编码??
日期: date
七个时间分量
世纪,年,月,日,时,分,秒
7、查看表结构:(不是sql中的语句,是oracle的sqlplus提供的功能)
describe table_name
8、sqlplus 中的一些常用的命令:
a[ppend] text 追加内容
c[hange] /old/new:修改文本
cl[ear] buff[er]: 清空缓存
del n 删除行
i[nput] text 在当前的行下新增加一行
l[ist] n: 查看缓存中的内容
/ : 执行缓存中的内容
save filename 将buffer中内容保存在文件中。
get filename 将文件中的内容加载到buffer中
start filename 将文件中的内容加载到buffer中并用执行。
@filename 与start filename相同。
spool filename:录制屏幕,把所作的操作及结果存到文件中。以spool off 结束
!:暂时退出sqlplus 执行unix的命令
column:编辑查询语句返回的内容
第二章:
ORDER BY:
作用:对查出来的结果集进行排序 ,
位置:永远出现在一个查询语句的最后
分类: 升序(asc), 降序(desc)
后面可以跟的内容:
列名; 列名的别名; 列出现的顺序; 表达式
后面跟多个列的情况:
先根据第一个列进行排序,如果第一个列能够区分大小,就不会根据第二列进行排序
只有第一个列相同的情况下能会按第二个列进行排序 (以此类推)
null值:
在oracle中空值永远是最大的,升序出现在最后,降序出现在最前。
2。WHERE
作用:用来筛选结果集,
位置:紧跟着 from 子句后面
后面可以跟的内容:
3、常用的sql比较操作符
1>between....and.....表示一个包含的闭区间
保证小的值在前面,大的值在后面。
2>IN 表示在某几个固定的取值范围内
3>like:模糊匹配:
_通配一个任意字符
%通配0到多个任意字符
转义:任意一个字符都可以是转义字符,但是需要一定声明(escape)
select id,first_name,last_name from s_emp
where name like 'ab\_cd' escape '\'
第三章:
1、操作字符串的单行函数:
1>LOWER: 把字符串变成小写
2>UPPER: 把字符串变成大写
3>INITCAP:字符首字符变成大写,其他的变成小定
4>CONCAT:连接字符串,类似于 (||)
5>SUBSTR: 字符串
6>LENGTH:求字符串的长度
7>NVL:
2、操作数字
1、round: 四舍五入
2、trunc: 直接舍去
3、mod: 取余数
3、操作日期:
可以实现+ ,- ,以天为单位
两个日期做差,反加两个日期相差多少天
1>MONTH_BETWEEN: 两个日期相差多少个月。
2>ADD_MONTH: 给一个日期加上某(固定)几个月
3>NEXT_DAY: 离给定日期最近的下一个星期几
4>LAST_DAY: 一个月的最后一天
5>ROUND: 过一半就加一,没过就舍去
6>TRUNK: 直接舍去
4、转换函数 :
to_number: 转换成数字
to_char: 转换成字符串
to_date: 转换成日 期
字符串要是日期格式 字符串必须是数字
日 期 <---- 数字 <-----
----> 符串 字符串
TO_CHAR(date,'fmt')
SQL> SELECT TO_CHAR(sysdate, 'fmDD-MM-YYYY')
D: 一个星期的第几天
DD: 一个月的第几天
DDD: 一年的第几天
DAY: 表示星期
DY: 星期的前三个字符来表示
"#"出现的情况: SELECT TO_CHAR(1234567,'99,999')
TO_DATE()例子SQL> SELECT TO_DATE('12 JAN 2019', 'fmDD-MM-YYYY')
前面的字符串与后面的字符串进行批配。看是否批配,
最后显示的时候是用默认的格式显示。
将'12/1/2010 11:54:29' 转成'11-54-29 1/12/2010'
SELECT TO_CHAR(TO_DATE('2010-1-12 11:54:29','YYYY-MM-DD HH:MI:SS'), 'HH-MI-SS MM/DD/YYYY')
SQL> SELECT TO_CHAR(TO_DATE('2020-01-12 11:34:02',
2 'YYYY-MM-DD HH:MI:SS'),
3 'fmYYYY-MM-DD fmHH:MI:SS')
4 FROM dual;
第四章:select table_name from tabs; 查看所有的表
alter user scott account unlock;
1、笛卡尔积
一张表中的所有记录与另一张表的所有的记录匹配的结果
原因:(没有有效的连接条件或连接条件失效)
如果多个表中的列名有相同的情况,就在列的前面加上表的名字
SELECT s_emp.first_name,s_dept.name
2* FROM s_emp,s_dept
或者给表起别名
SELECT e.first_name,d.name
FROM s_emp e,s_dept d;
2、等连接
SELECT e.first_name,d.name
2 FROM s_emp e, s_dept d
3 WHERE e.dept_id = d.id;(连接条件)
3、不等连接
查询每个人的工资等级及名字
1 SELECT e.ename, e.sal, s.grade
2 FROM emp e, salgrade s
3* WHERE e.sal between losal AND hisal
4、外连接:
查询所有员工的名称及对应部门的名称, 有的话就加,没有的话就不加
1 select e.name, d.name
2 FROM t_emp e, t_dept d
3* WHERE e.dept_id = d.id(+)
在oracle中,如果出现空值的话哪边的少就在哪加一个(+)
右外连接 + = = + (左外连接)
等号在左,右 无 关系。
> select e.name, d.name
2 FROM t_emp eleft join t_dept d on
3 e.dept_id = d.id;
5、集合操作:
union(重复记录显示一次)
union all(重复的记录显示二次)
minus (差)
intersect(交集)
求所有的部门及员工
> SELECT d.name, e.name
2 FROM t_emp e, t_dept d
3 WHERE (d.id(+) = e.dept_id) union
4 SELECT d.name, e.name
5 FROM t_emp e, t_dept d
6 WHERE d.id = e.dept_id(+);
标准 sql中的
> select e.n ame, d.name
2 FROM t_emp e full join t_dept d on
3 e.dept_id = d.id;
6、自连接:
select m.id, m.first_name
from s_emp m, s_emp w
where m.id = w.manager_id 查找所有的领导
select m.id, m.first_name
from s_emp m, s_emp w
where w.manager_id = m.id 查找所有的有领导的员工
第五章:
所有的组函数都不会处理空值(NULL)
1、AVG:求平均数 只能作用于数字
2、COUNT: 求一张表的记录数 作用于所有类型
不会处理空值
3、MAX: 求最大值 作用于所有类型
4、MIN: 求最小值 作用于所有类型
5、SUM: 求和 只能作用于数字
2>GROUP BY (分组)
数据库根据 GROUP BY 子句后面的列进行分组,相同的分成一组,
然后再进行组函数的运算。
后面只能跟列名:
在where条件中不能出现组函数,
3>HAVING 子句
类似于where 子句,也是筛选结果集,但是与where 不同的是having子句中可以有组函数
1 select dept_id,avg(salary)
2 FROM s_emp
3 where dept_id > 20
4 GROUP BY dept_id
5 having avg(salary) >1500
6* ORDER BY
或者 :
1 SELECT dept_id, avg(salary)
2 FROM s_emp
3 GROUP BY dept_id
4 having avg(salary)>1500 and dept_id > 20
5* ORDER BY avg(salary) desc
SQL> select avg(salary) *3,组函数运算
2 FROM s_emp
3 WHERE dept_id > 20 **最先执行
4 GROUP BY dept_id *其次分组
5 having avg(salary)>1500 *4having(进行筛选)
6 ORDER BY avg(salary) desc;
如果 在一个查询语句中使用了组函数,且出现在select 后面但是没有
使用组函数的列一定要出现在group by 子句中。
select last_name,dept_id,avg(salary)
2 FROM s_emp
3 GROUP BY dept_id;
若没有last-name 则会报错
因为不能匹配,例有25个人,分到12个部门里面,一个部门中可能会能多个人
就不符合组函数意义,
多个语句一次只能输出一条语句。
第六章: 子查询
1、子查询的外围语句有三种
1>select语句,
子查询必须放在一个()内。
2>create table
SQL> create table yinxd_emp(id,name,sal)
2 as select id,first_name,salary from s_emp;
3>insert into....
insert into yinxd_tbl2(id,name)
select id,first_name from s_emp where id between 3 and 20;
2、子查询可以出现的位置:
1>where 子句
2>having 子句
3>from 子句
select dept_id,first_name,salary
FROM s_emp
WHERE dept_id in(select_id from s_emp where dept_id < 5)
查询工资大于smith所在部门的平均工资的员工的first_name,salary
SQL> select first_name,salary
2 FROM s_emp
3 where salary>
4 (SELECT avg(salary)
5 FROM s_emp
6 WHERE dept_id > (
7 SELECT dept_id
8 FROM s_emp
9 WHERE first_name = 'Ben'));
查询与“smith‘具有相同工资等级的员工的平均工资
//最终结果
1 select avg(sal)
2 from (select ename,sal,grade //查到了所属的部门的员工的姓名,等级,工资
3 from emp,salgrade
4 where sal between losal and hisal
5 intersect
6 select ename,sal,grade //SMITH所在的部门及工资
7 from emp,salgrade
8 where(select sal from emp //SMITH所属的等级
9 where ename='SMITH')
10* between losal and hisal)
select avg(e.sal) salary,g.grade
from emp e, salgrade g
group by g.grade
where e.sal between g.losal and g.hisal
having g.grade=(1)
***********
Rownum 伪列(用于动态显示每页的值)
从数据库中查数据每次查一部份数据而不是一次性的查出来,为了节省时间
以25个数据为例:
每页显示5个,即第一页:1-5,6-10,
但是不能保证id号是连续的,这时伪列就出现作用,保证了id号的连续性但
可以使用的比较操作符:
< <= between 1 and ?
要查询6-10。结合伪列加上子查询
select id,first_name,salary
from (select id, first_name, salary, rownum r from s_emp)
where r between 6 and 10;
意义:伪列生成的值是连续的。
把伪列的值,变成一个真实的表
用子查询:伪列
查询: 员工表中,工资前五名的人。(可以有重复的人)
select salary,last_name from()
select salary,last_name,rownum r from(1)
select distinct salary from (2) where r=3
select * from s_emp where salary >= (3)
select distinct salary from s_emp
select salary from (1) where rownum between 1 and 3;
select * from s_emp where salary in (2);
select first_name,salary from s_emp s1 where(
select count(*) from(
select distinct salary from s_emp) s2 where
s2.salary > s1.salary) < 5;
select distinct name from yin_temp;
select
第七章: 指定运行时变量
用法“&”+变量的名字
L> select count(*) from s_emp
2 where salary between &losal and &hisal;
Enter value for losal: 500
Enter value for hisal: 1000
后按一个"/"就可以继续运行。
可以替换的内容:
from语句,where语句,order by语句; 整条sql语句
1 select id, first_name
2 from s_emp
3* where &var
SQL> /
Enter value for var: id <10
old 3: where &var
一个数字加一个空格,即把当前行的缓存中的所有的数据替换
SQL> l
1* select first_name from s_emp
SQL> 1 &a;
SQL> l
1* &a
SQL> /
Enter value for a:
当修饰字符串的时候
select id,first_name
2 from s_emp
3 where lower(last_name) like &name;
Enter value for name: '%s%' //此时需要在输入的时候进行修饰
old 3: where lower(last_name) like &name
new 3: where lower(last_name) like '%s%'
3* where lower(last_name) like '&name' //直接在输入的时候输入字符就可以了
要输入的是一个单引号的话要输入 ''''
where name = '&name'
zs
'zs' 错误
''zs''
使用accept定义变量
1>改变提示信息
SQL> accept p_id prompt 'please enter your number:'
please enter your number:10
SQL> select id,first_name from s_emp where id <&p_id; 此时缺点,不能改变它的值,
给变量解除值:
1)undefine + 变量名称
SQL> undefine p_id;
SQL> /
Enter value for p_id: 20 解除后的结果,此时accept 不起作用了,
2)重新定义相同的变量
3)写入脚本文件中,每次都可以重新指定值
2>规定变量的类型
3>是否明文显示
从文本文件中读数据
1* select &1,&3,&2 from s_emp
SQL> save yinxd.sql
start yinxd.sql id salary first_name
其中的前面的数只能是1,2,3,等,传入的数,第一个就传给第一个,第二个就传给2的数,以此类推
old 1: select &1,&3,&2 from s_emp id last_name salary
new 1: select id,salary,last_name from s_emp
select &1,&3 from s_emp
同样传入三个数但是第二个数不显示
> start yinxd.sql first_name id salary
old 1: select &1,&3 from s_emp first_name id salary
new 1: select first_name,salary from s_emp
第八章:
1.约束:
1、主键:(primary key): 唯一,不重复(可以加在一个列上或者多个列上(联合主键))
如果是联合主键:要求是联合唯一,单列非空。
分为:
自然主键:有实际的意义,以学号为例
代理主键:无实际的意义,只是为了实现唯一,不重复的功能例如,id,从1开始往后加无实际意义
见意使用代理主键:自然主键可能会涉及到更新,与原来的主键可能会有的可能,代理主键不用更新。
--------------------------
id name gender
1 zx male
2 zx femal
3 sd male
4 sd female
2、外键:(foreign key):取值为与其相关的表中对应的列值,或者为空
外键关联到的另一张表的列,不一定是主键列,只要是唯一就可以
外键也可以关联到自己表中的列。统一要求具有唯一约束
----------------------------
tel atu_id
5454646 1
5131 2
3313 此位置可以为空但不能为5,6等
主键,外键: 为了保证插入数据的完整性、有效性,而不是为了查询
外键约束也有可能加在多个列上称为联合外键
即此时不是用atu_id,而是对应主键中的 联合主键,在此表中需要有多个列对应它
即要出现一个列对应name,一个列对应gender。
3、非空:取值不能为空
4、唯一:(unique)取值不能重复,如果唯一约束加在多个列上称为联合唯一
5、自定义(check):要求插入的数据必须满足用户自定义的规则(生死时间?姓别)
2、E-R图
1、属性:
#*: 将来表示这一列有主键约束
*: 表示非空
o: 表示没有任何的约束
(#)* 表示这一列有唯一非空约束
2、关系
______:表示必须有值:(在外键列上需要加非空约束)
------:可以为空:
->:要在此实体中额外的新增加外键列;表示多对一的关系
->|-: “|” 表示 外键列同时要作联合主键
3、范式:(六个范式)
第一范式:
一张表,行与列的交驻处只能有一个值。
第二范式:
一个非主键列的值取决于一个主键列的值
第三范式:
一个非主键的列不能取决于另一个非主键的列。
四,五,bc
第九章:创建表:
1、创建表的同时加上约束
SQL> create table yinxd_tbl3(
2 id number(5) primary key,
3 name varchar2(30) not null
4 );
1、列级别(约束跟列中间不需要逗号)
not null:只能在列级别上加
2、表级别(约束跟列中间需要逗号)
联合主键,联合外键,联合唯一,
如果check约束涉及到多个列的时候也只能在表级别上加
create table yinxd_tbl5(
2 id number(5),
3 name varchar2(30),
4 constraint yinxd_tbl5_id_pk primary key(id), //指定了约束的名称
5 unique(name) //没有指定约束的名称
6 );
2、在加约束的时候 自己指定名字
指定约束的时候,名字保证不重名,不能为空
> create table yinxd_tbl4(
2 id number(5) constraint yinxd_tbl4_id_pk primary key, 到此为止是给id 加约束(列约束)
3 name varchar2(30) constraint yinxd_tbl4_name_nn not null
4 );
3、外键约束
用的是列约束
QL> create table yinxd_tbl9(
2 id number(6) primary key,
3 name varchar2(20),
4 tbl5_id number(5) references yinxd_tbl5(id) 关联到首先是表的名称,列名
5 );
用的是表的约束
QL> create table yind_tbl10(
2 id number(6) primary key,
3 name varchar2(20),
4 tbl5_name varchar2(30), 外键约束名
5 constraint yinxd_tbl10_tbl5_name_fk
6 foreign key(tbl5_name) references yinxd_tbl5(name) 需要指定此是外键列,关联到哪张表的哪个列
7 );
联合外键:
SQL> create table yinxd_tbl11(
2 id number(5) primary key,
3 name varchar2(30),
4 tbl6_id number(5),
5 tbl6_name varchar2(30),
6 foreign key(tbl6_id,tbl6_name) references 多个列关联到多个列
7 yinxd_tbl7(id,name)
8 );
自定义的约束
SQL> create table yinxd_tbl12(
2 id number(5) primary key,
3 name varchar2(30),
4 gender char check(gender in('f','m')) char相当于char(1)
5 ); 列级别加的自定义约束
QL> create table yinxd_tbl13(
2 id number(5) primary key,
3 start_date date,
4 end_date date,
5 check(start_date < end_date) 表级别加的自定义约束,check涉及多个列只能在表级别上加
6 );
级联删除
QL> l
1 create table yinxd_phone(
2 id number(5) primary key,
3 tel varchar2(20),
4 stu_id number(5),
5* foreign key(stu_id) references yinxd_stu(id) on delete cascade)
删除表后根据表创建的 views,synonym,stored procedure,stored function 依然存在,但 views,synonym 变成非法的
通过子查询创建表:
通过子查询创建表的同时只能拷贝not null约束,其他约束不能拷贝。
SQL> create table yinxd_emp(id,name,sal)
2 as select id,first_name,salary from s_emp;
第十章(记录用户对数据库所做的操作)
1、常用的数据字典表的分类:
1>以user_开头:
记录当前用户所创建的对象的信息。
user_tables, 从此看表
user_views, 从此看视图
user_sequences, 从此看序列
user_objects 在不知道是表还是视图的情况下
2>以all_开头
记录当前用户所创建的对象的信息以及其它用户授权给当前用户的对象的信息
all_tables, 从此看表
all_views, 从此看视图
all_sequences, 从此看序列
all_objects 在不知道是表还是视图的情况下
SQL> select object_name from user_objects
2 where lower(object_type) like 'table';
3>以dba_开头
所有用户所创建的对象的信息
dba_tables, 从此看表
4>以v$开头的:
记录数据库本身的一些信息以及数据库运行时动态生成的信息
v$version:数据库的版本信息
select count(username) from v$session //当前连接数据库的人
select count(name) from v$databases: //查看数据库名称
SQL>SELECT * FROM v$filestat;可以查看IO数
dictionary: 数据字典表的视图(查看所有的数据列表)
table_privileges:表的权限
IND = user_indexes
tabs = user_tables;
查看所有的约束类型:
SQL> select distinct constraint_type from user_constraints;
dict_columns;数据字典表对应原列的信息
user_constraints:用户所创建约束的信息
user_cons_columns:用户所创建约束的对应的列的信息
> l
1* select constraint_name,constraint_type from user_constraints
查到了所属的名字,
相同的是table_name
* select table_name,column_name,constraint_name from user_cons_columns
第十一章:
1、插入数据
1>一次插入一条数据
insert into table_name [(column,...)] values(val,....);
省略列名时,要给所有的列都指定值,并且顺序要跟创建表的时候列的顺序一致。
如果有列名的话,但是不全,对没有指定的列的值就可以不用指定值:
给列值指定空值
insert into yinxd_tbl(id,name) values(1,'zs');
insert into yinxd_tbl values (2,'ww',null);
2>一次性插入多条语句
SQL> insert into yinxd_tbl2(id,name)
2 select id,first_name from s_emp where id between 3 and 20;
没有vlaues 关键字
用处:
注意:往其中加入数据的时候,注意是否有主键,唯一约束等 ,在where语句筛选条件时候
不能加入重复的。
3>更新数据
update table_name set column=val, column=val[where...]
SQL> update yinxd_tbl2 set age= null where id=1;
如果没有指定的where 则表示没有指定条件
4>删除数据
delete [from] table_name [where....]
from:没有任何区别,只是格式 上的不同。
只删除某几个列,只用把某几个列上设为空
5、事务(DML操作的时候必须要用事物)
事务是组合在一起的多个操作,这多个操作就像一个不可分割的原子一样,要么
同时成功,要么同时失败
四大特点:
1)原子性:这多个操作要么同时成功,要么同时失败,不可分割。
2)一致性:事务操作前后数据要保证一致
3)隔离性:多个事务同时进行的的过程中相互不可见
4)持久性:一个事务束以后要把数据持久的保存下来
6、ORACLE中事物的边界问题:
1>什么时候开始:
a、通过sqpplus连接到数据库服务器的时候
b、当一个事务事意味着另一个事务开始
2>什么时候结束:
a、执行commit(提交事务)
b、执行rollback(回滚事务)
3)回滚到指定的地方
a、设置回滚点
savepoint a,savepoint b,savepoint c
b、回滚到指定的回滚点(当前的回滚点不会被删除)
rollback to a; a 的回滚点不删除,a以后的回滚点都删除了
如果后面的回滚点设置的名字与前面的回滚点设置的名字相同就把前面的
a)提交事务(commit)
(1)所有的数据信息都写入到了数据库
(2)之前的所有操作都丢失了
(3)所有的用户都可以访问该数据
(4)作用于数据上的锁释放了
(5)所有的回滚点都擦除了
b)回滚事务(rollback)
(1)之前的所有操作都丢失了
(2)所有的用户都可以访问该数据
(3)作用于数据上的锁释放了
(4)所有的回滚点都擦除了
c)回滚到指定的回滚点
(1)通过savepoint a 设置回滚点
(2)通过rollback to a 回滚事务
4)语句级别的回滚
一个DML语句出错,只回滚当前的语句,其他的语句不会被回滚
5>执行COMMIT语句的状态
6>执行rollback语句后的状态
注意:一个DDL,DCL语句执行的时候自动提交
NOT NULL 特殊地方:
1、拷贝表的时候 只能拷贝它的非空的约束
2、在给一个列定义约束条件的时候只能非空约束加在列上
3、增加一个新的列(只能加非空约束)表中有数据的情况下会报错
4、给一个列增加一个非空约束,只能通过修改列的命令来实现。
第十二章:
1、表结构:
1>增加一个新的列(只能加非空约束)
alter table table_name add(column_name type [default exp] [not null])
其它的约束要使用增加约束的命令来实现。
SQL> alter table yinxd_tbl1 add(age number(3))
2>修改一个列:
alter table table_name modify(column_name type [default exp] [not null])
a>将一个列的类型改变为其他类型时候,要求表中没有记录或者是该列没有数据。
b>将一个列的宽度变窄时,要求表中没有记录或者是该列没有数据。
c>给一个列增加一个默认值,只对修改以后插入的记录起作用。修改之前的不会有作用
d>给一个列增加一个非空约束的前提是表中没有数据。
SQL> alter table yinxd_tbl1 modify(age varchar2(5));
3>修改列的名称:
alter table table_name rename column old_col_name to new_col_name;
SQL> alter table yinxd_tbl1 rename column name to userName;
4>删除一个列:
alter table table_name drop column col_name;
SQL> alter table yinxd_tbl1 drop column age;
2、约束
1)增加一个约束
alter table table_name add [constraint con_name] con_type(column);(类似于表结构的约束)
给一个列增加一个非空约束,只能通过修改列的命令实现
alter table table_name modify(column type not null);
SQL> alter table yin_temp modify(id number(6) not null);
SQL> alter table yinxd_constr add constraint yinxd_constr_id_pk
2 primary key(id);
2)约束只能生效或者失效,不能更改。(失效)
alter table table_name disable constraint con_name[cascade];
主键约束:
alter table table_name disable constraint primary key[cascade];
如果主键失效同时是别的表中的外键,则此时就没有唯一,非空的约束就不能充当外键因此需要级联删除
SQL> alter table yinxd_constr disable constraint yinxd_constr_id_pk;
当处理大量的数据的时候见意先使一些主键等约束失效,插入以后再把主键设过来,如果有异常再对个别
数据进行相关的处理。避免了大量数据插不进去的情况。
3)约束只能生效或者失效,不能更改。(生效)
alter table table_name enable constraint con_name;
alter table table_name enable constraint primary key;
SQL> alter table yinxd_constr enable constraint yinxd_constr_id_pk;
一个约束生效以后验证的是表中的全部数据,而不是只验证失效以后插入的数据
4)删除约束
alter table table_name drop constraint con_name[cascade];
3、删除表
drop table table_name [cascade constraints];
[cascade constraints]:级联删除与其相关的外键约束。
4、清空表
truncate table table_name;
drop > truncate > delete
1)事务不能回滚
2)解放表空间。
5、重命名一个表
rename old_name to new_name;
同样适用于数据库中的其他对象,表,视图,sequence
alter table table_name rename to new_name:只能重命名表
6、给表加注释
comment on table table_name is 'comments......';
针对表:SQL> comment on table yinxd_new is 'this is my first comment table';
comment on column table_name.column_name is 'comments......';
针对表中的列:
SQL> comment on column yinxd_new.ID is 'this is a colum comment';
清空注释:
把is后面的''里的东西写成空,即不写即可
查看注释:
SQL> l
1* select comments from user_tab_comments
2 where lower(table_name)like 'yinxd_new';
user_tab_comments:存放的是表的注释
user_col_comments:存放的是列的注释
第十三章:SEQUENCE(只有oracle,DB2)
从user_sequences的表中查看相应的结果
没有回滚一说,不管操作是否成功,都会产生下一个值
1、sequence
sequence是数据库中一种特殊的对象,可以产生一系列"连续"的整数,(按一定的规律)
通常用来作为主键值。数据库为了提高效率会在内存中缓存一部分数据。
2、如何创建sequence:
create sequence name
[increment by n] //步长,每次增长的数
[start with n] //从哪一个开始
[{maxvalue n | nomaxvalue}]
[{minvalue n | nominvalue}]
[{cycle | nocycle}]
[{cache n | nocache }] //一次性产生指定的个数的值放在内存中
如果想保证相对的连续,可以不设缓存,如果存在意外使缓存数据丢失。使数据“不连续"
同时如果多个表同时用一个sequence可以共同使用它们的sequence。
3、如何使用sequence:
nextVal:下一个可以使用的值
currVal:当前可以使用的值,要想用current的值至少要先使用一次nextVal
select seq_yin2.nextval from dual; //查看当前使用到的值
//查看最的一个记录 的数
1 select last_number from user_sequences
2* where lower(sequence_name) like 'seq_yin2'
//查看默认的表的一些属性:
SQL> select * from user_sequences了`
2 where lower(sequence_name)like 'seq_yin';
默认缓存为20,
SQL> insert into yin_temp values(seq.nextval,'lsajfsfs',seq.currval);
4、修改 sequence
alter sequence name
一个sequence 除了起始值不能修改其它的都可以修改。
5、删除 sequence
drop sequence seq_name;
第十四章: VIEW grant create view to briup
作用: 1、对表的访问的安全
2、简化访问(相当于结构化访问)
view 也是数据库中的一种对象,可以像表一样进行CRUD操作,但是它并没有表结构,只是一条select 语句。
表现: 一张表或者是多张表的部分内容
本质上: 一条有名字的select语句。
如何创建视图:
create [or replace][force|noforce] VIEW view
[(alias[,alias])...]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]
or replace:如果有同名的视图就替换。
force/noforce:如果子查询语中当中使用到的表存在或者不存在的时候,视图是否可以成功创建。
默认值是noforce:
[WITH CHECK OPTION]:对于视图进行DML操作时,只能限于子查询当中的条件
WITH READ ONLY:表示视图只能进行select 操作
1 create or replace view yinxd_view(
2 emp_id,emp_name,emp_salary) //别名,与下面的有顺序
3 as select id,first_name,salary from s_emp
4 where id<50 //限制 只能插入id 小于50的
5 with check option
SQL> create or replace view yinxd_view(
2 emp_id,emp_name,emp_sal)
3 as select id,first_name,salary from
4 s_emp where id<50
5 with check option;
发表评论
-
SQL总结存储过程
2017-02-16 10:13 390概念 存储过程(Stored Procedure):已预编译 ... -
oracle设置定时任务job调度执行存储过程或pl/sql代码块
2017-02-16 09:53 433目前oracle数据库设置定时任务job调度一般有两种方式,分 ... -
sql大全
2013-07-12 19:02 1035经典SQL语句大全 一、基础 1、说明: ... -
Linux安装mysql——源码安装
2013-06-05 09:17 7901.假设已经有mysql-5.5.10.tar.gz以及cma ... -
hql语句集合
2013-04-21 19:13 1075/** * */ package com.b510 ... -
oracle命令导入dmp文件与给用户受权
2012-05-03 15:57 1016创建账号:CREATE USER vdrs IDENTIFIE ... -
oracle对日期进行操作
2012-03-19 15:41 1251一下心血来潮,把部分Oracle对时间的一些处理,整理了一下, ... -
如何查出同一张表中字段值重复的记录
2012-03-17 09:45 1596比如现在有一人员表(表名:peosons) 若想将姓名、身份证 ... -
数据库驱动大全
2011-12-26 09:47 929经常因为链接字符串记不住或者记错的原因浪费时间,终于有时间把常 ... -
用JSP导出ORACLE的数据表DDL
2011-12-08 10:47 1110EXPDDL.JSP <%@ page cont ... -
jsp脚本实现本分数据库
2011-12-08 10:44 889JSP导出Oracle数据表是一个在开发应用时的常用的操作,那 ... -
oracle创建id自增及相关增删改查操作
2011-11-21 16:46 989新建下载权限记录表 DOWNLOADPOPE_TAB ... -
java.sql.SQLException: Io 异常: The Network Adapter could not establish the connec
2011-10-28 15:43 1281WARN: SettingsFactory,103 - Cou ... -
oracle安装及使用
2011-10-16 23:50 921安装后数据库 1.使用plsql打开,一般选项 口 ... -
递归数
2011-10-10 17:30 1111有的情况下,我们需要用递归的方法整理数据,这才程序中很容易 ... -
mysql中递归树状结构
2011-10-10 17:20 11380在Oracle 中我们知道有一个 Hierarchic ... -
级联删除和级联修改
2011-06-22 14:08 2814曾经因为级联删除的问题浪费了N多时间,顾此在这里写下小小心得, ... -
mysql解决乱码问题?
2011-06-15 14:33 829mysql数据库,乱码解决 ... -
MySql
2011-06-14 16:12 8441.安装之后 2.创建数据库 s2sh(库名) creat ... -
数据库死锁的解释?以及什么是死锁
2011-04-25 10:41 856什么是数据库死锁 每个使用关系型数据库的程序都可能 ...
相关推荐
本压缩包"Java基础1-10章课堂代码(参考视频1.1-10.12).zip"包含了从基础到进阶的Java编程知识,对应于一系列的教学视频,从1.1到10.12,旨在帮助学习者逐步掌握Java编程的核心概念和技术。 首先,我们从第一章的...
总的来说,《电路与模拟电子技术基础》1-10章的习题答案提供了全面的练习和解析,有助于学生巩固理论知识,提升实际问题解决能力。通过反复练习和对照答案,学生不仅可以检验自己的理解程度,还能培养分析和解决问题...
707位小数 香克斯(英, 数学家)用了15年 用微机只用1小时 π值算到10亿位以上 10万汉字 所需0.19MB 存储空间 Deep blue Garry Kasparov 计算机应用基础--第一章--项目1-认识和使用计算机全文共142页,当前为第5页。...
《机械设计基础1-6章答案》涉及到的内容涵盖了机械设计基础的重要知识点,主要涉及机构运动简图的绘制、瞬心的确定以及机构自由度的分析。以下是对这些知识点的详细解释: 1. **机构运动简图**:机构运动简图是用...
【标题】"1-10章jsp大全资料" 涵盖了JSP(Java Server Pages)技术的基础到进阶的全面学习资源,这是一份针对JSP开发者的详尽教程,旨在帮助学习者系统性地掌握JSP的核心概念与实践技巧。10个章节的内容可能包括了...
Chap10-model nonideal reactors_418109865.ppt Chap11-13 总结- chengyi_17709129.ppt Chap11-CatalysisCatalyticReactors-110508_555708295.ppt Chap12-ExternalDiffusion_810701519.ppt Chap13-InternalDiffusion...
计算机网络基础章节练习题答案1-10章全.doc
6. **第十一章:数据库基础**: - 数据库系统概念:数据库、数据库管理系统、数据库模式。 - 数据模型:关系模型、实体-关系模型。 - SQL语言基础:数据查询、插入、更新、删除。 - 数据库安全性、完整性和并发...
Python程序设计基础课(1-5章) Python程序设计基础课(6-10章)下分享回 zip格式
计算机应用基础(windows 7+office 2010)课件 第一章 计算机基础知识.ppt 计算机应用基础(windows 7+office 2010)课件 第七章 常用工具软件简介.ppt 计算机应用基础(windows 7+office 2010)课件 第三章 Windows...
资料目录 基础地质学教学课件 00 绪论.ppt 基础地质学教学课件 01 地球形成与演化.ppt 基础地质学教学课件 02 地质年代与地层系统.ppt 基础地质学教学课件 03 地球的物理性质和...基础地质学教学课件(1-14章)打包.zip
10.内网渗透(十)之内网信息收集-编写自动化脚本收集本地信息 11.内网渗透(十一)之内网信息收集-内网IP扫描和发现 12.内网渗透(十二)之内网信息收集-内网端口扫描和发现 13.内网渗透(十三)之内网信息收集-收集域环境...
计算机应用数学-高职计算机大类专业基础全书电子教案1-10章全.doc
接上次的 Python程序设计基础课(1-5章) 后续分享 Python程序设计基础课(6-10章) zip格式 PPT课件
第六章 大数据存储基础-1 第六章 大数据存储基础-2 第六章 大数据存储基础-3 第六章 大数据存储基础-4 第六章 大数据存储基础-5 第六章 大数据存储基础-6 第七章 容灾备份技术基础-0 第七章 容灾备份技术基础-1 第七...
#### 第一章:基础知识 - **判断题**: - 1-4:√×√√ #### 第二章:基本控制结构与编程技巧 - **判断题**: - 1-5:√××√√ - 6-10:××√√√ - 11-15:×√√×√ - **代码优化题**: - **题目**:...
### Go语言0基础学习笔记之1-10章 #### 前言 Go语言,又称Golang,是一种开源的编程语言,旨在提供简洁、高效、可靠的编程体验。本章节将带您深入了解Go语言的发展历程及其核心设计理念。 #### 一、B语言 - **B...