ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # 参考资料 [https://github.com/CyC2018/CS-Notes/blob/master/notes/SQL.md](https://github.com/CyC2018/CS-Notes/blob/master/notes/SQL.md) [https://blog.csdn.net/qq\_37205708/article/details/94194465](https://blog.csdn.net/qq_37205708/article/details/94194465) # 基础 模式定义了数据如何存储、存储什么样的数据以及数据如何分解等信息,数据库和表都有模式。 主键的值不允许修改,也不允许复用(不能将已经删除的主键值赋给新数据行的主键)。 SQL(Structured Query Language),标准 SQL 由 ANSI 标准委员会管理,从而称为 ANSI SQL。各个 DBMS 都有自己的实现,如 PL/SQL、Transact-SQL 等。 SQL 语句不区分大小写,但是数据库表名、列名和值是否区分依赖于具体的 DBMS 以及配置。 SQL 支持以下三种注释: ```sql # 注释 SELECT * FROM mytable; -- 注释 /* 注释1 注释2 */ ``` 数据库创建与使用: ```sql CREATE DATABASE test; USE test; ``` # 数据定义 <table> <tr> <th rowspan=2>操作对象</th> <th colspan=3>操作方式</th> </tr> <tr> <td>创建</td> <td>删除</td> <td>修改</td> </tr> <tr> <td>模式</td> <td>CREATE SCHEMA</td> <td>DROP SCHEMA</td> <td>\</td> </tr> <tr> <td>表</td> <td>CREATE TABLE</td> <td>DROP TABLE</td> <td>ALTER TABLE</td> </tr> <tr> <td>视图</td> <td>CREATE VIEW</td> <td>DROP VIEW</td> <td>\</td> </tr> <tr> <td>索引</td> <td>CREATE INDEX</td> <td>DROP IDNEX</td> <td>\</td> </tr> </table> ## 创建 / 删除数据库 ```sql create database 数据库名 [其他选项\] ``` 例如我们需要创建一个名为 samp\_db 的数据库, 在命令行下执行以下命令: ```sql create database samp_db character set gbk; ``` 为了便于在命令提示符下显示中文, 在创建时通过 character set gbk 将数据库字符编码指定为 gbk。 删除数据库: ```sql drop database 数据库名 ``` ## 创建 / 删除 / 修改基本表 创建表 ```sql CREATE TABLE mytable ( # int 类型,不为空,自增 id INT NOT NULL AUTO_INCREMENT, # int 类型,不可为空,默认值为 1,不为空 col1 INT NOT NULL DEFAULT 1, # 变长字符串类型,最长为 45 个字符,可以为空 col2 VARCHAR(45) NULL, # 日期类型,可为空 col3 DATE NULL, # 设置主键为 id PRIMARY KEY (`id`)); ``` 修改表: ```sql # 添加列 ALTER TABLE mytable ADD col CHAR(20); ``` ```sql # 表 position 修改列 test ALTER TABLE position MODIFY test CHAR(20) NOT NULL; ``` ## 建立索引 ```sql CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…); ``` - <表名>:要建索引的基本表的名字 - <列名>:可以建立在该表的一列或多列上,各列名之间用逗号分隔 - <次序>:指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC - UNIQUE:此索引的每一个索引值只对应唯一的数据记录 - CLUSTER:表示要建立的索引是聚簇索引 # 数据查询 ```sql SELECT [ALL | DISTINCT] <目标列表达式> [,<目标列表达式>] … FROM <表名或视图名>[, <表名或视图名> ] … [ WHERE <条件表达式> ] [ GROUP BY <列名1> [ HAVING <条件表达式> ] ] [ ORDER BY <列名2> [ ASC|DESC ] ]; ``` 语义:根据 WHERE 子句的条件表达式,从 FROM 子句指定的基本表或视图中找出满足条件的元组,再按 SELECT 子句中的目标表达式,选出元组中的属性值形成结果表。 <br /> 如果有 GROUP BY 子句,则将结果按 <列名1> 的值进行分组,该属性列值相等的元组称为一个组。如果 GROUP BY 子句带 HAVING 短语,则只有满足指定条件的组才予以输出。 <br /> 如果有 ORDER BY 子句,则结果表还要按 <列名 2> 的值的升序或降序排列。 ## 单表查询 1、选中表中的若干列 ```sql SELECT Sno,Sname FROM Student SELECT * FROM Student # 查询结果的第 2 列是一个算术表达式,表中会得到2014 – Sage的值 SELECT Sname, 2014 – Sage FROM Student # 可以通过指定别名来改变查询结果的列标题,Sname 列名会变为 NAME SELECT Sname NAME, 'Year of Birth': BIRTH, 2004 – Sage BIRTHDAY, LOWER(Sdept) DEPARTMENT ``` 2、选中表中的若干元组(行) (1) DISDINCT 关键字消除重复的行 ```sql SELECT DISTINCT Sno FROM SC # 使用 DISTINCT 关键字消除重复的行 ``` (2) 使用 WHERE 查询满足条件的元组 | 查询条件 | 谓词 | | :---- | :---- | | 比较 | =,>,<=,>=,<>,!>,!< 以及 NOT + 上述比较运算符 | | 确定范围 | BETWEEN AND,NOT BETWEEN AND | | 确定集合 | IN,NOT IN | | 字符匹配 | LIKE, NOT LIKE | | 空值 | IS NULL, IS NOT NULL | | 多重条件(逻辑运算) | AND,OR,NOT | ```sql # 查询年龄在 20~23 岁(包括 20 岁和 23 岁)之间的学生的姓名、系别、年龄 SELECT Sname, Sdept, Sage FROM Student WHERE Sage BETWEEN 20 AND 23; ``` ```sql # IN 用于查找属性值属于指定集合的元组,即 Sdept 等于 'CS' 'MA' 'IS' 中的一个即可 SELECT Sname, Ssex FROM Student WHERE Sdept IN ('CS', 'MA', 'IS'); ``` 字符匹配:`[NOT] LIKE '<匹配串>' [ESCAPE '<换码字符>']` 语义:查找指定的属性列值与`<匹配串>`相匹配的元组,ESCAPE 用于对通配符的转义,如 ```sql WHERE Cname LIKE 'DB\_Design' ESCAPE '\'; # 将 \ 定义为转义字符,这样匹配的就是 'DB_Design',即 '_' 失去了通配符的含义 ``` 有以下通配符: `%`:代表任意长度(>=0)的字符串 `_`:代表任意单个字符 `[ ]`:匹配括号内所列字符中的一个 `[^]`:匹配不在括号内所列字符中的单个字符 > 注:数据库字符集为 ASCII 时一个汉字需要两个 \_,字符集为 GBK 时只需要一个 多重条件查询,逻辑运算符 AND 和 OR 可用来联结多个查询条件,AND 的优先级高于 OR,但可用括号改变优先级,示例如下: ```sql SELECT Sname FROM Student WHERE Sdept = 'CS' AND Sage < 20 ``` (3) ORDER BY 子句 对查询结果按一个或多个属性列的升序(ASC)或降序(DESC)排列,缺省值为升序 (4) 聚集函数(系统自带函数)