秋招 基础知识之——数据库 SQL篇

本文详细介绍了SQL的基础知识,包括基本概念、数据定义、数据查询、数据更新、空值处理、视图、存储过程、游标、触发器、事务处理、字符集和权限管理。通过学习,读者将全面理解SQL在数据库操作中的核心功能和应用场景。
摘要由CSDN通过智能技术生成

     内容参考《数据库系统概论》(第五版),以及github笔记:

https://github.com/CyC2018/Interview-Notebook/blob/master/notes/SQL.md#%E5%8D%81%E5%85%AD%E7%BB%84%E5%90%88%E6%9F%A5%E8%AF%A2

      

      结构化查询语言(Structured Query Language,SQL)是关系数据库的标准语言,也是一个通用的、功能极强的关系数据库语言。其功能不仅仅是查询,而是包括数据库模式创建、数据库数据的插入与修改、数据库安全性完整性定义与控制等一系列功能。

一、基本概念


支持SQL的关系数据库管理系统同样支持关系数据库三级模式结构。如上图,其中外模式包括若干视图(view)和部分基本表,模式包括若干基本表,内模式包括若干存储文件(stored file)。

用户可以用SQL对基本表和视图进行查询或其他操作,基本表和视图一样,都是关系。

基本表是本身独立存在的表,在关系数据库管理系统中一个关系就对应一个基本表。一个或多个基本表对应一个存储文件,一个表可以带若干索引,索引也存放在存储文件中。

存储文件的逻辑结构组成了关系数据库的内模式,存储文件的物理结构对最终用户是隐蔽的。

视图是从一个或几个基本表导出的表。它本身不独立存储在数据库中,即数据库中只存放视图的定义而不存放视图对应的数据,这些数据仍存放在导出视图的基本表中,因此视图是一个虚表。视图在概念上与基本表等同,用户可以在视图上再定义视图。

二、SQL的数据定义


一个关系数据库管理系统的实例中可以建立多个数据库,一个数据库中可以建立多个模式,一个模式下通常包括多个表、视图和索引等数据库对象。

1、模式的定义与删除

(1)定义模式

CREATE SCHEMA<模式名>AUTHORIZATION<用户名>;

例:CREATE SCHEMA TEST AUTHORIZATION WANG;

要创建模式,调用该命令的用户必须拥有数据库管理员权限,或者获得数据库管理员授予的CREATE SCHEMA的权限。

若没有指定<模式名>,则<模式名>隐含为<用户名>。

CREATE SCHEMA中可以接受CREATE TABLE,CREATE VIEW和GRANT子句。即用户可以在创建模式的同时在这个模式定义中进一步创建基本表、视图,定义授权。

CREATE SCHEMA<模式名>AUTHORIZATION<用户名>[<表定义子句>|<视图定义子句>|<授权定义子句>];
例:
CREATE SCHEMA TEST AUTHORIZATION ZHANG
CREATE TABLE TAB1(COL1 SMALLINT,
                  COL2 INT,
                  COL3 CHAR(20),
                  COL4 NUMERIC(10,3),
                  COL5 DECIMAL(5,2)
                  );

(2)删除模式

DROP SCHEMA<模式名><CASCADE|RESTRICT>;

其中CASCADE和RESTRICT两者必选其一。

CASCADE(级联),表示在删除模式的同时把该模式中所有的数据库对象全部删除;

RESTRICT(限制),表示如果该模式中已经定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行,只有当该模式中没有任何下属的对象时才能执行DROP SCHEMA语句。

2、基本表的定义、删除与修改

(1)定义基本表

CREATE TABLE<表名>(<列明><数据类型>[列级完整性约束条件]
                   [,<列明><数据类型>[列级完整性约束条件]]
                    ...
                   [,<表级完整性约束条件>]);

例:

