欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Oracle学习-SQL语言分类、PL/SQL、SQL基础

程序员文章站 2022-05-09 10:42:01
...

1. SQL语言分类

1)数据定义语言(Data Definition Language, DDL)
用于定义数据库对象,对数据库、数据库中的表、视图、索引等数据库对象进行建立和删除,DDL包括CREATE、ALTER和DROP等语句。

2)数据操纵语言(Data Manipulation Language, DML)
用于对数据库中的数据进行插入、修改和删除等操作,DML包括INSERT、UPDATE和DELETE等语句。

3)数据查询语言(Data Query Language, DQL)
用于对数据库中的数据进行查询操作,例如用SELECT语句进行查询操作。

4)数据控制语言(Data Control Language, DCL)
用于控制用户对数据库的操作权限,DCL包括GRANT、REVOKE等语句。

Oracle学习-SQL语言分类、PL/SQL、SQL基础

2. PL/SQL

2.1 PL/SQL的语法约定

PL/SQL 不区分大小写
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200421110646389.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDUxNDE5OA==,size_1,color_FFFFFF,t_70

2.2 在SQL Developer中执行PL/SQL语句

Oracle学习-SQL语言分类、PL/SQL、SQL基础

3. SQL基础

3.1 查询

3.1.1. 普通查询

SELECT 列名1,列名2 …… FROM 表名;
范例:查询所有列

SELECT * FROM emp;

3.1.2. 多表查询

SELECT 列名1,列名2 …… FROM 表名1,表名2 WHERE 关联条件 AND 过滤条件;
范例:

SELECT * FROM emp e, dept d WHERE e.deptno=d.deptno;

SELECT e.ename, e.sal, s.grade FROM emp e, salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal;

SELECT e.empno, e.ename, e.mgr, m.ename FROM emp e, emp m WHERE e.mgr=m.empno

3.1.3.去掉重复行

去掉结果集中的重复行可使用DISTINCT关键字,其语法格式如下。
语法格式:
SELECT DISTINCT <列名> [,<列名>… ]
查询student表中sclass列,消除结果中的重复行。

SELECT DISTINCT sclass
FROM student;

3.1.4 分组查询和统计计算

1.聚合函数

聚合函数实现数据的统计计算,用于计算表中的数据,返回单个计算结果。聚合函数包括COUNT、SUM、AVG、MAX和MIN等函数,下面分别介绍。

1) COUNT函数
COUNT函数用于计算组中满足条件的行数或总行数。

查询201236班学生的总人数。

SELECT COUNT( * ) AS总人数
FROM student
WHERE sclass= '201236';

2)SUM和AVG函数
SUM函数用于求出一组数据的总和,AVG函数用于求出一组数据的平均值,这两个函数只能针对数值类型的数据。

查询1004课程的平均分。

SELECT AVG (grade) AS课程1004平均分
FROM score
WHERE cno= '1004' ;

3)MAX和MIN函数
MAX函数用于求出一组数据的最大值,MIN函数用于求出一-组数据的最小值,这两个函数都可以适用于任意类型数据。

查询 8001课程的最高分、最低分和平均成绩。

SELECT MAX(grade) AS课程8001最高分,MIN(grade) AS课程8001最低分,AVG(grade) AS课程
8001平均成绩
FROM score
WHERE cno= '8001';
2. GROUP BY子句

GROUPBY子句用于指定需要分组的列。

查询各个班级的人数。

SELECT sclass AS班级,COUNT() AS人数
FROM student
GROUP BY sclass;

注意:如果SELECT子句的列名表包含聚合函数,则该列名表只能包含聚合函数指定的列名和GROUP BY子句指定的列名。聚合函数常与GROUP BY子句一起使用。

3. HAVING 子句

HAVING子句用于对分组按指定条件进一步进行筛选,过滤出满足指定条件的分组。

语法格式:
[ HAVING <条件表达式> ]
其中,条件表达式为筛选条件,可以使用聚合函数。

注意: HAVING子句可以使用聚合函数,WHERE子句不可以使用聚合函数

当WHERE子句、GROUP BY子句、HAVING子句和ORDER BY子句在一个SELECT语句中时,执行顺序如下。
(1)执行WHERE子句,在表中选择行。.
(2)执行GROUP BY子句,对选取行进行分组。
(3)执行聚合函数。
(4)执行HAVING子句,筛选满足条件的分组。
(5)执行ORDERBY子句,进行排序。

