Skip to content

约束条件

约束条件说 明
PRIMARY KEY标识该属性为该表的主键,该属性非空且唯一
FOREIGN KEY标识该属性为该表的外键,是与之联系的是某表的主键
NOT NULL标识该属性不能为空
UNIQUE标识该属性的值是唯一的
AUTO_INCREMENT标识该属性的值自动增加,这是MySQL的SQL语句的特色
DEFAULT为该属性设置默认值

DDL

对数据库进行操作

sql
SHOW DATABASES; # 查看所有数据库

CREATE DATABASE test; #创建一个名为test的数据库

CREATE DATABASE test DEFAULT CHARACTER SET utf8; # 床架一个名为test的数据库并指定编码为utf8

SHOW CREATE DATABASE test; # 查看名为test的数据库的编码

ALTER DATABASE test DEFAULT CHARACTER SET gbk; # 修改test的数据库编码为gbk

USE test; # 选择test数据库

SELECT DATABASE(); # 查看当前的数据库

DROP DATABASE test; # 删除test数据库

对数据表进行操作

sql
# 创建表
CREATE TABLE 表名(
    属性名 数据类型[完整性约束条件],
    属性名 数据类型[完整性约束条件],
    ...
    属性名 数据类型[完整性约束条件]
);

# 表的外键
CREATE TABLE 表名(
    属性名 数据类型 PRIMARY KEY AUTO_INCREMENT,
    属性名 数据类型[完整性约束条件],
    ...
    属性名 数据类型[完整性约束条件]
    FOREIGN KEY (本表字段名) REFERENCES 外表(外表字段(主键)名)
);

# 查看表结构
DESC \ DESCRIBE 表名;

# 查看建表语句
SHOW CREATE TABLE 表名;

# 修改表名
ALTER TABLE 旧表名 RENAME 新表名;

# 删除表(没有关联的普通表)
DROP TABLE 表名;

# 删除表(删除被其他表关联的父表)
ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名;

对字段进行操作

sql
# 修改字段数据类型
ALTER TABLE 表名 MODIFY 属性名 数据类型;

# 修改字段名
ALTER TABLE 表名 CHANGE 旧属性名 新属性名 新数据类型;

# 增加字段
ALTER TABLE 表名 ADD 字段名 数据类型;

# 增加有完整性约束字段
ALTER TABLE 表名 ADD 字段名 数据类型 约束条件;

# 删除字段
ALTER TABLE 表名 DROP 字段名;

# 修改字段排列位置(字段修改到第一个位置)
ALTER TABLE 表名 MODIFY 字段名 被修改字段数据类型 FIRST;

# 修改字段排列位置(字段修改到指定位置)
ALTER TABLE 表名 MODIFY 字段名 被修改字段数据类型 AFTER 字段名;

DML

对内容进行操作(插入)

sql
# 为表的所有字段插入数据
INSERT INTO 表名 VALUES(值 1,值 2,值 n);

# 同时插入多条记录
INSERT INTO 表名 VALUES
(取值列表1),
(取值列表2),

(取值列表n);

# 对指定的字段进行插入数据
INSERT INTO表名(属性1,属性2,...,属性n) VALUES(值 1,值 2, ...,值 n);

# 对指定的字段插入多条记录
INSERT INTO 表名(属性1,属性2,...,属性n) VALUES
(取值列表1),
(取值列表2),

(取值列表n);

对内容进行操作(更新)

sql
# 更新全部字段
UPDATE 表名
SET 属性名1=取值1,属性名2=取值2,
...
属性名n=取值n;

# 更新部分字段操作
UPDATE 表名 SET 属性名1=取值1,属性名=取值2 WHERE 条件属性名=条件值;

对内容进行操作(删除)

sql
# 删除所有数据
DELETE FROM 表名;

# 删除指定条件的数据
DELETE FROM 表名 WHERE 条件属性名=条件值;

# truncate快速删除所有数据(先将表删除,然后再创建一张完全相同的表)
TRUNCATE TABLE 表名;

DQL

条件关键字

查询条件符号或关键字
等于=
不等于!=、<>
大于等于 | 大于>=、>
小于等于 | 小于<=、<
指定范围BETWEEN...AND...、NOT BETWEEN...AND...
在指定的值当中IN、NOT IN
模糊匹配LIKE、NOT LIKE
为空 | 不为空IS NULL、IS NOT NULL
并且AND、&&
或者OR、||
重命名标头AS

and 和 or 优先级

在SQL中 AND 的优先级比 OR 要高,会优先执行。如果希望 OR 优先执行,那么就需要给 OR 条件加上一个小括号。对于优先级不确定的问题都可以通过添加上小括号来解决

SQL语句(基本查询)

sql
# 查询表中所有数据
SELECT * FROM 表名;

# 查询指定的字段
SELECT 属性1,属性2 FROM 表名;

# 查询指定记录
SELECT 属性列表 FROM 表名 WHERE 条件表达式;

# 多关键字查询 [NOT 可加可不加,加上表示不在集合内满足条件]
SELECT 属性列表 FROM 表名 WHERE 属性 [NOT] IN("值1","值2");

# case 匹配(类似switch)
SELECT CASE 字段 WHEN 匹配1 THEN 选项1 WHEN 匹配2 THEN 选项2 ELSE 选项3 END FROM 表名;

