阅读了廖雪峰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
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