目录
一、SQL简介
二、SQL是什么
三、SQL
四、重要术语与概念
五、数据定义语言【DDL data definition language】
1、CREATE TABLE 建表
2、ALTER TABLE 修改表
3、DROP TABLE 删除表
4、DROP DATABASE 删除数据库
5、TRUNCATE TABLE 语句
六、数据操作语言【DML data manipulation language】
1、INSERT 语法:用要插入数据、数据的列
2、Update 语法:用于修改表中的数据
3、DELETE 语法:句用于删除表中的行
七、查询语言【QL query language】:SELECT
八、简单SQL
1、WHERE 子句
2、引号的使用
3、AND 和 OR 运算符
4、ORDER BY 语句
5、LIMIT (MYSQL独有)
6、LIKE 操作符
5、(NOT) IN 操作符
6、(NOT)BETWEEN AND 操作符
7、Alias
8、EXISTS 运算符
九、GROUP BY 分组查询
十、子查询
十一、连接 JOIN
十二、UNION 操作符
十三、SQL语言内的函数运算
SQL (Structured Query Language:结构化查询语言) 是用于管理关系数据库管理系统(RDBMS)。
RDBMS 指关系型数据库管理系统,全称 Relational Database Management System。
RDBMS 是 SQL 的基础,同样也是所有现代数据库系统的基础,比如Oracle、MySQL 以及 Microsoft Access。
SQL 指结构化查询语言,全称是 Structured Query Language。
SQL 让你可以访问和处理数据库,包括数据插入、查询、更新和删除。
SQL 在1986年成为 ANSI(American National Standards Institute 美国国家标准化组织)的一项 标准,在 1987 年成为国际标准化组织(ISO)标准。
数据定义语言【DDL data definition language】
eg:主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构, 数据类型,表之间的链接和约束等初始化工作上,他们大多在建立或修改表时使用
查询语言【QL query language】
eg:SELECT
数据操作语言【DML data manipulation language】
eg:UPDATE、INSERT、DELETE,就像它的名字,这些条命令是用来对数据库里的数据进行操作的语言。
数据控制语言【DCL data control language】
eg:是用来设置或更改数据库用户或角色权限的语句,包括(grant授权,revoke废除授权等)语句
Base Table 基表
关系模型中的关系【物理存在的】
View 视图
虚表 ,通过计算得出,不是物理存在的
数据类型 NULL
保留字:空值,NULL不是空字符串''也不是0,IS NULL,IS NOT NULL 做判断,不能使用=比较
UNIQUE
保留字:表的某个属性是否允许有重复值
DEFAULT
保留字:为某张表的某个属性默认缺省值[默认值,有时候数据不完整时,我们也要写入数据]
PRIMARY KEY
保留字:主键,PRIMARY KEY 就是NOT NULL + UNIQUE
FOREIGN KEY
保留字:外键
CHECK
保留字:定义完整性约束,MYSQL8版本支持,低版本不支持,在开发过程中,我们基本上在 程序中约束
CREATE TABLE 语句用于创建数据库中的表。
CREATE TABLE 表名称
(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
)
AUTO_INCREMENT 自动递增
COMMENT 备注
CURRENT_TIMESTAMP 当前日期
ALTER TABLE 语句用于在已有的表中添加、修改或删除列。
在表中添加列:
ALTER TABLE table_name
ADD column_name datatype
删除表中的列:
ALTER TABLE table_name
DROP COLUMN column_name
CREATE TABLE `user` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT
NULL COMMENT '用户登录名',
`password` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL
COMMENT '用户密码md5加密',
`nickname` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
DEFAULT NULL COMMENT '昵称',
`realname` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
DEFAULT NULL COMMENT '真名',
`sex` tinyint DEFAULT '0' COMMENT '0未知,1男,2女',
`id_card` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
DEFAULT NULL COMMENT '身份证号码',
`phone` char(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL
COMMENT '绑定手机号码',
`email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT
NULL COMMENT '邮箱',
`birthday` date DEFAULT NULL COMMENT '出生日期',
`money` decimal(15,4) DEFAULT '0.0000' COMMENT '钱',
`status` tinyint DEFAULT '1' COMMENT '0禁用,1正常',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '用户创建时间',
`updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
-- ON UPDATE 在更新之后,默认插入当前时间
PRIMARY KEY (`id`),
CHECK (`sex` in (0,1,2))
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;
DROP TABLE 语句用于删除表(表的结构、属性以及索引也会被删除)
DROP TABLE 表名称
DROP DATABASE 数据库名称
不要删库跑路!!!
如果我们仅仅需要除去表内的数据,但并不删除表本身,那么我们该如何做呢?请使用 TRUNCATE TABLE 命令(仅仅删除表格中的数据)
TRUNCATE TABLE 表名称
慎用,不能回滚!
INSERT INTO 表名称 VALUES (值1, 值2,....)[,(值1, 值2,....),(值1, 值2,....)]
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
UPDATE 表名称 SET 列名称 = 新值 WHERE 条件 (qualification)
DELETE FROM 表名称 WHERE 条件 (qualification)
SELECT用于从表中选取数据结果被存储在一个结果表中(称为结果集)
SELECT [DISTINCT] target-list
FROM relation-list
WHERE qualification
关系列表 relation-list 【查询设计的表】
目标列表 target-list 【要查询的东西】
条件 qualification 【布尔表达式】
DISTINCT 可选字符,加了的话表明要求系统对查询结果的重复元组要消除。DISTINCT 一个字段和多个字段的区别,多个字段时有NULL 值会出现什么?
target-list 为 * 表示查询所有属性
WHERE 子句用于规定选择的标准。如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
下面的运算符可在 WHERE 子句中使用:
请注意,在条件值周围使用的是单引号 ''。SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。加 上不会错,但是会隐式转化
AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤。
AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。
如果第一个条件和第二个条件都成立,则 AND 运算符显示记录。
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示记录。
通过()将and和or结合起来组成复杂的表达式 ((a>1 or b<1) and c>1))and d like "%?%"
ORDER BY 语句用于对结果集进行排序(ASC 升序,DESC 降序)。
ORDER BY 语句用于根据指定的列对结果集进行排序。
ORDER BY 语句默认按照升序对记录进行排序。
如果你希望按照降序对记录进行排序,可以使用 DESC 关键字。
如果多个字段排序,在第一列中有相同的值时,第二列才进行排序
语法:SELECT 列名称 FROM 表名称 LIMIT N[,M]
LIMIT 限制返回条数
如果只存在N等价于LIMIT 0,N ==> 查询从 第1(0+1)开始,返回N条
如果N和M同时存在 查询从N+1开始 返回M条
结合count函数,查询分页
N = (p-1)* n
M = n
比如第二页(p=2),每页10条(n=10) 那么N = 1*10, M = 10
比如第五页(p=2),每页10条(n=10) 那么N = 5*10, M = 10
需要程序去组装数据分页记录,SQL无法一条sql完成
语法:SELECT column_name FROM table_name WHERE column_name LIKE pattern;
% 表示任何字符出现任意次数0->n个
_ 有且只有一个
语法:
SELECT column_name
FROM table_name
WHERE column_name [NOT] IN (value1,value2,...);
语法:
SELECT column_name
FROM table_name
WHERE column_name [NOT] BETWEEN value1 AND value2;
(NOT) BETWEEN 操作符选取(不)介于两个值之间的数据范围内的值。这些值可以是数值、或者日期
表的 SQL Alias 语法
SELECT column_name(s)
FROM table_name
AS alias_name
列的 SQL Alias 语法
SELECT column_name AS alias_name
FROM table_name
语法:
SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition);
EXISTS 运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。
结构:
SELECT target-list
FROM relation-list
WHERE qualification
GROUP BY grouping-list【将筛选后得到的结果通过group by进行分组得到grouping-list】
HAVING group-qualification 【对group by 得到的组进行筛选】
概念化执行步骤
把 FROM子句中出现的表进行笛卡尔乘积,拼接起来,单表不只执行
用where子句的qualification进行筛选
按照group-by将经过筛选后的元组进行分组
用having子句对分组进行筛选
将筛选后的组通过select子句进行运算,每一个组得到一个结果
要求,select 子句和having子句中的属性必须是group by分组属性值的子集
一个查询里面嵌套着查询就是子查询
标量子查询
查询结果就是单个的值
表表达式
查询结果是一张表
公共表表达式
在一些复杂的查询中,一个表表达式可能需要用到多次,将它只定义一次,多次调用结果
用with子句可以定义公共表表达式【相当于是一个临时视图】查询结果是一张表
笛卡尔乘积
结果模式包括进行操作的两个表的所有属性,两张表的每条元组之间两两拼接
条件连接操作
由笛卡尔乘积和选择操作的结合
结果模式和笛卡尔乘积的模式相同
连接操作的结果的元组数比笛卡尔乘积的结果元组要少
也称为theta-join
一种特殊的条件连接,连接条件只有等值的条件
结果模式和笛卡尔乘积的模式类似,把等值的属性去掉一列
自然连接:两张表在所有的公共属性上做等值连接,特殊的等值连接
解决情况:在自然连接中不满足连接操作的元组想要保留下来
分类:
左外连接:把连接运算符的左边的所有元组都要保留,找不到匹配的补空值
右外连接 把连接运算符的右边的所有元组都保留下来,找不到匹配的补空值
全外连接 把连接运算符的左右两边的所有元组都保留下来,找不到匹配的补空值
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时, 每条 SELECT 语句中的列的顺序必须相同。
UNION语法:
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
UNION ALL语法:
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
COUNT(*)
统计关系里面有多少元组
如果一列值email存在NULL,那么count(email)和count(*)会有什么区别
COUNT([DISTINCT]A)
统计关系属性A有多少个不同的值
SUM——求和
AVG——求平均值
MAX——求最大值
MIN——求最小值