注意: HAVING子句要放在GROUP BY子句的后面,ORDER BY子句放在HAVING子句后面

查询平均成绩在90分以上的学生的学号和平均成绩。

SELECT sno AS学号, AVG(grade) AS 平均成绩
FROM score
GROUP BY sno
HAVING AVG( grade)> 90;

3.2 运算符

1. 运算符

算数运算符:+ - * / (数字和日期)
范例:

SELECT hireate+1 FROM emp;

2. 空值:

无效或未指定的值,不可以进行算数运算
nvl(空值列,指定值)

4. 连接符 ||

列与列的连接,列与字符串的连接,字符串用单引号

SELECT 'id: ’ || empno || ', name is|| ename FROM emp;

5. 去掉重复行DISTINCT,只能放在第一列前面

SELECT DISTINCT ename FROM emp;

6. 修改列名(as可写可不写)

SELECT 列名1 (as) 列别名1,列名2 (as) 列别名2, …… FROM 表名;
列别名为关键字时可以加双引号

SELECT sal+1fromFROM emp;

7. 排序,默认是升序

SELECT 列名1 (as) 列别名1,列名2 (as) 列别名2, …… FROM 表名 ORDER BY 排序列名1, 排序列名2 ASC | DESC;

ASC 表示升序排列,它是系统默认排序方式,DESC表示降序排列。

提示:排序操作可对数值、日期和字符3种数据类型使用,ORDER BY子句只能出现在整个SELECT语句的最后

8. 过滤,WHERE 条件,在排序前面

9. 比较运算符:>, <, =, <=, >=, !=,<>

BETWEEN AND
LIKE
%:代表任意数量的任意字符
_:表示一个字符
IN:某个范围内中的任意一个值
IS NULL:是空

查询goods表中价格在1500元到4000元之间的商品。

SELECT*
FROM goods
WHERE price BETWEEN 1500 AND 4000;

查询goods表中商品名称含有Inspiron的商品。

SELECT *
FROM goods
WHERE gname LIKE '%Inspiron%';

查询已选课但未参加考试的学生情况。

SELECT *
FROM score
WHERE grade IS null; .

10. 逻辑运算符:

AND
OR
NOT
三者之中,NOT优先级最高,AND次之,OR优先级最低

范例:查询工资大于800,并且小于1000的员工信息

SELECT * FROM emp WHERE sal>800 AND sal<1000;

范例:查询工资在800到1500之间的雇员的所有信息

SELECT * FROM emp WHERE sal BETWEEN 800 AND 1500;

范例:查询姓名中没有A的员工信息

SELECT * FROM emp WHERE ename not llike ‘%A%;

3.3 函数

1. 单行函数:
字符,数值,日期,转换,通用函数

3. 多行函数
a. 字符函数:
i. 大小写控制函数(lower,upper,initcap-首字母大写,其他小写)
ii. 字符控制函数(concat,substr,length,instr-查找,lpad-左填充,rpad,trim-截取左右2端)
SELECT lpad(sal, 10, ‘’) FROM emp; 不够10位的,用填充
SELECT TRIM(‘H’ FROM ‘Hello Hello world’) FROM dual;

b. 数字函数
round-小数点后几位,trunc-截取,不四舍五入,mod-余数

SELECT round(45.926, 2) FROM dual; //为45.93
SELECT trunc(45.926, 2) FROM dual; //为45.92

c. 日期函数:
i. sysdate:显示当前系统时间
日期可以进行算数运算
日期+数字=日期
日期-日期=天数
ii. months between
iii. add_months
iv. next_day
v. last_day:所在月份的最后一天
vi. extract:提取日期 extract(year from sysdate)

d. 转换函数
to_char:把其他类型转换成字符类型

select to_char(hiredate, ‘yyyy-mm-dd’) from emp;
select to_char(hiredate, ‘FMyyyy-mm-dd HH12:MI:SS am’) from emp; //FM-去掉前导零,HH12代表12时制,am表示上午下午

9:数字
S:美元

e. 通用函数
i. nvl
ii. nbl2
iii. decode
decode (列,条件,结果,
条件,结果,
……
[结果]
)

