SQL学习笔记 查询

  1. 基本语法
Select [all | distinct] select_fields_list      -- all 显示所有含重复数据  distinct 不显示重复数据
  From  table_list/view_list                    -- 表或视图 可以是一个或多个表
  [Where conditions]                            -- 条件,可以在一个表 或 多个表
  [group by group_list]                         -- 按需要分组
  [having conditions]                           -- 用于分组的条件 相当于group 的 where
  [order by order_list]                         -- 按制定要求排序   asc升 desc降 newid()随机排序,其他有用random()的

查询语句执行顺序,一般为

FROM JOIN -- WHERE -- GROUP BY -- HAVING -- SELECT -- ORDER BY -- LIMIIT

  1. 比较运算符
=、>、< 、<>、(!=)、>=、<=、!>、!<
not、and 、or、between..and    --  Where 工资 between 1000 and 2000
in(列表值1、列表值2、……..)
is (not) null空值查询
like 模糊查询
%   包含0个或多个字符
_    包含一个字符
[ ]   指定范围如[a-z]、[1-9]
[^]  不属于指定范围 [^a-z]
  1. 查询例子
  • 例子数据表
use db_mysql
go
create table 雇员
(
   雇员编号 int primary key,
   姓名 varchar(20) not null,
   性别 char(2) check(性别='男' or 性别='女')default'男',
   工资 int
)

use db_mysql
go
insert into 雇员(雇员编号,姓名,性别,工资) values(101,'B','男',1200)
insert into 雇员(雇员编号,姓名,性别,工资) values(102,'C','男',1500)
insert into 雇员(雇员编号,姓名,性别,工资) values(103,'D','女',1400)
  • 类型转换
use db_mysql
go
select *,CAST(工资*0.08 as decimal(18,1))as 奖金 from 雇员

--Cast(字段名 as 转换的类型):类型转换 
--  其中类型可以是 bianary char date datetime decimal signed int time unsigned
  • 输出一个连接的字符串信息
use db_mysql
go
select ('雇员编号是'+cast(雇员编号 as varchar(20))+','+'工资是'+cast(工资 as varchar(20)))as 信息 from 雇员 where 工资=1000     
 --显示字符串时,其他类型要通过cast转换为字符型
  • 条件输出信息 between..and
use db_mysql
go
select 姓名,工资状况 =
   case 
     when 工资>900 and 工资<=1200 then '低'
     when 工资>1200 and 工资<=1400 then '高'
   end
   from 雇员
  • 等值查询 in
use db_mysql
go
select * from 订单 where 员工号 in (select 雇员编号 from 雇员 where 姓名='A' )
select * from 订单 where 员工号 in (100,101,102)
select * from 公司 where 公司号 not in (select 公司号 from 雇员) --没有雇员的公司
  • 模糊查询 Like
use db_mysql
go
select * from 雇员 where 工资 like '_[2-4]00'     #1200 1300 1400

like 模糊查询
% 包含0个或多个字符
_ 包含一个字符
[ ] 指定范围如[a-z]、[1-9]
[^] 不属于指定范围 [^a-z]

  1. 高级查询
  • 聚合函数
    对一组数据进行计算并返回单一值,也称为多行函数或组合函数。对整个数据集合进行计算,返回一行汇总结果
函数名 功能
count(*) 统计选择的记录个数
count() 统计特定列中值的个数
sum() 计算总和(必须是数值)
avg() 平均值
max() 最大值
min() 最小值

* count(),avg,sum可以使用 distinct关键字,计算时不包含重复行。count(*)、min、max由于不改变结果,没必要用

  • 查询例子
select count(distinct(公司号))as 无重复公司个数 from 雇员

select count(*) as 2号公司人数,sum(工资)as 工资总和 from 雇员 
     where 公司号 in (select 公司号 from 公司 where 城市='上海')

select * from 雇员 where 工资=(select max(工资)from 雇员)
  • 分组查询
    group by : 分组前的条件 用 where 分组后的条件用having
    分组执行聚合函数
    例如:按公司号分组,显示每个公司 男 员工的平均工资 大于1700的公司
select 公司号, avg(工资) as 不同公司平均工资 from 雇员 
      where 性别='男'  group by 公司号  
      having avg(工资)>1700   -- 显示大于1700的
  • 多列分组查询
select 公司号,性别,AVG(工资) as 不同公司的平均工资 from 雇员
     where 性别 is not null  and  工资>2100 group by 公司号, 性别
