关系数据库标准语言SQL

2021/11/20 19:12:03

本文主要是介绍关系数据库标准语言SQL,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

3、关系数据库标准语言SQL

SQL 基本语法

数据查询(DQL):SELECT
数据定义(DDL):CREATE,DROP,ALTER
数据操纵(DML):INSERT,UPDATE,DELETE
数据控制(DCL):GRANT,REVOKE

3.1数据查询

单表查询

3.1.1 查询列:

  • 查询指定列:
# 例:查询全体学生的学号与姓名
SELECT Sno,Sname
FROM Student;
  • 查询所有列:(将<目标列表达式>指定为 *)
# 例:查询全体学生的详细记录。
SELECT *
FROM Student as Stu;  	# as 取别名,可省略
  • 查询结果计算的值:
# 例:查全体学生的姓名及其出生年份
SELECT Sname,2012-Sage /*假定当年的年份为 2012 年,减去年龄即得出生年份*/
FROM Student;

3.1.2 查询行(元组)

  • 取消取值重复的行:(指定 DISTINCT 关键词,去掉表中重复的行)
#  例:查询选修了课程的学生号码
SELECT DISTINCT Sno     #(使用 DISTINCT 关键词取消了重复学号的行)
FROM SC;
  • 查询满足条件的行:(WHERE 语句)
    在这里插入图片描述
 # 例:查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。*(确定集合)*
 SELECT Sname,Ssex
 FROM Student
 WHERE Sdept IN ( 'IS','MA','CS' );
# 例:查询学号为 200215121 的学生的详细情况。*(字符匹配)*
SELECT *  
 FROM Student 
 WHERE Sno LIKE '200215121'; 	# % 可以代替多个字符, 但是_只能替换⼀个字符
# 例:某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。*(空值)*
SELECT Sno,Cno
 FROM SC
 WHERE Grade IS NULL    /*不能用'='代替 IS*/

3.1.3 GROUP BY子句

# GROUP BY分组 ,如果要进⾏筛选,请使⽤Having

3.1.4 ORDER BY子句

 #例:查询选修了 3 号课程的学生的学号及其成绩,查询结果按分数降序排列。
 SELECT Sno,Grade
 FROM SC
 WHERE Cno= ' 3 '
 ORDER BY Grade DESC	# 可以按一个或多个属性列排序。升序:ASC;降序:DESC;缺省值为升序

3.1.4 聚集函数

函数说明
AVG()返回某列的平均值
COUNT()返回某列的行数
MAX()返回某列的最大值
MIN()返回某列的最小值
SUM()返回某列之和
# 例:计算 1 号课程的学生平均成绩。
SELECT AVG(Grade)
FROM SC
WHERE Cno= ' 1 ';

多表查询.

3.1.5等值查询

# 例:查询每个学生及其选修课程的情况
SELECT Student.*,SC.*
FROM Student,SC
WHERE Student.Sno = SC.Sno;

3.1.6 嵌套查询

IN 谓词的子查询:

# 例:查询与“刘晨”在同一个系学习的学生
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
	(SELECT Sdept
	FROM Student
	WHERE Sname='刘晨' );

比较运算符的子查询:(当内查询的结果是一个值时,可以用=代替 IN)

#例:查询与“刘晨”在同一个系学习的学生
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept =
 	(SELECT Sdept
 	FROM Student
	WHERE Sname='刘晨');

有 ANY 或 ALL 谓词的子查询

在这里插入图片描述

#例:查询其他系中比计算机科学某一学生年龄小的学生姓名和年龄
SELECT Sname,Sage
FROM Student
WHERE Sage < ANY (SELECT Sage
 			FROM Student
 			WHERE Sdept= ' CS ')
 	 AND Sdept <> 'CS ' ; /*这句是父查询块中的条件 */

EXISTS 谓词的子查询:

相当于存在量词∃,有 EXISTS 谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。

# 例:查询所有选修了 1 号课程的学生姓名。
SELECT Sname
FROM Student
WHERE EXISTS	# exists 如果后⾯的⼦查询有值,返回1 否则为0;not exists 相反
	(SELECT *
 	FROM SC
 	WHERE Sno=Student.Sno AND Cno= ' 1 ');

3.1.7集合查询

集合操作的种类:并操作 UNION,交操作 INTERSECT,差操作 EXCEPT

#例:查询计算机科学系的学生及年龄不大于 19 岁的学生。(并)
SELECT *
 FROM Student
 WHERE Sdept= 'CS'
 UNION	# 并操作
 SELECT *
 FROM Student
 WHERE Sage<=19;

3.2 数据定义

