目录
一、单表查询
1.选择字段
1.1.查询指定字段
- 格式:
SELECT 字段名1,字段名2... FROM 表名
- Example:
1.2.查询所有字段
- 格式:
SELECT * FROM 表名
- Example:
1.3.查询经过计算的值
- 格式:
SELECT 字段名1,字段名2..., 字符串常量, 计算表达式 FROM 表名
- Example:
Translation:
- 字符串常量(自定义):映射计算表达式的结果
- NOW:返回当前日期和时间
- YEAR:返回日期对应的年份
1.4.定义字段的别名
- 格式:
SELECT 字段名1 AS 别名1, 字段名2 别名2... FROM 表名
- Example:
Translation:
- 当自定义的别名含有空格时,必须用单引号将别名括起来
2.选择指定记录
2.1.比较大小
- 格式:
SELECT 字段名1,字段名2...FROM 表名 WHERE 查询条件
- Example:
2.2.带BETWEEN...AND关键字的范围查询
- 格式:
SELECT 字段名1,字段名2...FROM 表名 WHERE 字段名 BETWEEN 字段值 AND 字段值;
- Example:
Translation:
- 可以在BETWEEN...AND操作符前加关键字NOT,表示在指定范围之外
2.3.带IN关键字的集合查询
- 格式:
SELECT 字段名1,字段名2...FROM 表名 WHERE 字段名 IN(字段值,字段值...);
- Example:
Translation:
- 可以使用关键字NOT来查询属性值不属于集合范围内的记录
2.4.带LIKE关键字的字符串匹配查询
- Function:查找指定字段值与匹配串相匹配的记录
- 格式:
SELECT 字段名1,字段名2...FROM 表名 WHERE 字段名 LIKE 匹配串
- Example:
Translation:
- ‘‘匹配串’:可以是完整的常字符串,也可以含有通配符
- MySQL支持常用的通配符:‘%’ 和 ‘_’
- '%':代表任意长度的字符串(长度为0也可)
- '_':代表任意单个字符
- 返回结果是boolean值
- 可以用NOT LIKE表示非匹配字符串
2.5.使用正则表达式的查询
- Function:使用正则表达式可以匹配任意一个字符或指定范围内查找某个匹配的字符,也可以在匹配模式中使用“|”分隔每个供选择匹配的字符串,也可以用定位符匹配处于特定位置的文本,还可以对要匹配的字符或字符串的数目进行控制。
- 格式:
SELECT 字段名1,字段名2...FROM 表名 WHERE [NOT] REGEXP ‘字符’
- Example:
- Distinction:
- 可以看出LIKE和REGEXP的作用相同,但不同的是LIKE要使用通配符
- LIKE匹配的是整个字段值
- REGEXP是在字段值内进行匹配
2.6.带IS NULL关键字的空值查询
- 格式:
SELECT 字段名1,字段名2...FROM 表名 WHERE 字段名 IS [NOT] NULL;
- Example:
Translation:
- 空值一般表示数据未知,不确定或以后再添加
- 空值不同于0,也不同于空字符串
- 当要查询某一字段是否为空值时,可以使用关键字IS NULL
- 注意:
- IS NULL 不能用 =NULL 代替
- IS NOT NULL 也不能用 !=NULL 代替
2.7.带AND或OR的多条件查询
- 格式:
SELECT 字段名1,字段名2...FROM 表名 WHERE 查询条件(AND \ OR)
- Example:
Translation:
- AND的优先级高于OR
- 可用括号改变优先级
3.对查询结果排序
- 格式:
SELECT 字段名1,字段名2...FROM 表名 ORDER BY 字段名 [ASC/DESC];
- Example:
Translation:
- 关键字ASC表示按升序排列
- 关键字DESC表示按降序排列
- 默认值是ASC
4.限制查询结果的数量
- 格式:
SELECT 字段名1,字段名2...FROM 表名 ORDER BY 字段名 [ASC/DESC] LIMIT [位置偏移量,] 行数;
- Example:
Translation:
- 行数:表示要返回的记录数(非负的整数常量)
- 位置偏移量:表示从哪一行开始显示(下标从0开始)
- ASC/DESC:默认是ASC(升序排列)
二、分组聚合查询
1.使用聚合函数查询
- 格式:
SELECT 聚合函数 FROM student [WHERE 条件语句];
- Example:
Translation:
- DISTINCT:取消指定列中的重复值
- ALL(默认值):表示不取消重复值
- COUNT([DISTINCT | ALL] * ):统计数据表中的记录数
- COUNT([DISTINCT | ALL] <列名>):统计一列中值的个数
- MAX([DISTINCT | ALL] * <列名>):统计一列中值的最大值
- MIN([DISTINCT | ALL] * <列名>):统计一列中值的最小值
- SUM([DISTINCT | ALL] * <列名>):统计一列中值的总和
- AVG([DISTINCT | ALL] * <列名>):统计一列中值的平均值
2.分组聚合查询
- 格式:
SELECT 字段名...,聚合函数[别名]... FROM student GROUP BY 字段名 [HAVING 条件语句];
- Example:
Translation:
- GROUP BY:对查询结果按字段列表进行分组,字段值相等的为一组
- 指定用于分组的字段可以是一列,也可是多列
- HAVING对分组的结果进行过滤,仅输出满条件的组
三、连接查询(涉及多个表)
1.交叉连接
- 格式:
SELECT * FROM 表1名,表2名;
- Example:
Translation:
- 交叉连接又称笛卡尔积,即把一张表的每一行与另一张表的每一行连接起来,返回两张表的每一行相连接后所有可能的搭配结果,其连接的结果会产生一些没有意义的记录,所以这种查询很少用。
2.内连接
- 内连接就是使用比较运算符进行表间某些字段值的比较操作,并将与连接条件相匹配的数据行组成新的记录,目的是为了消除交叉连接中某些没有意义的数据行。
2.1.等值与非等值连接
- 格式:
SELECT 表1字段名...,表2字段名 FROM 表1名 [表1别名],表2名 [表2别名] WHERE [条件语句];
SELECT 表1字段名...,表2字段名 FROM 表1名 [表1别名] INNER JOIN 表2名 [表2别名] ON [条件语句];
- Example:
- 等值连接
- 非等值连接
Translation:
- 当比较运算符为‘=’时,表示等值连接
- 其它运算符为非等值连接
2.2.自连接
- 若某个表与自身进行连接,称为自身连接,简称自连接
- 使用自连接时,需要为表指定多个不同的别名
- 格式:
SELECT 表别名1.* FROM 表名 别名1,表名 别名2 WHERE 判定条件;
- Example:
- 查找s1中与s2的软件工程系一样学分的的s1中所有的信息
2.3.自然连接
-
只有当连接字段在两张表中的字段名都相同时才可以使用,否则返回的是笛卡尔积的结果集
-
自然连接关键字:NATURAL JOIN
- 格式:
SELECT 表1字段名...[表2字段名...] FROM 表1[别名] NATURAL JOIN 表2[别名];
- Example:
3.外连接
- 外连接:基表和参考表
- 外连接:左外连接和右外连接
3.1.左外连接
- Explain:
- 左外连接(LEFT OUTER JOIN):返回左边表的所有记录,将基表返回的记录与右边表中的记录一一相匹配,对于在右表中没有匹配的记录仍然要显示,即右表对应的字段值设置为NULL
- 格式:
SELECT 基表字段名..,参考表字段名.. FROM 基表[别名] LEFT OUTER JOIN 参考表[别名] ON[条件语句]
- Example:
3.2.右外连接
- Explain:
- 右外连接(RIGHT OUTER JOIN):返回右边表的所有记录,将基表返回的记录与左边表中的记录一一相匹配,对于在左表中没有匹配的记录仍然要显示,即左表对应的字段值设置为NULL
- 格式:
SELECT 基表字段名..,参考表字段名.. FROM 基表[别名] RIGHT OUTER JOIN 参考表[别名] ON[条件语句]
- Example:
四、子查询
- 子查询又称嵌套查询,是将一个查询语句嵌套在另一个查询语句的WHERE子句或HAVING短语中,前者称为子查询,后者称为父查询。
1.带IN关键字的子查询
- IN关键字:用于判定一个给定值是否存在于子查询的结果集中。使用IN关键字进行子查询时,内层查询语句仅仅返回一个数据列,其值将提供给外层查询进行比较操作
- 格式:
SELECT 字段名1... FROM 表名1 WHERE 字段名2 IN(SELECT [DISTINCT] 字段名2 FROM 表名2);
- Example:
Translation:
- 在表student_1,将学号出现在student_2中的姓名查询出来
- DISTINCT:不返回重复的列(学号)
- 执行顺序:先执行内层查询(子查询),再执行外层查询(父查询)
- 可以使用NOT IN 关键字的子查询来判定一个给定值不属于子查询的结果集
2.带比较运算符的子查询
- 格式:
SELECT 字段名1... FROM 表名1
WHERE 字段名2 比较运算符 (SELECT 字段名2 FROM 表名2 [WHERE 条件语句]);
- 常用比较运算符:>、>=、<、<=、=、<>、!=
- 比较运算符还可以与ALL、SOME、ANY关键字一起构造子查询
- ALL:用于指定表达式需要与子查询结果集中的每个值都进行比较,当表达式与结果集中每个值都满足比较关系时,会返回TRUE,否则返回FALSE
- SOME/ANY:表示指定表达式与子查询结果集中某个值满足比较关系时,就返回TRUE,否则返回FALSE
- Example:
- 多层嵌套:查找同时参加计算机和英语考试的学生信息
3.带EXISTS关键字的子查询
- 使用EXISTS关键字构造子查询时,系统对子查询进行运算以判断它是否返回结果集,若子查询的结果集为空,则返回false,反之返回true
- 格式:
SELECT 字段名... FROM 表1 表别名1 WHERE EXISTS(SELECT * FROM 表2 表别名2 WHERE 条件语句);
- Example:
五、联合查询
- 使用UNION关键字可以把来自多个SELECT语句的结果组合到一个结果集中,这种查询方式称为并运算或联合查询。
- 格式:
SELECT 字段名1,字段名2... FROM 表名1
WHERE 条件语句
UNION [ALL]
SELECT 字段名1,字段名2... FROM 表名2
WHERE 条件语句
- 注意:
- UNION语句必须由两条或两条以上的SELECT语句组成
- 每条SELECT语句必须包含相同的列、表达式或聚合函数
- SELECT子句中对应的目标列的数据类型必须兼容(可以包含隐含转换的类型)
- 第一个SELECT子句的目标列名称将作为UNION结果集的列名称
- 只能使用一条ORDER BY或LIMIT 子句,且它们必须置于最后一条SELECT语句之后
- Example:
Translation:
- 不使用关键字ALL:执行的时候去掉重复的记录
- 使用关键字ALL:不去掉重复的记录,也不对结果进行自动排序