SQL 笔记系列三(操作符)

前言

由于操作中需要展示一些数据结果,这里先展示一些相关的两个表数据。


Table Name Orders

Table Name User

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

<font color='red'>重要</font>:
不同的数据库对 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)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容