操作方式创建删除修改
模式CREATE SCHEMADROP SCHEMA
CREATE TABLEDROP TABLEALTER TABLE
视图CREATE VIEWDROP VIEW
索引CREATE INDEXDROP INDEXALTER INDEX

3.2.1模式

CREATE SCHEMA <模式名> AUTHORIZATION <用户名>;
DROP SCHEMA<模式名>< CASCADE| RESTRICT>;	

删除模式, 其中 CASCADE 和RESTRICT 必须⼆选⼀,
CASCADE是(级联) 删除模式的同时也把该模式的所有数据库对象删除.
RESTRICT(限制) 如果该模式下有下属对象,⽐如表视图 就拒绝这个删除语句的执⾏

3.2.2 表

约束

常用完整性约束
主码约束PRIMARY KEY
用户定义CHECK
默认值DEFAULT
唯一性约束UNIQUE
非空值约束NOT NULL
参照完整性约束FOREIGN KEY

1定义

# 创建表 
create table 表名( 字段名 类型 字段约束(列级完整性约束条件), 
                  字段名 类型 字段约束, 
                  字段名 类型 字段约束,
                 <表级完整性约束条件>)
# 例: 
CREATE TABLE  SC
       	(Sno  CHAR(9),
       	Cno  CHAR(4),  
       	Grade  SMALLINT check(Grade>=0 and Grade<=100),,
       	PRIMARY KEY (Sno,Cno),     -- 主码由两个属性构成,必须作为表级完整性进行定义
       	FOREIGN KEY (Sno) REFERENCES Student(Sno), -- 表级完整性约束条件,Sno是外码,被参照表是Student 
       	FOREIGN KEY (Cno) REFERENCES Course(Cno) -- 表级完整性约束条件, Cno是外码,被参照表是Course
		); 
		
CREATE TABLE Ss
(
Sno INT PRIMARY KEY AUTO_INCREMENT,	#  AUTO_INCREMENT实现自动编号
Sname CHAR(20) UNIQUE
);

2 删除

DROP TABLE<表名> [RESTRICT| CASCADE];
# 例: 
DROP TABLE Student CASCADE

CASCADE呢 是如果表有外键,视图 触发器的话,也会强⾏删除, RESTRICT恰恰相反哦

3 修改

ALTER TABLE<表名>
[ADD [COLUMN] <新列名><数据类型>[完整性约束] #增
[MODIFY [COLUMN] <列名> <数据类型> [完整性约束] #改
[DROP [COLUMN] <列名>] #删
# 例: 
ALTER TABLE Student ADD COLUMN Etime date;
ALTER TABLE Student MODIFY COLUMN Etime int default 0;  # default将属性的默认值改为0
ALTER TABLE Student DROP COLUMN Etime;

4 修改表名

ALTER TABLE <旧表名> RENAME [TO] <新表名>;

3.2.3 视图

1 建立

视图(VIEW)也被称作虚表,即虚拟的表,是⼀组数据的逻辑表示,其本质是对应于⼀条SELECT语句
结果集被赋予⼀个名字,即视图名字。
视图本身并不包含任何数据,它只包含映射到基表的⼀个查询语句,当基表数据发⽣变化,视图数据也会发生变化

CREATE VIEW<视图名>[(<列名>[,<列名>]…)]
AS<子查询>
[WITH CHECK OPTION]    # 加了WITH CHECK OPTION 可以防⽌⽤户对 不属于试图范围的操作 进⾏拒绝

2 删除

DROP VIEW <视图名> [CASCADE]

3 查询

  select * from view <视图名>

4 更新

视图是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,在对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表。

UPDATE IS_Student #<视图名>
SET Sname='刘辰'
WHERE Sno='201215122';
# 转换后的更新语句为
UPDATE Student #<表名>
SET Sname='刘辰'
WHERE Sno='201215122' AND Sdept='IS';

3.2.4索引

创建索引,可以在查询的过程中,提高系统的性能,索引可以建⽴在⼀列或者多列上

1 建立

CREATE[ UNIQUE] INDEX<索引名>	# UNIQUE 唯⼀索引
ON<表名(<列名>[<次序>][,<列名>[<次序>]]…)
# 例: 
CREATE UNIQUE INDEX Stusno ON Student(Sno)

2 修改

ALTER INDEX<旧索引名> RENAME TO<新索引名>;

3 删除

DROP INDEX<索引名> on <表名>;

3.3 数据操纵

3.3.1 插入

insert into 表名 [( 字段列表 )] values( 值列表 ...);

3.3.2 修改

update 表名 set 字段 1= 值 1, 字段 2= 值 2, 字段 n= 值 n... where 条件

3.3.3 删除

 delete from 表名 [where 条件 ]


这篇关于关系数据库标准语言SQL的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程