基本语句
约束条件
约束条件 | 说 明 |
---|---|
PRIMARY KEY | 标识该属性为该表的主键,该属性非空且唯一 |
FOREIGN KEY | 标识该属性为该表的外键,是与之联系的是某表的主键 |
NOT NULL | 标识该属性不能为空 |
UNIQUE | 标识该属性的值是唯一的 |
AUTO_INCREMENT | 标识该属性的值自动增加,这是MySQL的SQL语句的特色 |
DEFAULT | 为该属性设置默认值 |
DDL
对数据库进行操作
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数据库
对数据表进行操作
# 创建表
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 外键约束名;
对字段进行操作
# 修改字段数据类型
ALTER TABLE 表名 MODIFY 属性名 数据类型;
# 修改字段名
ALTER TABLE 表名 CHANGE 旧属性名 新属性名 新数据类型;
# 增加字段
ALTER TABLE 表名 ADD 字段名 数据类型;
# 增加有完整性约束字段
ALTER TABLE 表名 ADD 字段名 数据类型 约束条件;
# 删除字段
ALTER TABLE 表名 DROP 字段名;
# 修改字段排列位置(字段修改到第一个位置)
ALTER TABLE 表名 MODIFY 字段名 被修改字段数据类型 FIRST;
# 修改字段排列位置(字段修改到指定位置)
ALTER TABLE 表名 MODIFY 字段名 被修改字段数据类型 AFTER 字段名;
DML
对内容进行操作(插入)
# 为表的所有字段插入数据
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);
对内容进行操作(更新)
# 更新全部字段
UPDATE 表名
SET 属性名1=取值1,属性名2=取值2,
...
属性名n=取值n;
# 更新部分字段操作
UPDATE 表名 SET 属性名1=取值1,属性名=取值2 WHERE 条件属性名=条件值;
对内容进行操作(删除)
# 删除所有数据
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执行顺序
格式:SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... LIMIT ...
执行顺序:FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY -> LIMIT
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不支持)
内连接:
- 等值连接
- 非等值连接
- 自连接
外连接:
- 左外连接
- 右外连接
笛卡尔积现象:当两张或者多张表连接的时候,如果没有任何条件进行过滤,最终查询结果是这几张表条数的乘积,即为笛卡尔积。为了避免这种情况的发生,需要进行添加条件进行筛选考虑
# 内连接 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 等关键字后面
# 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
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 不会对结果集进行去重,所以效率要高一点)
select * from 表1 where name = 'xxx'
union [all]
select * from 表1 where name = 'xxx';
以上就是一个案例,但是以上案例也可以使用 or 关键字来完成,但是如果使用 or 关键字的话那么在需要走索引优化的时候啊他是不会走的