MySQL中select语句语法简单介绍:
基本语法规则:
SELECT {* | <字段列名>}
[FROM <表 1>, <表 2>…
[WHERE <表达式>
[GROUP BY <group by definition>
[HAVING <expression> [{<operator> <expression>}…]]
[ORDER BY <order by definition>]
[LIMIT[<offset>,] <row count>]]
{*|<字段列名>}包含星号通配符的字段列表,表示所要查询字段的名称。
<表 1>,<表 2>…,表 1 和表 2 表示查询数据的来源,可以是单个或多个。
WHERE <表达式>是可选项,如果选择该项,将限定查询数据必须满足该查询条件。
GROUP BY< 字段 >,该子句告诉 MySQL 如何显示查询出来的数据,并按照指定的字段分组。
[ORDER BY< 字段 >],该子句告诉 MySQL 按什么样的顺序显示查询出来的数据,可以进行的排序有升序(ASC)和降序(DESC),默认情况下是升序。
[LIMIT[<offset>,]<row count>],该子句告诉 MySQL 每次显示查询出来的数据条数。
(1)使用"*"查询表的所有字段 :SELECT * FROM 表名; select * from test_db;
列出表的所有字段:SELECT id,name,dept_id,age,sex,height,login_date FROM test_db;
(2)去重查询:SELECT DISTINCT <字段名> FROM <表名>;
DISTINCT 关键字的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据给用户
使用 DISTINCT 关键字时需要注意以下几点:
DISTINCT 关键字只能在 SELECT 语句中使用。
在对一个或多个字段去重时,DISTINCT 关键字必须在所有字段的最前面。
如果 DISTINCT关键字后有多个字段,则会对多个字段进行组合去重,也就是说,只有多个字段组合起来完全是一样的情况下才会被去重。
lg:SELECT DISTINCT age FROM test_db;
SELECT DISTINCT dept_id,sex FROM test_db;
(3)指定位置开始显示指定数量的记录
LIMIT 初始位置,记录数
LIMIT 记录数 OFFSET 初始位置
注意:LIMIT 后的两个参数必须都是正整数。
初始位置可以不写,默认从第0条记录开始显示
lg:SELECT * FROM test_db LIMIT 3,5;
SELECT * FROM test_db LIMIT 5;
SELECT * FROM test_db LIMIT 5 OFFSET 3;
(4)查询排序
ORDER BY <字段名> [ASC|DESC]
字段名:表示需要排序的字段名称,多个字段时用逗号隔开。
ASC|DESC:ASC表示字段按升序排序;DESC表示字段按降序排序。其中ASC为默认值。
使用 ORDER BY 关键字应该注意以下几个方面:
ORDER BY 关键字后可以跟子查询(关于子查询后面教程会详细讲解,这里了解即可)。
当排序的字段中存在空值时,ORDER BY 会将该空值作为最小值来对待。
ORDER BY 指定多个字段进行排序时,MySQL 会按照字段的顺序从左到右依次进行排序。
SELECT * FROM test_db ORDER BY height;
SELECT name,height FROM test_db ORDER BY height,name;
SELECT * FROM test_db ORDER BY height desc;#升序排列
SELECT * FROM test_db ORDER BY height asc;#降序排列
注意:在对多个字段进行排序时,排序的第一个字段必须有相同的值,才会对第二个字段进行排序。如果第一个字段数据中所有的值都是唯一的,MySQL 将不再对第二个字段进行排序
(5)条件查询
WHERE 查询条件
查询条件可以是:
带比较运算符和逻辑运算符的查询条件,如> >= < <= == != AND(&&)、OR(||)、XOR
带 BETWEEN AND 关键字的查询条件
带 IS NULL 关键字的查询条件
带 IN 关键字的查询条件
带 LIKE 关键字的查询条件
SELECT name,height FROM test_db WHERE height=170;
SELECT name,age FROM test_db WHERE age<22;
SELECT name,age,height FROM test_db WHERE age>21 AND height>=175;
(6)模糊查询
[NOT] LIKE '字符串'
NOT :可选参数,字段中的内容与指定的字符串不匹配时满足条件。
字符串:指定用来匹配的字符串。“字符串”可以是一个很完整的字符串,也可以包含通配符。
LIKE 关键字支持百分号“%”和下划线“_”通配符。如果需要区分大小写,可以加入 BINARY 关键字。
“%”是 MySQL 中最常用的通配符,它能代表任何长度的字符串,字符串的长度可以为 0。
注意:匹配的字符串必须加单引号或双引号。
“_”只能代表单个字符,字符的长度不能为 0。
使用通配符的一些注意事项:
注意大小写。MySQL 默认是不区分大小写的。如果区分大小写,像“Tom”这样的数据就不能被“t%”所匹配到。
注意尾部空格,尾部空格会干扰通配符的匹配。例如,“T% ”就不能匹配到“Tom”。
注意 NULL。“%”通配符可以到匹配任意字符,但是不能匹配 NULL。也就是说 “%”匹配不到 tb_students_info 数据表中值为 NULL 的记录。
图sq20
(7)范围查询
[NOT] BETWEEN 取值1 AND 取值2
NOT:可选参数,表示指定范围之外的值。如果字段值不满足指定范围内的值,则这些记录被返回。
取值1:表示范围的起始值。
取值2:表示范围的终止值。
SELECT name,age FROM test_db WHERE age BETWEEN 23 AND 24;
SELECT name,age FROM test_db WHERE age NOT BETWEEN 23 AND 24;
(8)空值查询
IS [NOT] NULL “NOT”是可选参数,表示字段值不是空值时满足条件。
空值不同于 0,也不同于空字符串。
注意:IS NULL 是一个整体,不能将 IS 换成“=”
(9)分组查询
GROUP BY <字段名> “字段名”表示需要分组的字段名称,多个字段时用逗号隔开。
GROUP BY 关键字可以和 GROUP_CONCAT() 函数一起使用。GROUP_CONCAT() 函数会把每个分组的字段值都显示出来。
GROUP BY 关键字经常和聚合函数一起使用,如:COUNT(),SUM(),AVG(),MAX()和 MIN()
聚合函数详情可查看MySQL函数大全:http://m.biancheng.net/mysql/function/
WITH POLLUP 关键字用来在所有记录的最后加上一条记录,这条记录是上面所有记录的总和,即统计记录数量。
(10)过滤分组
HAVING <查询条件>
HAVING 关键字和 WHERE 关键字都可以用来过滤数据,且 HAVING 支持 WHERE 关键字中所有的操作符和语法。
但是 WHERE 和 HAVING 关键字也存在以下几点差异:
一般情况下,WHERE 用于过滤数据行,而 HAVING 用于过滤分组。
WHERE 查询条件中不可以使用聚合函数,而 HAVING 查询条件中可以使用聚合函数。
WHERE 在数据分组前进行过滤,而 HAVING 在数据分组后进行过滤 。
WHERE 针对数据库文件进行过滤,而 HAVING 针对查询结果进行过滤。也就是说,WHERE 根据数据表中的字段直接进行过滤,而 HAVING 是根据前面已经查询出的字段进行过滤。
WHERE 查询条件中不可以使用字段别名,而 HAVING 查询条件中可以使用字段别名。
注意:
在 SELECT 关键字后已经查询出了 height 字段,所以 HAVING 和 WHERE 都可以使用。但是如果 SELECT 关键字后没有查询出 height 字段,MySQL 就会报错。
如果 SELECT 关键字后没有查询出 HAVING 查询条件中使用的 height 字段,MySQL 会提示错误信息:“having子句”中的列“height”未知”
如果在 WHERE 查询条件中使用聚合函数,MySQL 会提示错误信息:无效使用组函数。
(11)交叉连接
交叉连接(CROSS JOIN)一般用来返回连接表的笛卡尔积。
笛卡尔积(Cartesian product)是指两个集合 X和 Y的乘积。
例如:
A = {1,2} B = {3,4,5}
集合 A×B 和 B×A 的结果集分别表示为:
A×B={(1,3), (1,4), (1,5), (2,3), (2,4), (2,5) };
B×A={(3,1), (3,2), (4,1), (4,2), (5,1), (5,2) };
以上 A×B和 B×A的结果就叫做两个集合的笛卡尔积。
两个集合相乘,不满足交换率,即 A×B≠B×A。
A集合和 B集合的笛卡尔积是 A集合的元素个数 ×B集合的元素个数。
语法格式如下:
SELECT <字段名> FROM <表1> CROSS JOIN <表2> [WHERE子句]
或 SELECT <字段名> FROM <表1>, <表2> [WHERE子句]
字段名:需要查询的字段名称。
<表1><表2>:需要交叉连接的表名。
WHERE子句:用来设置交叉连接的查询条件。
注意:多个表交叉连接时,在 FROM后连续使用 CROSS JOIN或,即可。以上两种语法的返回结果是相同的,但是第一种语法才是官方建议的标准写法。
select * from course cross join test_db;
select * from course crosee join test_db where test_db.dept_id=course.id;
交叉连接会在表内产生非常多冗余的信息,会导致访问会非常非常慢。一般情况下不建议使用交叉连接。
(12)内连接
语法格式如下:SELECT <字段名> FROM <表1> INNER JOIN <表2> [ON子句]
字段名:需要查询的字段名称。
<表1><表2>:需要内连接的表名。
INNER JOIN:内连接中可以省略 INNER关键字,只用关键字JOIN。
ON子句:用来设置内连接的连接条件。如果没有连接条件,INNER JOIN和 CROSS JOIN在语法上是等同的,两者可以互换。
lg:select s.name,c.name from test_db s inner join course c on s.dept_id = c.id;
(13)外连接:外连接可以分为左外连接和右外连接
左连接的语法格式如下:SELECT <字段名> FROM <表1> LEFT OUTER JOIN <表2> <ON子句>
字段名:需要查询的字段名称。
<表1><表2>:需要左连接的表名。
LEFT OUTER JOIN:左连接中可以省略 OUTER关键字,只使用关键字 LEFT JOIN。
ON子句:用来设置左连接的连接条件,不能省略。
右连接的语法格式如下:
SELECT <字段名> FROM <表1> RIGHT OUTER JOIN <表2> <ON子句>
字段名:需要查询的字段名称。
<表1><表2>:需要右连接的表名。
RIGHT OUTER JOIN:右连接中可以省略 OUTER关键字,只使用关键字 RIGHT JOIN。
ON子句:用来设置右连接的连接条件,不能省略。
(14)子查询
子查询在 WHERE 中的语法格式:WHERE <表达式> <操作符> (子查询)
<操作符>:操作符可以是比较运算符和 IN、NOT IN、EXISTS、NOT EXISTS等关键字
注意事项:
子查询语句可以嵌套在 SQL 语句中任何表达式出现的位置
只出现在子查询中而没有出现在父查询中的表不能包含在输出列中