前言
由于操作中需要展示一些数据结果,这里先展示一些相关的两个表数据。
IN 操作符
IN 操作符允许我们在 WHERE 子句中规定多个值
SQL in 语法
select column_name(s) from Table where in (value1,....)
示例
-- 查询所在城市是 ShangHai、HangZhou 的用户
select * from User where city in ('ShangHai','HangZhou')
in 操作符 相当于 查询 city = shanghai 或者 city = hangzhou 的这些数据。
Between..And
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
语法
select * from TABLE where column_name between value1 and value2
示例1 : between and
-- 查询 年龄 18 - 50 岁的用户(包含 18、50 )
select * from User where age between 18 and 50
示例2 : not between and
-- 查询 年龄 0 - 18 之外的用户(不包含0、18)
select * from User where age not between 0 and 18
重要:
不同的数据库对 BETWEEN...AND 操作符的处理方式是有差异的。某些数据库会列出介于 "Adams" 和 "Carter" 之间的人,但不包括 "Adams" 和 "Carter" ;某些数据库会列出介于 "Adams" 和 "Carter" 之间并包括 "Adams" 和 "Carter" 的人;而另一些数据库会列出介于 "Adams" 和 "Carter" 之间的人,包括 "Adams" ,但不包括 "Carter" 。
所以,请检查你的数据库是如何处理 BETWEEN....AND 操作符的!
SQL Alias
表的 SQL Alias 语法(就是为字段、表 起一个简写的别名)
语法
select column_name(s) from Table as alias_name
示例
-- 原始语句
select Person.name ,Person.city ,User.name ,User.age from Person ,User
-- 使用方式一
select p.name , p.city ,u.name ,u.age from Person as p , User as u
-- 使用方式二 (可以省略 as 关键字 ,
select p.name , p.city ,u.name ,u.age from Person p , User u
-- 注意 这里查询出来的结果是 (Person表的数量 * User表的数量) 条数据
JOIN
SQL JOIN 用于根据两个,或者多个表中的列之间的关系,进行查询这些表中的数据。
关键字 JOIN.. ON..
语法
select column_name(s) from Table1 join Table2 ON table1.column_name = table2.column_name
示例
select o.id, o.order_num ,u.name from User as u JOIN Orders as o ON u.id =o.u_id
等同于
select o.id,o.order_num, u.name from User as u ,Orders as o where u.id = o.u_id
select o.id ,o.order_num ,u.name from User as u inner JOIN Orders as o ON u.id=o.u_id
示例结果
LEFT JOIN
SQL left join 以左表为参照,返回左表的所有数据,如果右表中没有与之匹配的数据,则显示 null. 如果右表中有左表中的重复数据,则多次显示。
语法
select column_name(s) from Table1 left join Table2 on Table1.column_name = Table2.column_name
在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。
示例一
select * from Orders as o left join User as u on u.id = o.u_id
示例结果
示例二
select * from User as u left join Orders as o on u.id = o.u_id
示例结果
Right JOIN
SQL right join 通过名字就能知道,它和 left join 是相反的,摘录 菜鸟教程 的介绍就是
RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。
语法
select column_name(s) from Table1 RIGHT JOIN Table2 ON Table1.column_name = Table2.column_name
在某些数据库中, RIGHT JOIN 称为 RIGHT OUTER JOIN。
示例一(和 Left join 示例一 对应 )
select * from Orders as o right join User as u on u.id = o.u_id
示例结果(查询结果等同于 left Join 示例二)
示例二(和 Left join 示例二 对应)
select * from User as u right join Orders as o on u.id = o.u_id
示例结果(查询结果等同于 left Join 示例一)
FULL OUTER JOIN
MySql 不支持 此操作符。相关介绍 机票->菜鸟教程
UNION
合并两个或多个 select 语句的结果集 ,需要注意的是,在使用 union 时,UNION 内部的每个 SELECT 语句必须拥有相同数量的列 , 也就是 select 1 查询的列 要和 select2 查询的列数量一样。
语法
select column_name(s) from Table1 --注释: select1
union
select column_name(s) from Table2 --注释: select2
示例一
(select o.u_id as Id from Orders o
union
select u.id from User u)
order by Id
示例结果
+----+
| Id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
+----+
8 rows in set (0.00 sec)
union
默认的不存在重复值, 如果需要允许重复,则 使用 union all
,另外还要注意,默认查询出来的结果字段 默认使用 select1 的字段,如果字段有 alias 则使用 alias .
示例二
(select o.u_id as Id, o.order_num from Orders o
union
select u.name ,u.age from User u)
order by Id
示例结果
+--------+-----------+
| Id | order_num |
+--------+-----------+
| 2 | 10000 |
| 2 | 10010 |
| 3 | 10001 |
| 6 | 10003 |
| 6 | 10008 |
| 8 | 10004 |
| 8 | 10009 |
| 发强 | 16 |
| 孙六 | 16 |
| 张三 | 0 |
| 李四 | 18 |
| 王五 | 19 |
| 老二 | 0 |
| 赵7 | 18 |
+--------+-----------+
14 rows in set (0.00 sec)
这里要注意的是,多列合并的时候,只有当两条数据的所有查询结果列数据完全相同时,才被认定为重复数据。
示例 UNION All
union all 是允许有重复数据,
(select o.u_id Id from Orders o
union all
select u.id from User u)
order by Id
示例结果
+----+
| Id |
+----+
| 1 |
| 2 |
| 2 |
| 2 |
| 3 |
| 3 |
| 4 |
| 5 |
| 6 |
| 6 |
| 6 |
| 7 |
| 8 |
| 8 |
| 8 |
+----+
15 rows in set (0.00 sec)