case 嵌套查询与连接查询你需要懂得

1、Case 子查询连接查询


代码如下:

select * from score
create database demo
use demo
create table [user]
(
[uId] int identity( 1 ,1 ) primary key,
[name] varchar ( 50),
[level] int --1骨灰大虾菜鸟
)
insert into [user] ( name, level ) values (' 犀利哥 ', 1 )
insert into [user] ( name, level ) values (' 小月月 ', 2 )
insert into [user] ( name, level ) values (' 芙蓉姐姐 ', 3 )
--case end 单值判断 相当于 switch case
--then 后面的返回值类型必须一致
select [name] ,
case [level]
when 1 then '骨灰 '
when 2 then '大虾 '
when 3 then '菜鸟 '
end as '等级 '
from [user]
use MySchool
select * from score
--case end 第二种用法,相当于多重 if 语句
select studentId ,
case
when english >=90 then ' 优 '
when english >=80 and english <90 then ' 良 '
when english >=70 and english < 80 then ' 中 '
when english >= 60 and english < 70 then ' 可 '
else ' 差 '
end as '成绩 '
from score
order by english

-- 表中有A B C 三列 ,用 SQL 语句实现:当 A列大于 B 列时选择A 列否则选择 B 列,当B 列大于 C列时选择 B 列否则选择 C列。
select
case
when a > b then a
else b
end ,
case
when b > c then b
else c
end
from T

-- 练习
create table test
(
number varchar ( 10),
amount int
)
insert into test( number ,amount ) values ( 'RK1', 10 )
insert into test( number ,amount ) values ( 'RK2', 20 )
insert into test( number ,amount ) values ( 'RK3',- 30 )
insert into test( number ,amount ) values ( 'RK4',- 10 )
select number ,
case
when amount > 0 then amount
else 0
end as '收入 ' ,
case
when amount < 0 then abs ( amount)
else 0
end as '支出 '
from test
--结果如下




代码如下:

-- 有一张表student0 ,记录学生成绩
use demo
CREATE TABLE student0 ( name nvarchar (10 ), subject nvarchar (10 ), result int )
INSERT INTO student0 VALUES (' 张三 ', ' 语文' , 80)
INSERT INTO student0 VALUES (' 张三 ', ' 数学' , 90)
INSERT INTO student0 VALUES (' 张三 ', ' 物理' , 85)
INSERT INTO student0 VALUES (' 李四 ', ' 语文' , 85)
INSERT INTO student0 VALUES (' 李四 ', ' 数学' , 92)
INSERT INTO student0 VALUES (' 李四 ', ' 物理' ,null)
select * from student0
select [name] ,
isnull (sum ( case subject
when ' 语文 ' then result
end ),0 ) as '语文 ' ,
isnull (sum ( case subject
when ' 数学 ' then result
end ),0 ) as '数学 ' ,
isnull (sum ( case subject
when ' 物理 ' then result
end ),0 ) as '物理 '
from student0
group by [name]




代码如下:

-- 子查询将一个查询语句做为一个结果集供其他 SQL 语句使用,就像使用普通的表一样,
-- 被当作结果集的查询语句被称为子查询。所有可以使用表的地方几乎都可以使用子查询来代替。
use myschool
select sName from ( select * from student ) as t
select 1,( select sum ( english) from score ) as ' 和 ',( select avg ( sAge) from student ) as ' 平均年龄 '
-- 查询高一一班所有的学生
select * from student where sClassId =
( select cId from class where cName = '高一一班 ' )
-- 查询高一一班 高二一班所有的学生
-- 子查询返回的值不止一个。当子查询跟随在 = 、!= 、 <、 <= 、> 、 >= 之后
-- 子查询跟在比较运算符之后,要求子查询只返回一个值
-- 如果子查询是多行单列的子查询,这样的子查询的结果集其实是一个集合。可以使用 in 关键字代替 =号
select * from student where sClassId =
( select cId from class where cName in ( '高一一班 ' ,' 高二一班 '))
select * from student where sClassId in
( select cId from class where cName in ( '高一一班 ' ,' 高二一班 '))
-- 查询刘关张的成绩
select * from score where studentId in
( select sId from student where sName in ( '刘备 ' ,' 关羽 ', ' 张飞' ))
-- 删除刘关张
delete from score where studentId in
( select sId from student where sName in ( '刘备 ' ,' 关羽 ', ' 张飞' ))

-- 实现分页
-- 最近入学的个学生
select top 3 * from student
order by sId desc
-- 查询第到个学生
select top 3 * from student
where sId not in ( select top 3 sId from student order by sId desc)
order by sId desc
-- 查询到的学生
select top 3 * from student
where sId not in ( select top 6 sId from student order by sId desc)
order by sId desc
-- 上面是sql 2000 以前的实现方式。 SQLServer2005 后增加了Row_Number 函数简化实现。
--sql 2005 中的分页
select * from
( select row_number () over (order by sId desc ) as num,* from student ) as t
where num between 1 and 3
select * from
( select row_number () over (order by sId desc ) as num,* from student ) as t
where num between 4 and 6
select * from
( select row_number () over (order by sId desc ) as num,* from student ) as t
where num between 7 and 9
select * from
( select row_number () over (order by sId desc ) as num,* from student ) as t
where num between 3 *( 3- 1 ) + 1 and 3 *3
-- 表连接
-- 交叉连接cross join
select * from student
cross join class
-- 内连接inner join...on...
select * from student
inner join class on sClassId = cId
select * from class
-- 查询所有学生的姓名、年龄及所在班级
select sName , sAge, cName ,sSex from student
inner join class on sClassId = cId
where sSex =' 女 '
-- 查询年龄超过岁的学生的姓名、年龄及所在班级
select sName , sAge, cName from class
inner join student on sClassId = cId
where sAge > 20
-- 外连接
--left join...on...
select sName , sAge, cName from class

