本博客为博主查阅大量资料后整理原创,虽水仍不易,如需转载,请附上本文链接https://blog.csdn.net/JasonLeeeeeeeeee/article/details/82319756,谢谢
本文若有不足之处可以交流沟通,互相学习
本文是博主读了《SQL必知必会》后,觉得有用的一些地方特地拿出来汇成一篇博客,当笔记用吧。书中对于常见的几种数据库的语法都有提到,本文只罗列了MySQL语句。
SELECT
检索不同的值:
SELECT DISTINCT vend_id FROM Products;
DISTINCT关键字作用于所有的列,不仅仅是跟在其后的那一列。例如,SELECT DISTINCT vend_id, prod_price, 因为指定的两列不完全相同,所以所有的行都会被检测出来。
限制结果:
SELECT prod_name FROM Products LIMIT 5;
表示返回的值是前5行的结果。用关键字LIMIT来限制最多返回多少行。
SELECT prod_name FROM Products LIMIT 5 OFFSET 5;
LIMIT带的OFFSET指定从第几行开始。注意第一个被检索的行是第0行,因此LIMIT 1 OFFSET 1 会返回检索第二行。对于这条语句MySQL还有一个简化版的语句,例如LIMIT 4 OFFSET 3的语句,简化版为LIMIT 3,4 ,其中逗号前为OFFSET值,逗号后为LIMIT值。
使用注释:
– 这是嵌在SQL语句行后的注释符; # 表示一整行都是注释; /* 范围内的行都是注释 */。
排序:
SELECT prod_id, prod_price, prod_name FROM Products ORDER BY prod_price, prod_name;
上句表示先按照prod_price进行升序,然后按照prod_name进行升序排序;
SELECT prod_id, prod_price, prod_name FROM Products ORDER BY 2,3;
表示先按照第二个字段prod_price进行升序,然后按照prod_name升序进行排序,注意当根据不出现在SELECT清单中的列进行排序时,不能用此法。相对列的位置和实际列名混合使用。
SELECT prod_id, prod_price, peod_name FROM Products ORDER BY prod_price DESC, prod_name;
表示先按照prod_price进行降序,然后按照prod_name进行升序排序。如果想在多个列上进行降序排序,必须对每一列都指定关键字DESC。
在排序的时候,A与a默认为是相同大小。
WHERE过滤数据
当同时使用 ORDER BY 和 WHERE 子句时,先写 WHERE,再写 ORDER BY,否则会报错。
条件操作符 <> 与 != 相同, !< 相当于 >=。
IN 在 WHERE 子句中用来指定要匹配值的清单的关键字,功能与OR相当。
例如 SELECT prod_price, prod_name FROM Products WHERE vend_id IN (‘DLL01’,’BRS01’);相当于SELECT prod_price, prod_name FROM Products WHERE vend_id = ‘DLL01’ OR vend_id = ‘BRS01’;
IN的优点:更清楚,更直观;求值顺序更容易管理;IN操作符一般比一组OR操作符执行得更快;IN可以包含其他的SELECT语句。
LIKE过滤数据
SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE ‘Fish%’;
表示搜索prod_name字段以 ‘Fish’ 开头的,后续任意长度字符的行。
拼接字段
SELECT Concat(vend_name, ‘(‘, vend_country, ‘)’) AS vend_title FROM Vendors ORDER BY vend_name;
将 vend_name(vend_country) 拼接起来,并进行重新命名为 vend_title。
在SELECT之后也可进行加减乘除的运算。
函数
函数 | 说明 |
---|---|
NOW() | 获取当前日期 |
YEAR() | 从日期中提取年份 |
SUBSTRING() | 提取字符串的子串 |
LEFT() | 返回字符串左边的字符 |
RIGHT() | 返回字符串右边的字符 |
LENGTH() | 返回字符串的长度 |
LOWER() | 将字符串转换为小写 |
UPPER() | 将字符串转换为大写 |
SOUNDEX() | 返回字符串的SOUNDEX值,用来查找发音相似的字符串 |
LTRIM() | 去掉字符串左边的空格 |
RTRIM() | 去掉字符串右边的空格 |
TRIM() | 去掉字符串两边的空格 |
SIN() | 返回一个角度的正弦 |
COS() | 返回一个角度的余弦 |
TAN() | 返回一个角度的正切 |
ABS() | 返回一个数的绝对值 |
EXP() | 返回一个数的指数值 |
SQRT() | 返回一个数的平方根 |
PI() | 返回圆周率 |
CONVERT() | 数据类型转换 |
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行数 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列值之和 |
创建和过滤分组
SELECT cust_id, COUNT() AS orders FROM Orders GROUP BY cust_id HAVING COUNT() >= 2;
这条语句是先按照cust_id进行分组统计每个客户id的订单量,然后筛选订单量至少为2的客户id,最后输出客户id和该客户的订单量。
HAVING 和 WHERE 的区别:HAVING过滤分组,而WHERE过滤行;HAVING是在分组后进行过滤,而WHERE是在分组前进行过滤,也就是说WHERE排除的行不在分组中。
SELECT子句顺序
子句 | 说明 | 是否必须使用 |
---|---|---|
SELECT | 返回的列或表达式 | 是 |
FROM | 从中检索的数据表 | 仅在从表中选择数据时使用 |
WHERE | 行级过滤 | 否 |
GROUP BY | 分组说明 | 仅在按组聚集时使用 |
HAVING | 组级过滤 | 否 |
ORDER BY | 输出排序顺序 | 否 |
联接表
SELECT vend_name, prod_name, prod_price
FROM Vendors INNER JOIN Products
ON Vendors.vend_id = Products.vend_id;
在使用这种语法时,联结条件用特定的ON子句而不是WHERE子句。
SELECT Customers.cust_id, Orders.order_num
FROM Customers LEFT OUTER JOIN Orders
ON Customers.cust_id = Orders.cust_id;
这里与上条语句不同的是,这里是外联接,上面是内联接。外联结包括没有关联行的行,也就是该语句的返回中不但包括左右有联接的行,而且包括其中左表中其他未找到联接行的行。如果想返回全部Orders表内容,可以调换两个表的位置或者将关键字LEFT改为RIGHT。
参考文献:
SQL必知必会 Ben Forta