CREATE TABLE Student
(Sno CHAR(0) PRIMARY KEY,  /*列级完整性约束条件,Sno是主码*/
Sname CHAR(20) UNIQUE,  /*Sname取唯一值*/
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
(2)数据类型


(3)修改基本表

ALTER TABLE<表名>
[ADD[COLUMN]<新列名><数据类型>[完整性约束]]
[ADD<表级完整性约束>]
[DROP[COLUMN]<列名>[CASCADE|RESTRICT]]
[DROP CONSTRAINT<完整性约束名>[RESTRICT|CASCADE]]
[ALTER COLUMN<列名><数据类型>];

(4)删除基本表

DROP TABLE<表名>[CASCADE|RESTRICT];

默认RESTRICT。

3、索引的建立与删除

(1)建立索引

CREATE [UNIQUE][CLUSTER] INDEX <索引名> ON <表名>(<列名>[<次序>][,<列名>[<次序>]]...);

次序可选ASC(升序,默认)或DESC(降序)。

UNIQUE表明此索引的每一个索引值只对应唯一的数据记录。

CLUSTER表示要建立的索引是聚簇索引。

(2)修改索引

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

(3)删除索引

DROP INDEX<索引名>;

三、SQL的数据查询

SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>]...
FROM<表名或视图名>[,<表名或视图名>...]|(<SELECT语句>)[AS]<别名>
[WHERE<条件表达式>]
[GROUP BY<列名1>[HAVING<条件表达式>]]
[ORDER BY<列名2>[ASC|DESC]];
1、单表查询

(1)选择表中的若干列

  • 查询指定列
SELECT Sno,Sname
FROM Student;
  • 查询全部列
SELECT *
FROM Student;
  • 查询经过计算的值
SELECT Sname,2018-Sage   /*查询姓名和出生年份*/
FROM Student;

不仅可以是算术表达式,还可以是字符串常量(‘字符串内容’),函数等。

LOWER(Sdept)代表用小写字母表示Sdept的内容。

(2)选择表中的若干元组

  • 消除取值重复的行
SELECT DISTINCT Sno
FROM Student;
  • 查询满足条件的元组

查询满足指定条件的元组可以通过WHERE子句实现。

①比较大小


②确定范围

BETWEEN...AND...和NOT BETWEEN...AND...可以用来查找属性值在(或不在)指定范围内的元组,其中BETWEEN后面是范围的下限,AND后面是范围的上限。

③确定集合

谓词IN和NOT IN可以用来查找属性值属于(或不属于)指定集合的元组。


④字符匹配

谓词LIKE可以用来进行字符串的匹配:

[NOT] LIKE <'匹配串'> [ESCAPE'<换码字符>']

其含义是查找指定的属性列值与<匹配串>相匹配的元组。<匹配串>可以是一个完整的字符串,也可以含有通配符%和_。其中:

1)%(百分号)代表任意长度的字符串。

2)_(下横线)代表任意单个字符。

注意:数据库字符集为ASCII时一个汉字需要两个_;当字符集为GBK时只需要一个_。


如果用户要查询的字符串本身就含有通配符%和_,这时就要使用ESCAPE'<换码字符>'短语对通配符进行转义了。


其中,ESCAPE '\' 表示“\”为换码字符。这样匹配串中紧跟在“\”后面的字符“_”不再具有通配符的含义,转义为普通的“_”字符。

⑤涉及空值的查询

若要查询相应属性为空值的话,要用IS NULL,而不能用(=NULL)。

⑥多重条件查询

逻辑运算符AND和OR可用来连接多个查询条件。AND的优先级高于OR,但用户可以用括号改变优先级。

(3)ORDER BY子句

用户可以用ORDER BY子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,默认值为升序。

(4)聚集函数

聚集函数只能用于SELECT子句和GROUP BY中的HAVING子句。不能在WHERE子句中作为条件表达式


如果使用DISTINCT短语,则表示在计算时要取消指定列中的重复值。如果不指定DISTINCT短语或指定ALL短语(ALL为默认值),则表示不取消重复值。

(5)GROUP BY子句

GROUP BY子句将查询结果按某一列或多列的值分组,值相等的为一组。

分组后聚集函数将作用于每一个组,即每一组都有一个函数值。




WHERE子句和HAVING短语的区别在于作用对象不同。

WHERE子句作用于基本表或视图,从中选择满足条件的元组。

HAVING短语作用于组,从中选择满足条件的组。

2、连接查询

前面的查询都是针对一个表进行的。若一个查询同时涉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值