程序员必备——SQL语法速成手册( 三 )


JOIN 有两种连接类型:内连接和外连接 。
内连接又称等值连接,使用 INNER JOIN 关键字 。在没有条件语句的情况下返回笛卡尔积 。
自连接可以看成内连接的一种,只是连接的表是自身而已 。
自然连接是把同名列通过 = 测试连接起来的,同名列可以有多个 。
内连接 vs 自然连接
内连接提供连接的列,而自然连接自动连接所有同名列 。
外连接返回一个表中的所有行,并且仅返回来自次表中满足连接条件的那些行,即两个表中的列是相等的 。外连接分为左外连接、右外连接、全外连接(MySQL 不支持) 。
左外连接就是保留左表没有关联的行 。
右外连接就是保留右表没有关联的行 。
连接 vs 子查询
连接可以替换子查询,并且比子查询的效率一般会更快 。

程序员必备——SQL语法速成手册

文章插图
 
内连接(INNER JOIN)SELECT vend_name, prod_name, prod_priceFROM vendors INNER JOIN productsON vendors.vend_id = products.vend_id;自连接SELECT c1.cust_id, c1.cust_name, c1.cust_contactFROM customers c1, customers c2WHERE c1.cust_name = c2.cust_nameAND c2.cust_contact = 'Jim Jones';自然连接(NATURAL JOIN)SELECT *FROM ProductsNATURAL JOIN Customers;左连接(LEFT JOIN)SELECT customers.cust_id, orders.order_numFROM customers LEFT JOIN ordersON customers.cust_id = orders.cust_id;右连接(RIGHT JOIN)SELECT customers.cust_id, orders.order_numFROM customers RIGHT JOIN ordersON customers.cust_id = orders.cust_id;组合(UNION)
  • UNION 运算符将两个或更多查询的结果组合起来,并生成一个结果集,其中包含来自 UNION 中参与查询的提取行 。
  • UNION 基本规则
    • 所有查询的列数和列顺序必须相同 。
    • 每个查询中涉及表的列的数据类型必须相同或兼容 。
    • 通常返回的列名取自第一个查询 。
  • 默认会去除相同行,如果需要保留相同行,使用 UNION ALL 。
  • 只能包含一个 ORDER BY 子句,并且必须位于语句的最后 。
  • 应用场景
    • 在一个查询中从不同的表返回结构数据 。
    • 对一个表执行多个查询,按一个查询返回数据 。
组合查询
SELECT cust_name, cust_contact, cust_emailFROM customersWHERE cust_state IN ('IL', 'IN', 'MI')UNIONSELECT cust_name, cust_contact, cust_emailFROM customersWHERE cust_name = 'Fun4All';JOIN vs UNION
  • JOIN vs UNION
    • JOIN 中连接表的列可能不同,但在 UNION 中,所有查询的列数和列顺序必须相同 。
    • UNION 将查询之后的行放在一起(垂直放置),但 JOIN 将查询之后的列放在一起(水平放置),即它构成一个笛卡尔积 。
五、函数
注意:不同数据库的函数往往各不相同,因此不可移植 。本节主要以 Mysql 的函数为例 。
文本处理
程序员必备——SQL语法速成手册

文章插图
 
其中, SOUNDEX() 可以将一个字符串转换为描述其语音表示的字母数字模式 。
SELECT *FROM mytableWHERE SOUNDEX(col1) = SOUNDEX('Apple')日期和时间处理
  • 日期格式:YYYY-MM-DD
  • 时间格式:HH:MM:SS

程序员必备——SQL语法速成手册

文章插图
 
mysql> SELECT NOW();2018-4-14 20:25:11数值处理
程序员必备——SQL语法速成手册

文章插图
 
汇总
程序员必备——SQL语法速成手册

文章插图
 
AVG() 会忽略 NULL 行 。
使用 DISTINCT 可以让汇总函数值汇总不同的值 。
SELECT AVG(DISTINCT col1) AS avg_colFROM mytable六、排序和分组ORDER BY
  • ORDER BY 用于对结果集进行排序 。
    • ASC :升序(默认)
    • DESC :降序
  • 可以按多个列进行排序,并且为每个列指定不同的排序方式
指定多个列的排序方向
SELECT * FROM productsORDER BY prod_price DESC, prod_name ASC;GROUP BY
  • GROUP BY 子句将记录分组到汇总行中 。
  • GROUP BY 为每个组返回一个记录 。
  • GROUP BY 通常还涉及聚合:COUNT,MAX,SUM,AVG 等 。
  • GROUP BY 可以按一列或多列进行分组 。
  • GROUP BY 按分组字段进行排序后,ORDER BY 可以以汇总字段来进行排序 。
分组


推荐阅读