normal 、sysdba、 sysoper的区别:
normal 是普通用户
另外两个,你考察他们所具有的权限就知道了
sysdba拥有最高的系统权限
sysoper主要用来启动、关闭数据库,sysoper 登陆后用户是 public
sysdba登陆后是 sys
通过SYSDBA权限登录,给自己分配一个帐户
create user 用户名 identified by 密码
创建表:
语法格式:CREATE TABLE命令
CREATE TABLE table_name
(
column_name1 column_properties,
column_name2 column_properties,
column_name3 column_properties,
column_name4 column_properties
)
参数:
table_name
指定表在数据库中的唯一名称。
column_name
指定列在表中的唯一名称。
column_properties
指定列属性,包括定义该字段的数据类型、长度null或非空、和约束等。
创建一个学生信息(INFOS)表
修改表命令:ALTER TABLE
在使用表的过程中,随着数据存储需求的变化,需要修改表以满足这些变化的需求。用ALTER TABLE命令来更改、添加、除去列和约束,修改表的设计。
语法格式:
alter table 表名
modify 列名 列属性
例:修改学生座位号长度
ALTER TABLE INFOS
modify SEAT CHAR(5)
增加列命令:
alter table 表名
add 列名 列属性
–增加学生的联系方式
ALTER TABLE INFOS
ADD PHONE VARCHAR2(13)
删除列命令:
alter table 表名
drop column 列名
alter table INFOS
drop column PHONE
删除表命令:
DROP TABLE table_name
–删除表
drop table xuesheng
数据完整性约束
主键约束:PRIMARY KEY 主键约束(列值不允许为空)
主键:表中有一个列或列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。当创建或更改表时可通过定义 PRIMARY KEY 约束来创建主键。
注意:1、一个表只能有一个 primary key 约束,而且 PRIMARY KEY 约束中的列不能接受空值。
2、由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列。
当为表指定 PRIMARY KEY 约束时,系统会自动为主键列创建唯一索引强制数据的唯一性。
3、当在查询中使用主键时,该索引可以用来加快对数据访问。
4、如果 PRIMARY KEY 约束定义在不止一列上,则一列中的值可以重复,但 PRIMARY KEY 约束定义中的所有列的组合的值必须唯一。即复合主键
例:PRIMARY KEY([col1],[col2])
创建学生表
create table student
(
id number(4) primary key,
username char(8),
sex char(2),
age number(2) default ‘29’ ,
tel number(11),
bjid number(4)
)
或 如下:
–添加约束
语法:alter table 表名 add [constraint 约束名] 约束类型(字段名) [外键的引用]
alter table student
add constraint student_pk primary key(id)
外键约束:FOREIGN KEY
外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。
通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键。
语法:
constraint 外键名 foreign key(列名)
references 表名(列名)
创建学生表
create table student
(
id number(4) primary key,
username char(8),
sex char(2) not null,
age number(2),
tel number(11),
classno varchar2(10),
constraint student_fk foreign key(classno) references classes(classno)
)
–班级
create table classes(
classno varchar2(10) primary key,
class_name varchar2(20)
)
或者
alter table STUDENT
add constraint AAA foreign key (CLASSNO)
references CLASSES (CLASSNO);
唯一性约束:UNIQUE
可使用 UNIQUE 约束确保在非主键列中不输入重复值。尽管 UNIQUE 约束和 PRIMARY KEY约束都强制唯一性,但在强制下面的唯一性时应使用 UNIQUE 约束而不是 PRIMARY KEY 约束:
• 非主键的一列或列组合。
一个表可以定义多个 UNIQUE 约束,而只能定义一个 PRIMARY KEY 约束。
• 允许空值的列。
允许空值的列上可以定义 UNIQUE 约束,而不能定义 PRIMARY KEY 约束。
语法格式:unique(column_name)
create table student_info
(
id number(4) ,
username char(8),
sex char(2) ,
age number(2) ,
tel number(11),
class_no number(4),
constraint unq_username unique(username)
)
或者
alter table student_info
add constraint unq_username unique(username)
检查约束:CHECK 检查约束
CHECK 约束通过限制输入到列中的值来强制域的完整性。这与 FOREIGN KEY 约束控制列中数值相似。区别在于它们如何判断哪些值有效:FOREIGN KEY 约束从另一个表中获得有效数值列表,CHECK 约束从逻辑表达式判断而非基于其它列的数据。
创建学生表
create table student
(
id number(4) ,
username char(8),
sex char(2),
age number(2) ,
tel number(11),
class_no number(4),
constraint sex_c1 check(sex = ‘01’ or sex= ‘02’)
)
或者
alter table student
add constraint sex_c1
check (sex=‘01’ or sex=‘02’);
缺省约束:DEFAULT 缺省约束
此约束将使指定列的值为缺省。DEFAULT约束将确保存储有一个值。
语法格式:列名 default(默认值)
create table classes(
class_no varchar2(10) primary key,
class_name varchar2(20) default(‘默认一班’)
)
插入时就插入序号即可
数据操纵语言(DML)
数据操纵语言(DML)用于对数据库的表中数据进行添加、修改、删除和SELECT…For UPDATE(后面专门学习该查询)操作。
简单查询
SELECT *|列名|表达式 FROM 表名 WHERE 条件 ORDER BY 列名
语法解析:
- 表示表中的所有列。
- 列名可以选择若干个表中的列名,各个列表中间用逗号分隔。
- 表达式可以是列名、函数、常数等组成的表达式。
- WHERE子句是查询的条件。
- ORDER BY 要求在查询的结果中排序,默认是升序。
Oracle中可以把查询的结果根据结果集中的表结构和数据形成一张新表。
语法结构:根据结果集创建表
CREATE TABLE 表名 AS SELECT语句
SQL> CREATE TABLE INFOS1 AS SELECT * FROM INFOS;
使用上面命令创建的新表中,不存在任何约束,并且把查询的数据一起插入到新表中。如果只复制表结构,只需使查询的条件不成立(比如where 1=2),就不会查询从出任何数据,从而复制一个表结构。
代码演示:复制表结构
SQL> CREATE TABLE INFOS2 AS SELECT * FROM INFOS WHERE 1=2;
数据插入
用INSERT命令完成对数据的插入
INSERT INTO 表名(列名1,列名2……) VALUES (值1,值2……)
语法解析: - 列名可以省略。当省略列名时,默认是表中的所有列名,列名顺序为表定义中列的先后顺序。
- 值的数量和顺序要与列名的数量和顺序一致。值的类型与列名的类型一致。
SQL> INSERT INTO INFOS VALUES (
2 ‘s100102’, ‘林冲’, ‘男’, 22, 2,
3 TO_DATE(‘2009-8-9 06:30:10’,’ YYYY-MM-DD HH24:MI:SS '),
4 ‘西安’, ‘1001’
5 )
1 row inserted
SQL> INSERT INTO INFOS VALUES (
‘s100104’,‘王小二’,‘男’,26,3,SYSDATE,default,‘1001’);
1 row inserted
SQL>COMMIT;
代码解析:
① 表名后面缺省了列名,默认是表Infos中的所有列名,values中的值要与表中列一一对应,包括顺序和数据类型的对应。
② 在Oracle中,日期是国际化的,不同的区域安装的数据库,默认的日期格式不同,因此为了程序便于移植,日期的输入要使用TO_DATE函数对日期格式化后输入,采用格式化字符串对日期进行格式化时,格式化字符串中字符不区分大小写,常见的格式化字符如下: - yyyy表示四位年份
- mm表示两位月份,比如3月表示为03
- dd表示两位日期
- hh24表示小时从0-23,hh12也表示小时从0-11。
- mi 表示分钟
- ss表示秒
③ 在遇到存在默认值的列时,可以使用default值代替。
④ commit是把用户操作(添加、删除、修改操作)提交,只有提交操作后,数据才能真正更新到表中,否则其他用户无法查询到当前用户操作的结果。
在Oracle中,一个INSERT命令可以把一个结果集一次性插入到一张表中。使用的语句是:INSERT INTO 表 SELECT子句,如下示例:
SQL> INSERT INTO INFOS2 SELECT * FROM INFOS;
5 rows inserted
在这种语法下,要求结果集中每一列的数据类型必须与表中的每一列的数据类型一致,结果集中的列的数量与表中的列的数量一致。比如表INFOS2,该表的结构与INFO表一样,那么可以把INFO表中的所有记录一次性插入到INFOS2表中。
SQL> INSERT INTO INFOS
SELECT ‘s100106’,‘卢俊义’,‘男’,23,5,
TO_DATE(‘2009-8-9 08:00:10’,‘YYYY-MM-DD HH24:MI:SS’),
‘青龙寺’,‘1001’
FROM DUAL;
1 rows inserted
SQL>COMMIT;
更新数据
Oracle在表中更新数据的语法是:
UPDATE 表名 SET 列名1=值,列名2=值…… WHERE 条件
SQL> UPDATE INFOS SET CLASSNO=‘1002’,STUADDRESS=‘山东莱芜’
WHERE STUNAME=‘阮小二’;
1 rows updated
SQL> commit;
删除数据
Oracle在表中删除数据的语法是:
DELETE FROM表名 WHERE 条件
SQL> DELETE FROM INFOS WHERE STUID=‘s100103’;
1 ROW DELETED
SQL> COMMIT;
在数据库操作中, TRUNCATE命令(是一个DDL命令)可以把表中的所有数据一次性全部删除,语法是:
TRUNCATE TABLE 表名
TRUNCATE和DELETE都能把表中的数据全部删除,他们的区别是:
1.TRUNCATE是DDL命令,删除的数据不能恢复;DELETE命令是DML命令,删除后的数据可以恢复。
2.如果一个表中数据记录很多,TRUNCATE相对DELETE速度快。
由于TRUNCATE命令比较危险,因此在实际开发中,TRUNCATE命令慎用。
操作符
算术运算
Oracle中的算术运算符,有+、-、、/四个,其中除号(/)的结果是浮点数。求余运算只能借助函数:MOD(x,y):返回x除以y的余数。
附表:
案例:每名员工年终奖是2000元,请显示基本工资在2000元以上的员工的月工资,年总工资。
SQL> SELECT ENAME,SAL,(SAL12+2000) FROM EMP WHERE SAL>2000;
ENAME SAL (SAL*12+2000)
JONES 2975 37700
BLAKE 2850 36200
CLARK 2450 31400
SCOTT 3000 38000
KING 5000 62000
FORD 3000 38000
关系运算和逻辑运算
Oracle中Where子句经中经常见到关系运算和逻辑运算,常见的关系运算有:
逻辑运算符有三个:AND、OR、NOT
字符串连接操作符(||):
在Oracle中,字符串的连接用双竖线(||)表示。比如,在EMP表中,查询工资在2000元以上的姓名以及工作
SQL> SELECT (ENAME || 'is a ’ || JOB) AS “Employee”
2 FROM EMP
3 WHERE SAL>2000;
Employee Details
JONESis a MANAGER
BLAKEis a MANAGER
CLARKis a MANAGER
SCOTTis a ANALYST
KINGis a PRESIDENT
FORDis a ANALYST
6 rows selected
或者
–去掉双引号
select (ename || 'is a ’ || job) as employee from emp
–去掉AS
select (ename || 'is a ’ || job) employee from emp
高级查询
分组查询
Oracle提供了大量的分组函数,在这里给大家介绍最常用的五个分组函数:
MAX:该函数用于取得列或表达式的最大值,它适用于任何数据类型。
MIN:该函数用于取得列或表达式的最小值,它适用于任何数据类型。
AVG:该函数用于取得列或表达式的平均值,它只适用于数字类型。
SUM:该函数用于取得列或表达式的总和,它只适用于数字类型。
COUNT:该函数用于取得总计的行数。
例:
–显示每个部门的工资总和
select a.deptno, sum(a.sal) from scott.emp a group by deptno
–having 条件子句用于将分组后的结果进行过滤(即二次筛选)
select a.deptno, sum(a.sal) from scott.emp a where a.sal>2000 group by deptno having sum(sal)>3000
消除重复行
例:
SQL> SELECT DISTINCT DEPTNO FROM EMP;
DISTINCT
30
20
10
也可使用:SELECT DISTINCT * FROM EMP
NULL操作
如果某条记录中有缺少的数据值,就是空值(NULL值)。空值不等于0或者空格,空值是指未赋值、未知或不可用的值。任何数据类型的列都可以包括NULL值,除非该列被定义为非空或者主键。
例:
SQL> SELECT ENAME,JOB,SAL,COMM FROM EMP WHERE SAL<2000;
在查询条件中NULL值用IS NULL作条件,非NULL值用NOT IS NULL做条件。
例:
SQL> SELECT ENAME,JOB,SAL,COMM FROM EMP
WHERE SAL<2000 AND COMM IS NULL;
IN 操作:
在Where子句中可以使用IN操作符来查询其列值在指定的列表中的行。比如:查询出工作岗位是SALESMAN/售货员、PRESIDENT/总裁或者ANALYST/化验员的员工。条件有两种表示方法:
- WHERE job = 'SALESMAN ’ OR job = 'PRESIDENT ’ OR job = 'ANALYST ’
- WHERE job IN (‘SALESMAN’, ‘PRESIDENT’, ‘ANALYST’)
对应IN操作的还有NOT IN,用法一样,结果相反。
BETWEEN…AND…
在WHERE子句中,可以使用BETWEEN操作符来查询列值包含在指定区间内的行。比如,查询工资从1000到2000之间的员工。可以使用传统方法:
WHERE SAL>=1000 AND SAL<=2000
也可以使用:
WHERE SAL BETWEEN 1000 AND 2000BWTWEEN操作所指定的范围也包括边界。
例:
SQL> SELECT ename,job,sal FROM EMP WHERE sal BETWEEN 1000 AND 2000;
LIKE模糊查询
在一些查询时,可能把握不准需要查询的确切值,比如百度搜索时输入关键字即可查询出相关的结果,这种查询称为模糊查询。模糊查询使用LIKE关键字通过字符匹配检索出所需要的数据行。字符匹配操作可以使用通配符“%”和“_”:
%:表示零个或者多个任意字符。
_:代表一个任意字符。
语法是:LIKE ‘字符串’[ESCAPE ‘字符’]。匹配的字符串中,ESCAPE后面的“字符”作为转义字符。
例:
SQL> SELECT ENAME,JOB,SAL FROM EMP WHERE ENAME LIKE ‘J%S’;
集合运算
集合运算就是将两个或者多个结果集组合成为一个结果集。集合运算包括:
INTERSECT(交集),返回两个查询共有的记录。
UNION ALL(并集),返回各个查询的所有记录,包括重复记录。
UNION(并集),返回各个查询的所有记录,不包括重复记录。
当使用集合操作的时候,要注意:查询所返回的列数以及列的类型必须匹配,列名可以不同。
例:
SELECT ename,sal,job FROM emp WHERE sal>2500
UNION
SELECT ename,sal,job FROM emp WHERE job=’MANAGER’;
SELECT ename,sal,job FROM emp WHERE sal>2500
UNION ALL
SELECT ename,sal,job FROM emp WHERE job=‘MANAGER’
SELECT ename,sal,job FROM emp WHERE sal>2500
INTERSECT
SELECT ename,sal,job FROM emp WHERE job=’MANAGER’;
连接查询
在SQL中内联接(inner join)、外联接(outer join),外联接又分为左外联接(left outer join)和右外联接(right outer join)。Oracle中对两个表或者若干表之间的外联接用(+)表示。
例:
SQL> SELECT e.ENAME,e.JOB,e.SAL,d.DNAME
FROM emp e,dept d
WHERE e.deptno=d.deptno
AND e.SAL>2000;
也可以使用SQL/92标准中的内联接
SELECT e.ENAME,e.JOB,e.SAL,d.DNAME
FROM EMP e INNER JOIN DEPT d ON e.DEPTNO=d.DEPTNO
WHERE e.SAL>2000
外联接
外连接则是内连接的扩展,它不仅会返回满足连接条件的所有记录,而且还会返回不满足连接条件的记录
例:
SELECT e.ENAME,e.JOB,e.SAL,d.DNAME
FROM EMP e ,DEPT d
WHERE e.DEPTNO(+)=d.DEPTNO
(+):Oracle专用的联接符,在条件中出现在左边指右外联接,出现在右边指左外联接。
也可以使用SQL/92标准的写法:
SELECT e.ENAME,e.JOB,e.SAL,d.DNAME
FROM EMP e RIGHT OUTER JOIN DEPT d ON e.DEPTNO=d.DEPTNO
注:虽然Oracle自身的联接查询语法比较好写,同时容易理解,但是为了程序便于移植,推荐使用SQL/92表中的联接查询。同时也可以与SQL Server获得一致。
左外链接与右外连接的区别:
一、数据bai集合不同
1、左外连接:是A和B的交集再并上A的所有数据。
2、右外连接:是A和B的交集再并上B的所有数据。
语法不同
1、左外连接:SELECT *FROM aLEFT OUTER JOIN bON a.ageId
= b.id
。
2、右外连接:SELECT *FROM aright OUTER JOIN bON a.ageId
= b.id
。
运算方式不同
1、左外连接:其运算方式为:A左连接B的记录=图3公共部分记录集C+表A记录集A1。
2、右外连接:其运算方式为:A右连接B的记录=图3公共部分记录集C+表B记录集B1 。