f. 填充函数

SELECT lpad(', 5level-1)||empno EMPNO,LPAD(’ '5LEVEL-1)\ename ENAME

3.4 连接

  1. 自然连接
  2. 左右连接

3.5 表的操作

3.5.1. 插入

注意:使用PL/SQL语言进行插入、修改和删除后,为将数据的改变保存到数据库中,应使用COMMIT命令进行提交,使用方法如下。

COMMIT;

a. 正常插入
 i. 标准(推荐)
 INSERT INTO 表名(列名1,列名2,……) VALUES(值1,值2,……)
 ii. 省略写法
 iii. INSERT INTO (SELECT empno,ename,job FROM myemp) VALUES(9000,‘张三’,‘农民’)

INSERT INTO student VALUES('121001', '刘鹏翔', '男',TO_ _DATE( '19920825', 'YYYMMDD'), '计算机',
'201205',52);

b. 利用子查询插入数据(批量操作)
INSERT INTO 表名(列名1,列名2,……) SELECT语句
范例:
向myemp表中插入一个员工信息,员工号为1122,员工姓名为“Tom22”,其他信息与员工7369的员工信息一样

INSERT INTO myemp SELECT 1122, ‘Tom22’, job, mgr, hiredate, sal, comm, deptno FROM emp WHERE empno = 7369

若要进行大量数据的插入(装载)操作,可以利用“/+APPEND/”关键字来实现

INSERT /+APPEND/ INTO myenp(empno,ename) SELECT empno,ename FROM emp

c. 向多个表插入数据
i. 无条件多表插入(多用于数据备份)
INSERT ALL
INTO 表1 VALUES(值1,值2,……)
INTO 表2 VALUES(值1,值2,……)
……
子查询
范例:

INSERT ALL
INTO myemp1 VALUES(empno,hiredate,sal)
INTO myemp2 VALUES(empno,hiredate,sal)
SELECT empno,hiredae,sal FROM emp WHERE sal>800

ii. 有条件的多表插入
INSERT ALL | FIRST
WHEN 条件1 THEN INTO 表1(列1,列2,……)
WHEN 条件2 THEN INTO 表2(列1,列2,……)
……
ELSE INTO 表n(列1,列2,……)
子查询
iii. 多表插入的应用

3.5.2. 修改

使用ALTER TABLE语句用来修改表的结构

UPDATE语句用于修改表中指定记录的列值,它的基本语法格式如下。

语法格式:
UPDATE <表名> SET <列名>= {<新值>|<表达式>} [,-n] [WHERE <条件表达式>]

在 employee表中将刘松涛的员工号改为1021, 员工地址改为东大街34号。

UPDATE employee
SET eid= '1021', address= '东大街34号'
WHERE ename= '刘松涛';

a. 增加新的列
ALTER TABLE 表名 add (列名 数据类型 default 默认值, 列名 数据类型 ……)

ALTER TABLE student
ADD remarks varchar(100) ;

b. 更改列名
ALTER TABLE 表名 rename column 现列名 to 新名;

c. 删除列
ALTER TABLE 表名 drop column 列名;

ALTER TABLE student
DROP COLUMN remarks;

d. 修改列的状态
ALTER TABLE 表名 set unused column 列名;

e. 删除无用的列
ALTER TABLE 表名 drop unused columns;

f. 表的重命名
rename 旧表名 to 新表名;

g. 为表添加注释

3. 建表
CREATE TABLE 表名(
列名 类型 [DEFAULT ‘值’],
列名 类型,
……);

3.5.4. 约束:对表的强制规定,优先建表级别

约束的分类
○ 主键约束:表示唯一的,不能为空
○ 唯一约束:表示唯一的
○ 非空约束:表示不能为空的
○ 检查约束:检查一个列的内容是否合法
○ 外键约束:
根据约束的位置进行分类:
○ 列级别约束
○ 表级别约束
范例:

○ 建立主键约束(列级别)

DROP TABLE person;
CREATE TABLE person(
pid number(5) primary key,
pname varchar(2),
page number(3),
psex varchar2(4)
);

DROP TABLE person;
CREATE TABLE person(
pid number(5) CONSTRAINT person_pid_pk PEIMARY KEY(pid),
pname varchar(2),
page number(3),
psex varchar2(4)
);

