查询
SELECT语句的基本格式
SELECT
{*|<字段列表>}
[
FROM<表1>,<表2>...
[WHERE<表达式>
[GROUP BY <group by definition>]
[HAVING<expression>[{<operator><expression>}...]]
[ORDER BY <order by definition>]
[LIMIT [<offset>,]<row count>]
]
SELECT[字段1,字段2,...,字段n]
FROM[表或视图]
WHERE[查询条件]
单表查询
WHERE条件判断符
有:=、<>(或!=)、<、<=、>、>=、BETWEEN
IN关键字查询
IN操作符用来查询满足指定范围内的条件的记录,只要满足条件范围内的一个值即为匹配项。相反的,可以使用关键字NOT来检索不在条件范围内的记录。
BETWEEN AND 范围查询
使用格式BETWEEN low AND high。类似IN关键字,同样可以加NOT。
LIKE字符串匹配查询
具体看前文,运算符。
查询空值
使用格式:字段名 IS (NOT) NULL
AND和OR的多条件查询
OR可以和AND一起使用,但是在使用时要注意两者的优先级,由于AND的优先级高于OR,因此先对AND两边的操作数进行操作,再与OR中的操作数结合。
查询结果不重复
使用DISTINCT关键字指示MySQL消除重复的记录值。语法格式为:
SELECT DISTINCT 字段名 FROM 表名
DISTINCT关键字应用于所有列而不仅是它后面的第一个指定列。
对查询结果排序
ORDER BY field1 [ASC|DESC], field2 [ASC|DESC]… , fieldn[ASC|DESC]
分组查询
MySQL中可以在GROUP BY子句中使用GROUP_CONCAT()函数,将每个分组中各个字段的值显示出来。语法格式:
SELECT field1,field2…,fieldn,GROUP_CONCAT(concat_field) AS concated_name FROM table GROUP BY group_field
使用Having过滤分组
GROUP BY 可以和HAVING一起限定显示记录所需满足的条件,只有满足条件的分组才会被显示。
HAVING关键字与WHERE关键字的区别。HAVING在数据分组之后进行过滤来选择分组,而WHERE排除的记录不再包括在分组中。
在GROUP BY子句中使用WITH ROLLUP
使用WITH ROLLUP关键字之后, 在所有查询出的分组记录之后增加一条记录,该记录计算查询出的所有记录的总和,即统计记录数量。
注:当使用ROLLUP时,不能同时使用ORDER BY子句进行结果排序,即ROLLUP和ORDER BY是互相排斥的。
集合函数
有AVG()、COUNT()、MAX()、MIN()、SUM()
内连接查询
语法格式:
SELECT fields from table1 [AS t1],table2[AS t2] WHERE table1(t1).id = table2(t2).id;
或者使用INNER JOIN:
SELECT fields from table1[AS t1] INNER JOIN table2[AS t2] ON table1(t1).id=table2(t2).id;
使用INNER JOIN连接语法能够确保不会忘记连接条件,而且,WHERE子句在某些时候会影响查询性能。
外连接查询
与内连接的区别,包含没有关联的行中数据。
LEFT JOIN左连接
左连接的结果包括LEFT OUTER子句中指定的左表的所有行,而不仅仅是连接列所匹配的行,如果左表的某行在右表中没有匹配行,则在相关联的结果行中,右表的所有选择列表列均为空值。语法规则:
SELECT fields FROM table1 LEFT OUTER JOIN table2 ON table1.id=table2.id
右连接类似。
子查询
带ANY、SOME关键字的子查询
ANY和SOME是同义词,他们允许创建一个表达式对子查询返回值列表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件。
带ALL的关键字的子查询
与ANY、SOME类似。
带EXISTS关键字的子查询
EXISTS关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行,如果至少返回一行,那么EXISTS返回的结果是true,此时外层查询语句将进行查询。
类似的,还可以使用NOT EXISTS
带IN关键字的子查询
类似运算符号里的IN关键字。可以使用NOT IN。
带比较运算符的子查询
略
合并查询结果
合并时,两个表对应的列数和数据类型必须相同。各个SELECT语句之间使用UNION或UNION ALL关键字分隔。UNION不使用关键字ALL,执行的时候删除重复的记录,所有返回的行都是唯一的;使用关键字ALL的作用是不删除重复行也不对结果进行自动排序。
语法规则:
SELECT column,...FROM table1
UNION [ALL]
SELECT column,...FROM table2
加上ALL关键字语句执行时所需要的资源少,所以尽可能的使用它。
为表和字段取别名
语法规则:
表名 AS 别名
字段名 AS 别名
表别名只在执行查询的时候使用,并不在返回结果中显示,而列别名定义之后,将返回给客户端显示,显示的结果字段为字段列的别名。
使用正则表达式查询
选项 | 说明 |
---|---|
^ | 匹配文本的开始字符。 |
$ | 匹配文本的结束字符。 |
. | 匹配任何单个字符。 |
* | 匹配零个或多个在它前面的字符。 |
+ | 匹配前面的字符1次或多次。 |
<字符串> | 匹配包含指定的字符串的文本。 |
[字符集合] | 匹配字符集合中的任何一个字符。 |
[^] | 匹配不在括号中的任何字符。 |
字符串{n,} | 匹配前面的字符串至少n次。 |
字符串{n,m} | 匹配前面的字符串至少n次,至多m次。如果n为0,此参数为可选参数。 |
什么时候使用引号?
如果将值与字符串类型列进行比较,则需要限定引号;而用来与数值进行比较则不需要引号。
插入
基本语法格式
INSERT INTO table_name(column_list) VALUES(value_list);
虽然使用INSERT插入数据时可以忽略插入数据的列名称,值如果不包含列名称,那VALUES关键字后面的值则不仅要求完整且顺序必须和表定义时列的顺序相同。
同时插入多条记录
INSERT INTO table_name(column_list)
VALUES(value_list), (value_list2),...(value_listn);
使用INSERT同时插入多条记录时,MySQL会返回一些在执行单行插入时没有的额外信息,这些包含数的字符串的意思分别是:
- Reconds:表明插入的记录条数。
- Duplicates:表明插入时被忽略的记录,原因可能是这些记录包含了重复的主键值。
- Warnings:表明有问题的数据值,例如发生数据类型转换。
将查询结果插入到表中
INSERT INTO table_name(columns_list)
SELECT(column_list2) FROM table_name2 WHERE (condition)
注:column_list2指定数据来源表的查询列,该列表必须和column_list列表中的字段个数相同,数据类型相同。
更新
基本语法
UPDATE table_name
SET column_name1 = value1, ...,column_namen = valuen
WHERE (condition);
删除数据
基本语法
DELETE FROM table_name[WHERE <condition>];
如果想删除表中的所有记录,还可以使用TRUNCATE TABLE语句,TRUNCATE将直接删除原来的表并重新创建一个表,其语法结构为TRUNCATE TABLE table_name.TRUNCATE直接删除表而不是删除记录,因此执行速度比DELETE快。