(0)

相关推荐

  • case 嵌套查询与连接查询你需要懂得

    1.Case 子查询连接查询 复制代码 代码如下: select * from score create database demo use demo create table [user] ( [uId] int identity( 1 ,1 ) primary key, [name] varchar ( 50), [level] int --1骨灰大虾菜鸟 ) insert into [user] ( name, level ) values (' 犀利哥 ', 1 ) insert int

  • 详解MySQL中的分组查询与连接查询语句

    分组查询 group by group by 属性名 [having 条件表达式][ with rollup] "属性名 "指按照该字段值进行分组:"having 条件表达式 "用来限制分组后的显示,满足条件的结果将被显示:with rollup 将会在所有记录的最后加上一条记录,该记录是上面所有记录的总和. 1)单独使用 group by 单独使用,查询结果只显示一个分组的一条记录. 实例: select * from employee group by sex;

  • 详解MySql基本查询、连接查询、子查询、正则表达查询

    查询数据指从数据库中获取所需要的数据.查询数据是数据库操作中最常用,也是最重要的操作.用户可以根据自己对数据的需求,使用不同的查询方式.通过不同的查询方式,可以获得不同的数据.MySQL中是使用SELECT语句来查询数据的.在这一章中将讲解的内容包括. 1.查询语句的基本语法 2.在单表上查询数据 3.使用聚合函数查询数据 4.多表上联合查询 5.子查询 6.合并查询结果 7.为表和字段取别名 8.使用正则表达式查询 什么是查询? 怎么查的? 数据的准备如下: create table STUD

  • Mybatis中连接查询和嵌套查询实例代码

    首先在mysql中确立表: #表一:地址国家表 CREATE TABLE address(aid INT AUTO_INCREMENT PRIMARY KEY,aname VARCHAR(20)); INSERT INTO address VALUES(NULL,"魏国"); INSERT INTO address VALUES(NULL,"蜀国"); INSERT INTO address VALUES(NULL,"吴国"); #表二:出场人物

  • mysql连接查询、联合查询、子查询原理与用法实例详解

    本文实例讲述了mysql连接查询.联合查询.子查询原理与用法.分享给大家供大家参考,具体如下: 本文内容: 连接查询 联合查询 子查询 from子查询 where子查询 exists子查询 首发日期:2018-04-11 连接查询: 连接查询就是将多个表联合起来查询,连接查询方式有内连接.外连接.自然连接.交叉连接.连接查询使得可以同时查看多张表中数据. 内连接:有条件连接,多个表之间依据指定条件连接,匹配结果是保留符合匹配结果的记录. 外连接:与内连接不同的是不管匹配符不符合都保留,根据外连接

  • 经典mysql连接查询例题

    MySQL连接查询相信大家都有所了解,连接查询是在数据库查询操作的时候经常用到的,下面就为您介绍MySQL连接查询 mysql连接查询:支持多表连接 对同一张表可以重复连接多次(别名在多次连接同一张表时很重要) 例题1: 下面有2张表 teams表 比赛结果表:result 问题: 得出一张表:主队,客队,比赛成绩,比赛时间 方法一:子查询和连接查询混合   step1: 复制代码 代码如下: select result.id, t_name as h_name,match_time,resul

  • MySQL笔记之连接查询详解

    连接查询是将两个或两个以上的表按某个条件连接起来,从中选取需要的数据 当不同的表中存在表示相同意义的字段时,可以通过该字段来连接这几张表 参考表:employee 参考表:department 可以看到,上面两张表都有同一个字段d_id 当两张表含有相同意义的字段(可以不同名)时就可以进行连接查询 内连接查询 复制代码 代码如下: mysql> SELECT num, name, employee.d_id, sex, d_name, function    -> FROM employee,

  • MySql连接查询方式详解

    目录 1. 什么是连接查询 2. 连接查询的方式 3. 内连接 1. 等值连接 2. 非等值连接 3. 自连接 4. 外连接 1. 右外连接 2. 左外连接 5. 多张表(两张以上)连接 1. 什么是连接查询 从一张表中单独查询,称为单表查询. 跨表查询,多张表联合其来查询,称为连接查询. 2. 连接查询的方式 内连接: 等值连接 非等值连接 自连接 外连接: 左外连接(左连接) 右外连接(右连接) 当对多张表进行查询,没有任何限制的时候,返回的值是笛卡尔积 3. 内连接 1. 等值连接 查询每

  • mysql多个left join连接查询用法分析

    本文实例讲述了mysql多个left join连接查询用法.分享给大家供大家参考,具体如下: mysql查询时需要连接多个表时,比如查询订单的商品表,需要查询商品的其他信息,其他信息不在订单的商品表,需要连接其他库的表,但是连接的条件基本都是商品ID就可以了,先给一个错误语句(查询之间的嵌套,效率很低): SELECT A.order_id, A.wid, A.work_name, A.supply_price, A.sell_price, A.total_num, A.sell_profit,

  • sql连接查询中,where关键字的位置讲解

    由于笔者天生笨拙,且思维不严谨,也实在不擅长写sql语句,高手请勿见笑,就请直接跳过本文吧. 背景就不多介绍了,先建表,插入测试数据吧.字段那些都有注释 复制代码 代码如下: --医生表CREATE TABLE doctor    (      id INT IDENTITY(1, 1) , --ID 自增长      docNumber NVARCHAR(50) NOT NULL , --医生编码      NAME NVARCHAR(50) NOT NULL   --医生姓名    )go

随机推荐