○ 建立主键约束(表级别)

DROP TABLE person;
CREATE TABLE person(
pid number(5),
pname varchar(2),
page number(3),
psex varchar2(4),
CONSTRAINT person_pid_pk PEIMARY KEY(pid,pname)
);

○ 唯一约束

DROP TABLE person;
CREATE TABLE person(
pid number(5),
pname varchar(2) unique,
page number(3),
psex varchar2(4)
);

DROP TABLE person;
CREATE TABLE person(
pid number(5),
pname varchar(2) unique,
page number(3),
psex varchar2(4),
CONSTRAINT person_pname_uk UNIQUE(pname)
);

○ 非空约束(只有列级别)

DROP TABLE person;
CREATE TABLE person(
pid number(5),
pname varchar(2) unique not null,
page number(3) not null,
psex varchar2(4)
);

○ 检查约束

DROP TABLE person;
CREATE TABLE person(
pid number(5),
pname varchar(2) unique,
page number(3) not null check(page BETWEEN 0 AND 150),
psex varchar2(4) CHECK(psex IN(‘男’, ‘女’))
};

DROP TABLE person;
CREATE TABLE person(
pid number(5),
pname varchar(2) unique,
page number(3) not null ,
psex varchar2(4) CHECK(psex IN(‘男’, ‘女’)),
CONSTRAINT person_page_ck CHECK(page BETWEEN 0 AND 150)
);

○ 外键约束

DROP TABLE department;
CREATE TABLE department(
deptno number(5) primary key,
dname varchar2(10)
);

DROP TABLE employee;
CREATE TABLE employee(
empno number(5) primary key,
ename varchar2(10),
deptno number(5) references department(deptno)
);

DROP TABLE department;
CREATE TABLE department(
deptno number(5) primary key,
dname varchar2(10)
);

DROP TABLE employee;
CREATE TABLE employee(
empno number(5) primary key,
ename varchar2(10),
deptno number(5),
CONSTRAINT employee_deptno_fk FOREIGN KEY(deptno) REFERENCES department(deptno)
);

○ 追加约束
ALTER TABLE 表名 ADD 约束

DROP TABLE person;
CREATE TABLE person(
pid number(5),
pname varchar(2),
page number(3),
psex varchar2(4)
);
ALTER TABLE person add CONSTRAINT person_pid_pk PRIMARY KEY(pid,pname);

○ 删除约束
ALTER TABLE 表名 DROP 约束

ALTER TABLE person DROP CONSTARINT person_pid_pk;
ALTER TABLE person DROP primary key;

○ 查看约束

SELECT * FROM user_constraints WHERE table_name=‘EMP’

○ 约束的禁用和启动
ALTER TABLE 表名 DISABLE CONSTAINT 约束名;
ALTER TABLE 表名 ENABLE CONSTAINT 约束名;

3.5.5. 删除数据(安全,不经过回收站)

全部删除:DETELE FROM 表名
局部删除:DETELE FROM 表名 WHERE 条件
子查询删除
在 employee表中,删除员工号为1021 的行。

DELETE FROM employee
WHERE eid= '1021' ;

注意: DELETE语句删除的是一行或多行。如果删除所有行,表结构仍然存在,即存在一个空表。

TRUNCATE TABLE语句
当需要删除一个表里的全部记录,使用TRUNCATE TABLE语句,它可以释放表的存储空间,但此操作不可回退,其语法格式如下。
语法格式:
TRUNCATE TABLE <表名>

3.5.6. 删除表(删除到回收站,可恢复)

DROP TABLE 表名

3.5.7. 从回收站里恢复表

FLASHBACK TABLE 表名

3.5.8. 从回收站中删除表

PURGE TABLE 表名;
清空回收站:purge recyclebin

3.5.9. 层次查询

CREATE TABLE bicycle(
part_id number(5)
constraint pk_bicycle_part_id primary key,
parent_id number(5)
constraint fk_bicycle_pid
references bicycle(part_id),
part_name varchar2(30) not null,
mp_cost number(9, 2),
describe varchar2(30)
);

SELECT level, column_name, expression,FROM table_name
[WHERE where_condition]
START WITH start_condition
CONNECT BY PRIOR prior_condition;
相关标签: 数据库学习