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

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等语句。

在这里插入图片描述

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语句

在这里插入图片描述

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;
发布了28 篇原创文章 · 获赞 2 · 访问量 1470

猜你喜欢

转载自blog.csdn.net/weixin_44514198/article/details/105653443