[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) 聚集函数(系统自带函数)
- 序言 & 更新日志
- H5
- Canvas
- 序言
- Part1-直线、矩形、多边形
- Part2-曲线图形
- Part3-线条操作
- Part4-文本操作
- Part5-图像操作
- Part6-变形操作
- Part7-像素操作
- Part8-渐变与阴影
- Part9-路径与状态
- Part10-物理动画
- Part11-边界检测
- Part12-碰撞检测
- Part13-用户交互
- Part14-高级动画
- CSS
- SCSS
- codePen
- 速查表
- 面试题
- 《CSS Secrets》
- SVG
- 移动端适配
- 滤镜(filter)的使用
- JS
- 基础概念
- 作用域、作用域链、闭包
- this
- 原型与继承
- 数组、字符串、Map、Set方法整理
- 垃圾回收机制
- DOM
- BOM
- 事件循环
- 严格模式
- 正则表达式
- ES6部分
- 设计模式
- AJAX
- 模块化
- 读冴羽博客笔记
- 第一部分总结-深入JS系列
- 第二部分总结-专题系列
- 第三部分总结-ES6系列
- 网络请求中的数据类型
- 事件
- 表单
- 函数式编程
- Tips
- JS-Coding
- Framework
- Vue
- 书写规范
- 基础
- vue-router & vuex
- 深入浅出 Vue
- 响应式原理及其他
- new Vue 发生了什么
- 组件化
- 编译流程
- Vue Router
- Vuex
- 前端路由的简单实现
- React
- 基础
- 书写规范
- Redux & react-router
- immutable.js
- CSS 管理
- React 16新特性-Fiber 与 Hook
- 《深入浅出React和Redux》笔记
- 前半部分
- 后半部分
- react-transition-group
- Vue 与 React 的对比
- 工程化与架构
- Hybird
- React Native
- 新手上路
- 内置组件
- 常用插件
- 问题记录
- Echarts
- 基础
- Electron
- 序言
- 配置 Electron 开发环境 & 基础概念
- React + TypeScript 仿 Antd
- TypeScript 基础
- 样式设计
- 组件测试
- 图标解决方案
- Algorithm
- 排序算法及常见问题
- 剑指 offer
- 动态规划
- DataStruct
- 概述
- 树
- 链表
- Network
- Performance
- Webpack
- PWA
- Browser
- Safety
- 微信小程序
- mpvue 课程实战记录
- 服务器
- 操作系统基础知识
- Linux
- Nginx
- redis
- node.js
- 基础及原生模块
- express框架
- node.js操作数据库
- 《深入浅出 node.js》笔记
- 前半部分
- 后半部分
- 数据库
- SQL
- 面试题收集
- 智力题
- 面试题精选1
- 面试题精选2
- 问答篇
- Other
- markdown 书写
- Git
- LaTex 常用命令