# UTU-SQL **Repository Path**: weber-pyth-utu/utu-sql ## Basic Information - **Project Name**: UTU-SQL - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-01-13 - **Last Updated**: 2021-03-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 前言 本笔记全部例题涉及的表结构如下 Student表(学生信息表) | 列名 | 含义 | |----|----| | Sno | 学号,本表主键 | | SID | 身份证号 | | Sage | 年龄 | Course表(课程信息表) | 列名 | 含义 | |----|----| | Cno | 课程号,本表主键 | | Cname | 课程名 | SC表(学生选课表) | 列名 | 含义 | |----|----| | Sno | 学号,是来自Student表的外键,与本表的Cno共同构成联合主键 | | Cno | 课程号,是来自Course表的外键,与本表的Sno共同构成联合主键 | ## 关系型数据库标准语言SQL ### 简介 SQL(Structured Query Language)结构化查询语言,是关系型数据库的标准语言。SQL是一个通用的、功能极强的关系型数据库语言。 ### 特点 * 集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于一体 * 可以独立完成数据库生命周期中的全部活动 * 定义关系模式,插入数据,建立数据库 * 对数据库中的数据进行查询和更新 * 数据库重构和维护 * 数据库安全性、完整性控制等 * 用户数据库投入运行后,可根据需要随时逐步修改模式,不影响数据的运行 * 数据操作符统一 * 高度非过成化 * SQL只需要提出做什么,无需关注存取路径 * 存取路径的选择以及SQL的操作过程由数据库系统自动完成 * 面向集合的操作方式 * 操作对象、查找结果可以是元组的集合 * 一次插入、删除、更新操作的对象可以是元组的集合 * 以同一种语法结构提供多种使用方式 * SQL是独立的语言,能够独立用于联机交互 * SQL又可以成为嵌入式语言,嵌入到高级语言(例如C,C++,java)程序中,供程序员设计程序时使用 * 语言简洁,易学易用。SQL功能极强,完成核心功能只用了9个动词 ### 一些基本概念 SQL的三级模式通常为存储文件->基本表->视图,其中存储文件和基本表被称为内模式,视图被称为外模式。 ##### 存储文件 * 存储文件的逻辑结构组成了关系型数据库的内模式 * 存储文件的物理结构是任意的,对用户透明 ##### 基本表 * 本身独立存在的表 * SQL中一个关系就对应一个基本表 * 一个或多个基本表对应一个存储文件 * 一个表上可以有若干索引 ##### 视图 * 从一个或多个基本表导出的表(由一个或多个基本表组成的表) * 数据库中只存放视图的定义而不存放视图对应的数据(因为视图的数据就是基本表的数据,视图是基本表的另一种展现形式) * 视图是一个虚表 * 用户可以在视图上再定义视图 ##### 模式 * 模式,就是表的集合。 * 你可以理解为模式是用于对表进行分组,每一组就是一个模式 * 在某些数据库中,模式和DATABASE是等价的 ##### 标准SQL下的通用数据类型 SQL中基本表上的列需要指明存储的数据类型,并且这些数据类型需要指定取值范围 |数据类型|说明|备注| |----|-----|-----| | INT(n) | INT意为长整数,类型为INT的字段只能储存数学意义上的整数 | n指最大精度(可理解为取值范围),实际应用中按需设置,部分数据库对n的最大值有限制 | | CHAR(n) | CHAR意为定长字符串,这里需要注意,与其他语言不同,SQL中的CHAR型含义是字符串 | n指固定长度(不足n仍占用相当于长度n的存储空间),实际应用中按需设置 | | VARCHAR(n) | VARCHAR意为不定长字符串 | n指最大长度(比n短的部分不会占用存储空间),实际应用中按需设置 | | SMALLINT | SMALLINT意为短整型,只能储存数学意义上的整数 | SMALLINT类型的最大精度为5(标准SQL下) | | BIGINT | BIGINT意为长整型,只能储存数学意义上的整数 | BIGINT类型的最大精度为19(标准SQL下) | | DECIMAL(p,s) | 表示精确小数 | p为小数点前的位数,s为小数点后的位数 | | FLOAT(n) | 近似小数,一个采用科学计数法记录的小数 | n表示尾数精度(小数的位数) | | DATE | 存储日期 | 存储年、月、日的值(标准SQL下) | | TIME | 存储时间 | 存储时、分、秒的值(标准SQL下) | * 注意,以上数据类型的`取值范围`仅适用于标准SQL下,各数据库详细限制请参阅对应的官方文档。 ##### 主键 * 主键是表中用来标识某一条记录的唯一性的唯一标识。 * 主键不能重复,不允许空值 * 有些情况下,可以使用多个字段来做联合主键 ###### 关于主键的例子 * 你的身份证号就是一种主键。因为作为一名合法公民,你的身份证号不会重复且不是空值,身份证号是可以表示你具有唯一性的唯一标识。 * 可以多个字段做联合主键。例如学生选课,学生和课程是多对多的关系,一个学生可以选数门课,一门课可以被数个学生选。但是当学号和课程号加在一起做联合主键时就具有唯一性,为什么呢?因为在某一门指定的课当中,一个学生只会被点一次名!也就是说学号和课程号共同组成的联合主键是具有唯一性的! ## SQL语法 ### 创建CREATE 在SQL语言中,CREATE关键字表示创建的含义。 #### 创建数据库CREATE DATABASE * 形式:CREATE DATABASE <数据库名>; * 例子: * CREATE DATABASE my_db; 创建一个名为my_db的数据库 * CREATE DATABASE your_db;创建一个名为your_db的数据库 #### 创建数据表CREATE TABLE 基本形式:CREATE TABLE <表名> ( <列名><数据类型>[<列级完整性约束条件>] , <列名><数据类型>[<列级完整性约束条件>] , ...... , <表级完整性约束条件>) ##### 约束条件 约束条件分为两种:表级约束条件和列级约束条件。 * 表级约束:涉及到表的多个属性列 * 列级约束:仅涉及一个列 * 约束关键字:Primary Key,Foreign key References,Unique,Not NULL,Check() * Primary Key:主键 * Foreign key References:外键 * Unique:唯一 * Not NULL:不为空 * Check():检查函数,检查是否符合括号内的条件 ##### 创建数据表的例子 ![例题图1-1](https://gitee.com/weber-pyth-utu/utu-sql/raw/master/M1-1.jpg "例题图1-1") ![例题图1-2](https://gitee.com/weber-pyth-utu/utu-sql/raw/master/M1-2.jpg "例题图1-2") ![例题图1-3](https://gitee.com/weber-pyth-utu/utu-sql/raw/master/M1-3.jpg "例题图1-3") #### 创建模式CREATE SCHEMA 基本形式:CREATE SCHEMA <模式名> AUTHORIZATION <用户名>[<表定义子句>] #### 创建索引CREATE INDEX 基本形式:CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名>(<列名>[<次序>],<列名>[<次序>]) * CREATE INDEX语句在定义索引时,可以定义索引是唯一索引(UNIQUE)、聚簇索引(CLUSTER)或非唯一索引 * 聚簇索引(CLUSTER):指索引项的顺序与表中记录的物理顺序一致的索引 * 次序:升序(ASC),降序(DESC),默认为升序 * 在最经常查询的列上建立聚簇索引可以提高查询效率 * 一个基本表上最多只能建立一个聚簇索引 * 经常更新的列不适合建立聚簇索引 * 唯一索引(UNIQUE):注意,唯一索引指定的列必须具有唯一性,不允许出现相同的索引值 ##### 创建索引的例子 ![例题图1-4](https://gitee.com/weber-pyth-utu/utu-sql/raw/master/M1-4.jpg "例题图1-4") ![例题图1-5](https://gitee.com/weber-pyth-utu/utu-sql/raw/master/M1-5.jpg "例题图1-5") ![例题图1-6](https://gitee.com/weber-pyth-utu/utu-sql/raw/master/M1-6.jpg "例题图1-6") #### 创建触发器CREATE TRIGGER 触发器顾名思义,在适当的时机将被触发,执行一组预先设定好的操作。不同的数据库系统创建触发器的语法略有差别,在此不列出详细的语法规则,但是触发器的结构基本相同。触发器大致结构如下 * 触发器名。一个独一无二的自定义名称,需要符合命名规范,用以与其他触发器区分。 * 监听事件。一个触发器通常只能监听一种事件,这里的事件的范畴通常为`插入`事件、`删除`事件和`修改`事件。也就是说在检测到执行了诸如`插入`、`删除`、`修改`等事件后,触发触发器。 * 触发时机。指的是触发器的执行时机,例如监听`删除`事件,决定触发器是在`删除`前执行还是在`删除`后执行。 * 触发内容。指的是触发器执行时需要执行的内容,在该触发器被出发后都应该做什么。 * 监听地点。通常一个触发器只能监听一张`表`,这里的`表`就是监听地点。监听在这张`表`上发生的事件,具体监听什么事件请参考上面的`监听事件`词条。 ### 查询SELECT 基本格式:SELECT [ALL|DISTINCT] <目标列表表达式>[,<目标列表表达式>] FROM <表名或视图名>[,<表名或视图名>] [WHERE <条件表达式>] [GROUP BY <列名1>[HAVING <条件表达式>]] [ORDER BY <列名2> [ASC|DESC]]; #### 基本查询例子 ![例题图1-7](https://gitee.com/weber-pyth-utu/utu-sql/raw/master/M1-7.jpg "例题图1-7") * [ALL|DISTINCT]这部分可以不填,当你不填时,其内容默认为ALL,含义为全部(即查询结果的全部内容)。当你指定这部分的值为DISTINCT时,将会对查询结果`去重`。 #### 指定条件的查询WHERE 有些时候你需要指定查询符合某些条件的数据。下面列出在SQL中的关系运算符 |符号|含义| |----|-----| | `=` | 相等 | | `>` | 大于 | | `<` | 小于 | | `>=` | 大于等于 | | `<=` | 小于等于 | | `<>` | 不等于 | | `IS NULL` | 为空 | | `NOT NULL` | 不为空 | | `LIKE` | 形似,近似。LIKE与通配符搭配使用可以匹配例如王xx,李xx这样的字符串 | | `EXISTS` | 存在。EXISTS后面需要内嵌一个查询语句,根据查询的结果是否为空来返回true或者false | | `IN` | 包含。IN后面需要内嵌一个查询语句,用来查询某一列的某个值是否在子查询的结果集之中,返回true或false | 接下来将列出SQL中的逻辑运算符 |符号|含义| |----|-----| | `AND` | 与 | | `OR` | 或 | | `NOT` | 非 | 下面是SQL中的算术运算符 |符号|含义| |----|-----| | `+` | 加 | | `-` | 减 | | `*` | 乘 | | `/` | 除 | | `%` | 取模(取余数) | ##### 指定条件的单表查询例子 ![例题图1-8](https://gitee.com/weber-pyth-utu/utu-sql/raw/master/M1-8.jpg "例题图1-8") #### 使用EXISTS和IN以及JOIN的跨表查询 有些时候,我们查询数据的参照对象涉及了多个表,这时候的跨表查询就需要使用一些其他的关键字了。EXISTS关键字的含义为存在,可以表示某个值在另一张表中是否存在。IN关键字表示包含,可以表示某个值是否被包含于另一个查询结果中。JOIN关键字的含义为连接,可以将两张结构相似的表以某种指定的方式拼接在一起。 * EXISTS的用法:接在WHERE后,基本形式为EXISTS(<内嵌查询语句>) * IN的用法:放置在WHERE后,基本形式为 <列名> IN (<内嵌查询语句>) ##### JOIN的用法 在SQL中,连接方式分为内连接和外连接。连接需要指定一个参照列,内连接为根据参照列取交集。外连接分为左外连接和右外连接以及完全连接。 * 内连接:根据参照列取交集 * 左外连接:以左表为基准,根据参照列进行拼接。其中左表中存在但是右表不存在的数据,其右表部分设为NULL。而右表存在但是左表不存在的数据则舍弃。 * 右外连接:以右表为基准,根据参照列进行拼接。其中右表存在但是左表不存在的数据,其左表部分设为NULL。而左表存在但右表不存在的数据则舍弃。 * 完全连接:直接根据参照列进行拼接。其中左表存在但是右表不存在的数据,其右表部分设为NULL。右表存在但是左表不存在的数据,其左表部分设为NULL。 ##### 跨表查询的例子 ![例题图1-9](https://gitee.com/weber-pyth-utu/utu-sql/raw/master/M1-9.jpg "例题图1-9") #### 字符匹配LIKE 基本形式:接在WHERE后,<列名> LIKE `<字符串(可含通配符)>` [ESCAPE `<转义字符>`] LIKE关键字表示近似、形似,用于匹配格式为指定格式的值。其通配符有两种,表示任意长度的`%`和表示1位字符的`_` ##### 使用LIKE的例子 ![例题图1-10](https://gitee.com/weber-pyth-utu/utu-sql/raw/master/M1-10.jpg "例题图1-10") #### 涉及空值NULL的查询 这里是一个需要注意的地方。在SQL中,判断值是否为空不允许使用关系运算符`=`和`<>`,而是使用`IS NULL` 和 `IS NOT NULL`来表示`为空`或`不为空`。 ##### 涉及空值NULL的查询例子 ![例题图1-11](https://gitee.com/weber-pyth-utu/utu-sql/raw/master/M1-11.jpg "例题图1-11") #### 多重条件查询 当有些时候我们选择数据的条件为复数时,我们需要使用AND和OR以及NOT这些逻辑运算符来为我们提供帮助。 * AND:逻辑`与`,只有其左右两侧条件均为真时,与运算的结果才为真。也就是任意一侧为假,结果为假。 * OR:逻辑`或`,只有其左右两侧条件均为假时,或运算的结果才为假。也就是任意一侧为真,结果为真。 * NOT:逻辑`非`,是一个单目运算符,只会对它右侧表达式起效。当其右侧条件为真时,非运算结果为假。当其右侧条件为假时,非运算结果为真 ##### 多重条件查询例子 ![例题图1-12](https://gitee.com/weber-pyth-utu/utu-sql/raw/master/M1-12.jpg "例题图1-12") #### COUNT()函数 在SQL中,有些时候我们需要统计类似人数的数据。对于这种运算,我们可以使用COUNT()函数来实现。 * 注意,COUNT()函数允许与WHERE子句搭配来实现统计符合指定条件的数据的数目。 * 注意,COUNT()函数允许与GROUP BY子句(下面会讲GROUP BY)搭配来实现分类统计数据的数目。 ##### 一些使用COUNT()函数的基本例子 ![例题图1-13](https://gitee.com/weber-pyth-utu/utu-sql/raw/master/M1-13.jpg "例题图1-13") #### 进行分组的查询GROUP BY 在SQL中,可以使用GROUP BY 子句进行分组查询。其基本形式为 GROUP BY <列名> [HAVING <条件表达式>] * HAVING类似WHERE,但是不同的是HAVING的作用目标是GROUP BY 的分组对象。 ##### 关于涉及GROUP BY查询的例子 ![例题图1-14](https://gitee.com/weber-pyth-utu/utu-sql/raw/master/M1-14.jpg "例题图1-14") #### 作用于多条数据函数 下面将列出类似于COUNT()函数这种作用于多条数据的函数,其用法与COUNT()函数大同小异。 |函数|作用| |----|----| | SUM() | 求和 | | AVG() | 求平均值 | | MAX() | 最大值 | | MIN() | 最小值 | | COUNT() | 计数 | #### 对结果进行排序ORDER BY 基本形式 在整条查询语句的尾部 ORDER BY <列名> [ASC|DESC] * ORDER BY用于表示参照某个列对结果进行排序 * ASC含义为升序 * DESC含义为降序 * 如果您忽略[ASC|DESC],则默认按照ASC排序 ##### 一些关于结果排序的例子 ![例题图1-17](https://gitee.com/weber-pyth-utu/utu-sql/raw/master/M1-17.jpg "例题图1-17") ### 插入INSERT 基本形式 INSERT INTO <表名> [(<列名1>[,<列名2>...<列名n>])] VALUES (<列数据1>[,<列数据2>...<列数据n>]); * 当你插入的数据需要写入所有列,可以忽略列名,直接按序填充数据即可 ##### 一些插入的基本例子 ![例题图1-15](https://gitee.com/weber-pyth-utu/utu-sql/raw/master/M1-15.jpg "例题图1-15") ### 更新UPDATE 基本形式 UPDATE <表名> SET <列名1>=<数据1> [, <列名2>=<数据2>...<列名n>=<数据n> ] WHERE <条件表达式> * UPDATE语句默认对表中所有数据的对应列生效,你也可以通过WHERE子句来指定更新符合条件的数据 * UPDATE语句的WHERE子句用法请参考SELECT部分 * UPDATE语句不支持GROUP BY 子句,请勿使用。 ##### 一些更新的基本例子 ![例题图1-16](https://gitee.com/weber-pyth-utu/utu-sql/raw/master/M1-15.jpg "例题图1-16") ### 删除数据DELETE 基本形式 DELETE FROM <表名> WHERE <条件表达式> * DELETE默认删除表的所有数据。或者您也可以通过WHERE子句来删除符合指定条件的数据 * DELETE的WHERE子句规则与UPDATE相同 ##### 一些删除数据的基本例子 ### 移除结构DROP #### 删除表 DROP TABLE <表名> #### 删除数据库 DROP DATABASE <数据库名> #### 删除索引DROP INDEX 不同的数据库系统删除索引的语法各不相同,并无统一的规定。对于不同数据库系统,请参阅对应官方文档。 ### 修改表ALTER TABLE #### 添加列 ALTER TABLE ADD ALTER TABLE <表名> ADD <列名> <数据类型> #### 删除列 ALTER TABLE DROP ALTER TABLE <表名> DROP COLUMN <列名> * 注意,部分数据库系统不支持删除数据表的列 #### 更改列 不同数据库系统更改列的语法各不相同,并无统一的规定。对于不同数据库系统,请参阅对应官方文档。