基本数据操作(CRUD)
INSERT
INSERT VALUES 的语法格式为:
INSERT INTO <表名> [ <列名1> [ , … <列名n>] ] VALUES (值1) [… , (值n) ];
语法说明如下。
-
<表名> :指定被操作的表名。
-
<列名> :指定需要插入数据的列名。若向表中的所有列插入数据,则全部的列名均可以省略,直接采用 INSERT<表名>VALUES(…) 即可。
-
VALUES 或 VALUE 子句:该子句包含要插入的数据清单。数据清单中数据的顺序要和列的顺序相对应。
DELETE
DELETE语法:DELETE FROM 表名 WHERE 条件
UPDATE
使用 UPDATE 语句修改单个表,语法格式为:
UPDATE <表名> SET 字段1=值1 [,字段2=值2… ] [WHERE 子句 ]
-
<表名> :用于指定要更新的表名称。
-
SET 子句:用于指定表中要修改的列名及其列值。其中,每个指定的列值可以是表达式,也可以是该列对应的默认值。如果指定的是默认值,可用关键字 DEFAULT 表示列值。
-
WHERE 子句:可选项。用于限定表中要修改的行。若不指定,则修改表中所有的行。
注意:修改一行数据的多个列值时,SET 子句的每个值用逗号分开即可。
SELECT
在 MySQL中,可以使用 SELECT 语句来查询数据。查询数据是指从数据库中根据需求,使用不同的查询方式来获取不同的数据,是使用频率最高、最重要的操作。
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 如何显示查询出来的数据,并按照指定的字段分组。
-
HAVING <expression> 选择符合条件的组
-
[ORDER BY< 字段 >] ,该子句告诉 MySQL 按什么样的顺序显示查询出来的数据,可以进行的排序有升序(ASC)和降序(DESC),默认情况下是升序。
-
[LIMIT[<offset>,]<row count>] ,该子句告诉 MySQL 每次显示查询出来的数据条数。
查询
去重
DISTINCT 关键字的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据给用户。
DISTINCT 关键字的语法格式为:
SELECT DISTINCT <字段名> FROM <表名>;
设置别名
-
为表指定别名的基本语法格式为:
<表名> [AS] <别名>
其中各子句的含义如下:
-
<表名> :数据库中存储的数据表的名称。
-
<别名> :查询时指定的表的新名称。
-
AS 关键字可以省略,省略后需要将表名和别名用空格隔开。
-
为字段指定别名的基本语法格式为:
<字段名> [AS] <别名>
其中,各子句的语法含义如下:
-
<字段名> :为数据表中字段定义的名称。
-
<字段别名> :字段新的名称。
-
AS 关键字可以省略,省略后需要将字段名和别名用空格隔开。
限制查询条数
LIMIT 关键字可以指定查询结果从哪条记录开始显示,显示多少条记录。
LIMIT 指定初始位置的基本语法格式如下:
LIMIT 初始位置,记录数
其中,“初始位置”表示从哪条记录开始显示;“记录数”表示显示记录的条数。第一条记录的位置是 0
排序
ORDER BY 关键字主要用来将查询结果中的数据按照一定的顺序进行排序。其语法格式如下:
ORDER BY <字段名> [ASC|DESC]
语法说明如下。
-
字段名:表示需要排序的字段名称,多个字段时用逗号隔开。
-
ASC|DESC: ASC 表示字段按升序排序; DESC 表示字段按降序排序。其中 ASC 为默认值。
使用 ORDER BY 关键字应该注意以下几个方面:
-
ORDER BY 关键字后可以跟子查询。
-
当排序的字段中存在空值时,ORDER BY 会将该空值作为最小值来对待。
-
ORDER BY 指定多个字段进行排序时,MySQL 会按照字段的顺序从左到右依次进行排序。
条件查询
如果需要有条件的从数据表中查询数据,可以使用 WHERE 关键字来指定查询条件。
使用 WHERE 关键字的语法格式如下:
WHERE 查询条件
查询条件可以是:
-
带 比较运算符 和逻辑运算符的查询条件
-
> >= < <= <> =
-
and or not
-
-
带 BETWEEN AND 关键字的查询条件
-
带 IS NULL 关键字的查询条件
-
带 IN 关键字的查询条件
-
带 LIKE 关键字的查询条件
like模糊查询
LIKE 关键字主要用于搜索匹配字段中的指定内容。其语法格式如下:
[NOT] LIKE '字符串'
其中:
-
NOT :可选参数,字段中的内容与指定的字符串不匹配时满足条件。
-
字符串:指定用来匹配的字符串。“字符串”可以是一个很完整的字符串,也可以包含通配符。
LIKE 关键字支持百分号“%”和下划线“_”通配符。
通配符是一种特殊语句,主要用来模糊查询。当不知道真正字符或者懒得输入完整名称时,可以使用通配符来代替一个或多个真正的字符"%" 它能代表任何长度的任意字符串"_” 只能代表单个字符,字符的长度不能为 0,例如, a_b 可以代表 acb、adb、aub 等字符串
范围查询
BETWEEN AND 关键字,用来判断字段的数值是否在指定范围内。
BETWEEN AND 需要两个参数,即范围的起始值和终止值。如果字段值在指定的范围内,则这些记录被返回。如果不在指定范围内,则不会被返回。
使用 BETWEEN AND 的基本语法格式如下:
[NOT] BETWEEN 取值1 AND 取值2
其中:
-
NOT:可选参数,表示指定范围之外的值。如果字段值不满足指定范围内的值,则这些记录被返回。
-
取值1:表示范围的起始值。
-
取值2:表示范围的终止值。
空值查询
IS NULL 关键字,用来判断字段的值是否为空值(NULL)。空值不同于 0,也不同于空字符串。
如果字段的值是空值,则满足查询条件,该记录将被查询出来。如果字段的值不是空值,则不满足查询条件。
使用 IS NULL 的基本语法格式如下:
IS [NOT] NULL
其中,“NOT”是可选参数,表示字段值不是空值时满足条件。
分组查询
GROUP BY 关键字可以根据一个或多个字段对查询结果进行分组。
使用 GROUP BY 关键字的语法格式如下:
GROUP BY <字段名>
其中,“字段名”表示需要分组的字段名称,多个字段时用逗号隔开。在数据统计时,GROUP BY 关键字经常和聚合函数一起使用。
过滤分组
HAVING 关键字对分组后的数据进行过滤。
使用 HAVING 关键字的语法格式如下:
HAVING <查询条件>
HAVING 关键字和 WHERE 关键字都可以用来过滤数据,且 HAVING 支持 WHERE 关键字中所有的操作符和语法。
但是 WHERE 和 HAVING 关键字也存在以下几点差异:
-
一般情况下,WHERE 用于过滤数据行,而 HAVING 用于过滤分组。
-
WHERE 查询条件中不可以使用聚合函数,而 HAVING 查询条件中可以使用聚合函数。
-
WHERE 在数据分组前进行过滤,而 HAVING 在数据分组后进行过滤 。
-
WHERE 针对数据库文件进行过滤,而 HAVING 针对查询结果进行过滤。也就是说,WHERE 根据数据表中的字段直接进行过滤,而 HAVING 是根据前面已经查询出的字段进行过滤。
-
WHERE 查询条件中不可以使用字段别名,而 HAVING 查询条件中可以使用字段别名。
交叉连接
叉连接的语法格式如下:
SELECT <字段名> FROM <表1> CROSS JOIN <表2> [WHERE子句]
或
SELECT <字段名> FROM <表1>, <表2> [WHERE子句]
语法说明如下:
-
字段名:需要查询的字段名称。
-
<表1><表2>:需要交叉连接的表名。
-
WHERE 子句:用来设置交叉连接的查询条件。
注意:多个表交叉连接时,在 FROM 后连续使用 CROSS JOIN 或 , 即可。以上两种语法的返回结果是相同的,但是第一种语法才是官方建议的标准写法。
当连接的表之间没有关系时,我们会省略掉 WHERE 子句,这时返回结果就是两个表的笛卡尔积,返回结果数量就是两个表的数据行相乘。需要注意的是,如果每个表有 1000 行,那么返回结果的数量就有 1000×1000 = 1000000 行,数据量是非常巨大的。
内连接
内连接使用 INNER JOIN 关键字连接两张表,并使用 ON 子句来设置连接条件。如果没有连接条件,INNER JOIN 和 CROSS JOIN 在语法上是等同的,两者可以互换。
内连接的语法格式如下:
SELECT <字段名> FROM <表1> INNER JOIN <表2> [ON子句]
语法说明如下。
-
字段名:需要查询的字段名称。
-
<表1><表2>:需要内连接的表名。
-
INNER JOIN :内连接中可以省略 INNER 关键字,只用关键字 JOIN。
-
ON 子句:用来设置内连接的连接条件。
INNER JOIN 也可以使用 WHERE 子句指定连接条件,但是 INNER JOIN ... ON 语法是官方的标准写法,而且 WHERE 子句在某些时候会影响查询的性能。
多个表内连接时,在 FROM 后连续使用 INNER JOIN 或 JOIN 即可。
外连接
-
左连接
左外连接又称为左连接,使用 LEFT OUTER JOIN 关键字连接两个表,并使用 ON 子句来设置连接条件。
左连接的语法格式如下:
SELECT <字段名> FROM <表1> LEFT OUTER JOIN <表2> <ON子句>
语法说明如下。
-
字段名:需要查询的字段名称。
-
<表1><表2>:需要左连接的表名。
-
LEFT OUTER JOIN:左连接中可以省略 OUTER 关键字,只使用关键字 LEFT JOIN。
-
ON 子句:用来设置左连接的连接条件,不能省略。
上述语法中,“表1”为基表,“表2”为参考表。左连接查询时,可以查询出“表1”中的所有记录和“表2”中匹配连接条件的记录。如果“表1”的某行在“表2”中没有匹配行,那么在返回结果中,“表2”的字段值均为空值(NULL)。
-
右连接
右外连接又称为右连接,右连接是左连接的反向连接。使用 RIGHT OUTER JOIN 关键字连接两个表,并使用 ON 子句来设置连接条件。
右连接的语法格式如下:
SELECT <字段名> FROM <表1> RIGHT OUTER JOIN <表2> <ON子句>
子查询
子查询是 MySQL 中比较常用的查询方法,通过子查询可以实现多表查询。子查询指将一个查询语句嵌套在另一个查询语句中。子查询可以在 SELECT、UPDATE 和 DELETE 语句中使用,而且可以进行多层嵌套。在实际开发时,子查询经常出现在 WHERE 子句中。
子查询在 WHERE 中的语法格式如下:
WHERE <表达式> <操作符> (子查询)
其中,操作符可以是比较运算符和 IN、NOT IN、EXISTS、NOT EXISTS 等关键字。
-
IN | NOT IN
当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE;若使用关键字 NOT,则返回值正好相反。
-
EXISTS | NOT EXISTS
用于判断子查询的结果集是否为空,若子查询的结果集不为空,返回 TRUE,否则返回 FALSE;若使用关键字 NOT,则返回的值正好相反。
合并查询
SELECT ...
UNION [ALL | DISTINCT] SELECT ...
[UNION [ALL | DISTINCT] SELECT ...]
-
UNION:将所有的查询结果合并到一起,然后去除掉相同的记录
-
UNION ALL:将所有的查询结果合并到一起,不会去除掉相同的记录前提条件:结果集列数个数相同,列的类型还要相同或是兼容 使用场景:在项目统计报表模块,用来合并数据