MYSQL语句

一些常用的SQL语句

阅读了廖雪峰SQL教程后的一点笔记,他的教程的网址:https://www.liaoxuefeng.com/wiki/1177760294764384

SELECT FROM <表名>
基本查询,输出表中的所有行所有列,其中
代表输出所有的列。

条件查询

SELECT * FROM <表名> WHERE <条件表达式>
where后面跟得是限制条件,比如找列num的值大于80的行,就可以写成where num>=80,num是列名。

条件表达式可以是多个条件的组合,例如:

<条件1> AND <条件2>. <条件1> OR <条件2> .

写成num>=80 AND num2>=90 表示提取num大于等于80,num2大于等于90条件的行。num>=80 OR num2>=90 表示满足num大于等于80或者num2大于等于90的行,前者的结果包括在后者里面。

NOT <条件>,表示不满足该条件的数据,也是跟在where后面的条件表达式,例如where not num=80。上述NOT条件NOT num= 80其实等价于num <> 80.记住是一个等号,数据字符串是用一个‘标起来,比如str=’abc‘。

如果不加括号,条件运算按照NOT、AND、OR的优先级进行,即NOT优先级最高,其次是AND,最后是OR。加上括号可以改变优先级。

SELECT FROM <表名> WHERE <条件>,表示返回所有列,也可以返回指定列,写成SELECT 列名1,列名2,列名3…… FROW <表名>,还可以用SELECT 列1 别名1, 列2 别名2, 列3 别名3 FROM <表名>为返回的列起个别名,返回的结果是以别名为列名。

加上ORDER BY子句,表示按照某个列排序,是升序排序,比如 ORDER BY num,表示按照num的大小从小到大进行排序输出。

ORDER BY num DESC,表示按照降序输出。

ORDER BY num DESC, num2,表示先按照num降序排列,两数相同时,再按照num2升序排序。

如果有WHERE子句,那么ORDER BY子句要放到WHERE子句后面。

LIMIT OFFSET 语句实现分页,其中limit表示一页放多少个元素,offset表示当前输出页从第几个元素开始输出,标号从0开始代表从第一行数据开始的M行数据,从1开始代表从第二行开始的M行数据,数据不足limit所说那么多,按照实际情况显示,超出的情况下会显示空,LIMIT 15 OFFSET 30还可以简写成LIMIT 30, 15。

SELECT COUNT() FROM <表名>,用于计算表中一共多少行。搭配上where语句就可以用来判断满足某种条件的行有多少,并且可以在count()后面加上别名,输出就是以别名为列名的一行一列的表。除了COUNT还有以下的聚合函数:

函数 说明
SUM 计算某一列的合计值,该列必须为数值类型
AVG 计算某一列的平均值,该列必须为数值类型
MAX 计算某一列的最大值
MIN 计算某一列的最小值
同样的,也是在后面加上一个别名,例如:SELECT AVG(score) average FROM students。

如果聚合查询的WHERE条件没有匹配到任何行,COUNT()会返回0,而SUM()、AVG()、MAX()和MIN()会返回NULL。

SELECT * FROM <表1> <表2>,同时查询两个表的内容,并且会以一张表的形式返回,相当于两张表的笛卡儿积,使用where子句加入联结条件之后就不会这样了。

这种一次查询两个表的数据,查询的结果也是一个二维表,它是表1和表2的“乘积”,即表1的每一行与表2的每一行都两两拼在一起返回。结果集的列数是表1和表2的列数之和,行数是表1和表2的行数之积。两表的同时也可以使用别名,但是要使用表名.列名 别名的形式,避免两个表中有相同名字的列。下面是对表起别名。

FROM <表名1> <别名1>, <表名2> <别名2>

还有BETWEEN 和LIKE。

连接有内链接和外连接。

先确定主表,仍然使用FROM <表1>的语法;
再确定需要连接的表,使用INNER JOIN <表2>的语法;
然后确定连接条件,使用ON <条件…>,这里的条件是s.class_id = c.id,表示students表的class_id列与classes表的id列相同的行需要连接;
可选:加上WHERE子句、ORDER BY等子句。
几种连接的不同:

INNER JOIN只返回同时存在于两张表的行数据,由于表1的class_id包含1,2,3,表2的id包含1,2,3,4,所以,INNER JOIN根据条件s.class_id = c.id返回的结果集仅包含1,2,3。

RIGHT OUTER JOIN返回右表都存在的行。如果某一行仅在右表存在,那么结果集就会以NULL填充剩下的字段。

LEFT OUTER JOIN则返回左表都存在的行。如果我们给表1增加一行,并添加class_id=5,由于表2并不存在id=5的行,所以,LEFT OUTER JOIN的结果会增加一行,对应的class_name是NULL。

FULL OUTER JOIN,它会把两张表的所有记录全部选择出来,并且,自动把对方不存在的列填充为NULL。

JOIN查询需要先确定主表,然后把另一个表的数据“附加”到结果集上;

INNER JOIN是最常用的一种JOIN查询,它的语法是SELECT … FROM <表1> INNER JOIN <表2> ON <条件…>;

JOIN查询仍然可以使用WHERE条件和ORDER BY排序。

插入语句:

INSERT INTO <表名> (字段1, 字段2, …) VALUES (值1, 值2, …);
更新语句:

UPDATE <表名> SET 字段1=值1, 字段2=值2, … WHERE …;
删除语句:

DELETE FROM <表名> WHERE …;

SELECT DISTINCT <列名> FROM <表名> 表示只返回不同的值。

LIMIT N,表示返回不多于N行,LIMIT N ,M;输出从N行开始的M行。

WHERE 子句操作符:

= 等于 <> 不等于 != 不等于 < 小于 <= > >= BETWEEN 在指定的两值之间,输入格式BETWEEN x AND y,两个值必须用AND分隔,匹配时包括匹配范围中的所有值,包括边界。

NULL 不包含值,与0 空字符串 仅仅包含空格不同,使用格式 WHERE num IS NULL;

IN操作符,返回括号内的满足每个条件的数据,取值由逗号隔开,num IN (1002,1003);

通配符:匹配值的一部分的特殊字符。

搜索模式:由字面值 通配符或两者组合构成的搜索条件。

%通配符:任何字符出现任意次数,包含0次,例如找出所有以jet开头的,WHERE name LIKE ‘jet%’;搜索是区分大小写的。通配符可以在任意位置使用,可以使用多个通配符。

_通配符:和%类是,但是只匹配单个字符,不包括0个。

因为搜索效率,所以不能过度使用通配符,尽量避免将其放在首位,这样搜索起来是最慢的。

正则表达式:用REGEXP,不去区分大小写,加上BINARY 写成 WHERE name REGEXP BINARY ‘sss’就区分大小写了。

它的or匹配写为 ‘1000|20000|3000’表示匹配三者中任意一个。也可以用[123]表示匹配1或者2或者3,其实是‘1|2|3’的另一种写法,[^123]表示匹配除这些字符外的任何东西。范围匹配[0-9]表示匹配0到9.

匹配特殊字符,前面要加上\,例如\.表示匹配. ,\-表示匹配-。

SELECT子句使用顺序:

SELECT

FROM

WHERE

GROUP BY

HAVING

ORDER BY

LIMIT