# 范围查询(范围包括查询的值)[NOT 可加可不加,加上表示不在集合内满足条件]
SELECT 属性列表 FROM 表名 WHERE 属性 [NOT] BETWEEN 取值 1 AND 取值 2;

# 模糊查询( %:课代表任意长度的字符串 _:只能代表单个字符 )[NOT 可加可不加,加上表示不在集合内满足条件]
SELECT 属性列表 FROM 表名 WHERE 属性 [NOT] LIKE '字符串';

# 查询空值(IS NULL 是一个整体)[NOT 可加可不加,加上表示不在集合内满足条件]
SELECT 属性列表 FROM 表名 WHERE 属性 IS [NOT] NULL;

# 多条件查询[AND:与]
SELECT 属性列表 FROM 表名 WHERE 表达式1 AND 表达式2 AND ……;

# 多条件查询[OR:或]
SELECT 属性列表 FROM 表名 WHERE 表达式1 OR 表达式2 OR ……;

# 去重复查询(如果有多个字段,DISTINCT应该放在最前面)
SELECT DISTINCT 字段名 FROM 表名;

# 对查询结果排序(默认升序[ASC],可省略)[升序:ASC][降序:DESC]
SELECT 属性列表 FROM 表名 ORDER BY 属性名1[ ASC|DESC ],属性名2[ ASC|DESC ]...

# 对查询结果进行分组(当进行分组的时候select后面跟的就只能是参加分组的字段和分组函数)
SELECT 属性列表 FROM 表名 GROUP BY 属性名[HAVING 条件表达式][WITH ROLLUP];

# GROUP_CONCAT()查询指定字段的值按分类一行显示
SELECT 属性1 , GROUP_CONCAT(属性2) FROM 表名 GROUP BY 属性3;

# HAVING 限制输出结果,达到要求结果进行显示(和WHERE类似,但是WHERE是在分组前,HAVING是在分组后)
SELECT 属性1 , COUNT(*) AS '人数' FROM student GROUP BY sex HAVING COUNT(*) > 5;

# 按照多个字段进行分组
SELECT * FROM 表名 GROUP BY 属性1,属性2;

# 使用 WITH ROLLUP 会在所有记录最后加上一条记录,这条记录是上面所有记录的总和
SELECT 属性1 ,COUNT(*) FROM 表名 GROUP BY 属性2  WITH ROLLUP;

# LIMIT 分页查询(MySQL特有)
SELECT * FROM 表名 LIMIT (初始位置,记录数)/(记录数);

多表联查

分类

根据连接方式可以分为三个类别:内连接、外连接、全连接(MySQL不支持)

内连接:

  • 等值连接
  • 非等值连接
  • 自连接

外连接:

  • 左外连接
  • 右外连接

笛卡尔积现象:当两张或者多张表连接的时候,如果没有任何条件进行过滤,最终查询结果是这几张表条数的乘积,即为笛卡尔积。为了避免这种情况的发生,需要进行添加条件进行筛选考虑

sql
# 内连接 ON后面就是等值连接(去除笛卡尔积)
SELECT * FROM 表1 INNER JOIN 表2 ON 表1.属性 = 表2.属性;

# 左外连接
SELECT * FROM 表1 LEFT JOIN 表2 ON 表1.属性 = 表2.属性;

# 右外连接
SELECT * FROM 表1 RIGHT JOIN 表2 ON 表1.属性 = 表2.属性;

内连接:只有当两张表中满足条件的记录才会显示在结果集中

左外连接:如果左表中满足条件的记录才会显示在结果集中,右表中不满足条件的记录不会显示在结果集中

右外连接:如果右表中满足条件的记录才会显示在结果集中,左表中不满足条件的记录不会显示在结果集中

子查询

概念:select 语句中嵌套 select 语句就叫做子查询;它可以嵌套在 select、from、where 等关键字后面

sql
# where后面
SELECT * FROM 表名 WHERE 属性名 IN (SELECT 属性名 FROM 表名);

# from后面(from后面的子查询查出来的数据是可以当成临时表的)
SELECT * FROM (SELECT 属性名 FROM 表名) AS 表名;

# select后面
SELECT (SELECT 属性名 FROM 表名 t2 WHERE t1.属性名 = t2.属性名) FROM 表名 t1;

exists 子查询

概念:[not] exists 用于检查子查询的查询结果行数是否大于0,如果大于0,则返回true,否则返回false

sql
select * from 表名 t1 where exists (select * from 表名 t2 where t1.属性名 = t2.属性名);

跟 in 一样的效果,但是 exists 的效率要比 in 高一些

in 和 exists 的区别:

  • in 操作符是根据指定列表中的值来判断是否满足条件,而 exists 操作符是根据子查询的结果来判断是否满足条件
  • exists 操作符通常比 in 更快,尤其是在子查询返回记录数很大的情况下,exists 只需要判断是否存在符合条件的记录,而 in 则是需要对比整个列表
  • in 操作符可以匹配多个值,而 exists 只能匹配一组条件

union & union all

概念:不管是 union 还是 union all,都是对多条查询结果进行合并。union 会对结果进行去重,union all 不会对结果进行去重(因为 union all 不会对结果集进行去重,所以效率要高一点)

sql
select * from 表1 where name = 'xxx'
union [all]
select * from 表1 where name = 'xxx';

以上就是一个案例,但是以上案例也可以使用 or 关键字来完成,但是如果使用 or 关键字的话那么在需要走索引优化的时候啊他是不会走的