select 公司号,性别,AVG(工资) as 不同公司的平均工资 from 雇员
     where 性别 is not null  and  工资>2100 group by 公司号, 性别
    having AVG(工资) > 1600

all: 在group 分组中即使没有符合查询条件的内容,分组字段也会显示。

select 公司号, max(工资) as 最大工资 from 雇员 where 工资>1900
group by all 公司号
--- 即使有公司 工资都小于1900,公司号也会显示,最大工资会显示null
  1. SQL嵌套查询
    用另一个查询语句的结果进行查询。
select * from 学生 where 分数 = (select max(分数)from 学生) 
select * from 学生 where 分数>( select avg(分数) from 学生) and 分数<(select max(分数) from 学生)
--也可以用between ( select avg(分数) from 学生) and (select max(分数) from 学生)  
-- 可以多级嵌套
  • in
select * from 学生  where  分数  in (select max(分数)from 学生),(select min(分数)from 学生))
  • exists 嵌套返回True 或 False
select * from 班级 where exists(select * from 学生 where 班级号 = 学生.班级号  and  分数=100)
-- 显示班上有满分学生 的  班级信息
  1. 多表连接查询JOIN
    连接查询是横向结合,将两个关系库表接成一个更宽的关系表,包括四种:内联查询、左连接查询、右连接查询、全连接查询。多表集合的并、交 和 差运算,也是多表查询。
  • 多表查询
    如果不设置连接条件,则会形成笛卡尔积,即多个表的组合,比如一个表有3行另一个表有10行,连接后一个表有3x10 = 30 行。
select 姓名,分数,地址 from  学生,家庭  -- 组合
-- 学生[姓名 分数 年龄 家庭编号]   家庭[编号,父亲  目前  地址]
select 姓名,分数,地址 from  学生,家庭  where  学生.家庭编号 = 家庭.编号
select 姓名,工资,城市 from 雇员,公司 where  雇员.公司号 = 公司.公司号  and
     (工资 between 600 and 999)and 城市 = '上海'
  • 多表连接查询生成新表 into
    有些操作是无法利用多表查询的,比如group by 必须将多表查询结果生成一个新表,对新表进行分组。
select xxx into 连接的新表 from 雇员, 公司  where  xxx
select  xxx from 连接的新表  group by  公司
  • 超连接查询,即内联查询、左连接查询、右连接查询、全连接查询,使用超连接查询不仅可以将满足条件的记录显示出来,还可以吧一部分不满足条件的记录以NULL显示。
    (1)内连接查询(inner join)使用比较运算对表之间的某些数据进行比较,并列出这些表中与连接条件相匹配的数据行。
--显示雇员姓名及公司坐在地
select 姓名,城市 from 公司 inner join 雇员 on 雇员.公司号 = 公司.编号
   and 城市 is not null and 姓名 like'%美%'
--多表内联查询
select xxx from 公司
   inner join 雇员 on 雇员.公司号 = 公司.编号
  inner join  订单  on  雇员.雇员号 = 订单.雇员号
  and 工资 > 1000 and 订单金额>9999

(2) 左连接查询:除了显示满足连接条件的记录之外,第一张表中 不满足条件的记录 也显示在结果中。

select xxx from 公司
   left join 雇员 on 雇员.公司号 = 公司.编号
   left join  订单  on  雇员.雇员号 = 订单.雇员号
  and 工资 > 1000 and 订单金额>9999
-- 第一个left jion  第一张表是 公司,第二张表是雇员;第二个left join 第一张表是雇员 第二张表是 订单

(3)右连接查询:除了显示满足连接条件的记录之外,第二张表中 不满足条件的记录 也显示在结果中。
(4)全连接查询:除了显示满足连接条件的记录之外,两张表中 不满足条件的记录 也显示在结果中。
·

select xxx from 公司
left join 雇员 on 雇员.公司号 = 公司.编号
right jion 订单 on 雇员.雇员号 = 订单.雇员号
and 工资>600
  • 查询集合的并、交、差
    SQL支持集合的并运算(union)、交运算(intersect)和差运算(except),也就是将几个select的结果集进行运算合并成一个查询结果。为了进行运算,两个查询结果具有相同的字段个数,并且对应的字段要具有相同的数据类型 和 取值范围。
-- 显示城市在 上海  和 工资>999的公司信息
select 编号 from 公司 where 城市 = ‘上海’
union
select 公司号 from 雇员 where 工资>999
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342