您的位置:首页 > 数据库

Sql语句学习笔记(4)-查询1

2010-05-24 12:39 627 查看
这里使用的数据库和数据表分别来自Sql语句学习笔记(1)——创建数据库和Sql语句学习笔记(2)——创建数据表

use RetalDB
/********************
单表查询
*********************/

--查询tb_user中的数据:无条件查询
--(1)
select * from tb_user--查询所有信息
--(2)
select top 2 * from tb_user-- 只查询前2行数据
--(3)
select user_id,user_name from tb_user;--指定查询列
--(4)
select user_id as '用户编号',user_name as '用户名',user_point as '用户积分'
from tb_user--给列取别名

/**********************
where 条件查询
比较运算符(大小比较):
>、>=、=、<、<=、<>、!>、!<
*********************/
---查tb——user中的数据,有条件查询
--(5)
select * from tb_user where user_id=2010001--“=”查询指定查询id为2010001的这个人的全部信息
--(6)
select * from tb_user where user_name like '%刘%'--模糊查询姓刘的人,其中%是通配符

/*************************
多表联合查询
*************************/
--(7)
select movie_id,movie_name,movie_price
from tb_movie,tb_movie_type
where type_name='普通片' and
tb_movie_type.type_id=tb_movie.movie_type_id --查询类型为普通片的电影信息
--(8)
select user_name from tb_user A,tb_retal B--给表去别名
where rent_time<getDate() and A.user_id=B.user_id--查询此前租过影碟的用户
--(9)
select distinct user_name from tb_user A,tb_retal B--给表去别名
where rent_time<getDate() and A.user_id=B.user_id--去掉了上一个查询中的重复列

--select into的用法,创建临时表,这个表必须在系统中不存在
--(10)
select user_name,type_name,rent_time,movie_name--查询用户的租赁信息
into tempTable
from tb_user A,tb_movie B,tb_movie_type C,tb_retal D
where A.user_id=D.user_id and B.movie_id=D.movie_id and C.type_id=B.movie_type_id
--(11)
select distinct * from tempTable--distinct是对整行过滤,只有两行完全相同时才过滤掉
select * from tempTable

--综合查询
--查询类型为0的所有片子
--(12)
select movie_name,movie_price,type_name
from tb_movie movie,tb_movie_type type
where type.type_id=movie.movie_type_id
and movie.movie_type_id=0

--查询价格大于1的所有影片个数
--(13)
select count(*) from tb_movie
where movie_price>1

--按影片名降序排列,默认为asc升序排列
select * from tb_movie order by(movie_name) desc

----order by 对查询到的结果集进行排序,前面已经写过了,top关键字也是对结果集进行操作
--查询前50%的记录,并按片名排序(排序先执行的,然后取前50%的记录。)
--(14)
select top 50 percent * from tb_movie
order by(movie_name) desc

--查询所有新片的信息
--(15)
select movie_name,movie_price,movie_detail
from tb_movie movie,tb_movie_type type
where type.type_english_name='NewRelease'
and type.type_id=movie.movie_type_id

--查询所有儿童片的平均价,最高价,最低价,总价,影片个数
--(16)
select avg(movie_price) as 平均价,sum(movie_price) as 总值,
max(movie_price) as 最大值,min(movie_price) as 最小值,count(*) as 影片个数
from tb_movie m,tb_movie_type t
where m.movie_type_id=t.type_id and t.type_english_name='Children'

--查询所有影片类型的平均价,最高价,最低价,影片个数
/**************************************
*group by的使用
*select子句的选项列表中可以包含聚合函数,
*但子句后的各列或包含在聚合函数中或包含
*在group by子句中,否则出错
*************************************/
--(17)
select type_name,movie_type_id,avg(movie_price) as 平均价,sum(movie_price) as 总值,
max(movie_price) as 最大值,min(movie_price) as 最小值,count(*) as 影片个数
from tb_movie m,tb_movie_type t
where m.movie_type_id=t.type_id
group by m.movie_type_id,t.type_name

--对查询到的结果集进行操作
--group by对查询到的结果集进行分组
--(18)
select movie_type_id from tb_movie
group by movie_type_id
--注释:group by的分组结构是:对哪个列进行分组
--如果写成
select movie_name,movie_type_id from tb_movie
group by movie_type_id--这句话的本意是想以id进行分组查询
--但这句话报错了:"选择列表中的列 'tb_movie.movie_name' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中"
--这个错误也就是对上一句中使用/**/注意部分的解释

/***************
having子句的用法
Having用于限制组或聚合函数的查询条件,通常用在Group By之后,
与Where子句相似,但是Where是对原始记录进行过滤,Having子句是对查询结果进行过滤,
Select和Having子句可以使用聚合函数,而Where子句中不能有聚合函数
***************/
--(19)
--改写17句,在17句的基础上过滤掉影片个数小于3的
select type_name,movie_type_id,avg(movie_price) as 平均价,sum(movie_price) as 总值,
max(movie_price) as 最大值,min(movie_price) as 最小值,count(*) as 影片个数
from tb_movie m,tb_movie_type t
where m.movie_type_id=t.type_id
group by m.movie_type_id,t.type_name
having count(*)>=2

/*************
compute子句
Compute子句用在Where之后,用来计算总计并进行分组小计,
可以使用聚合函数,总计值或小计值将作为附加新行出现在检索结果中
使用该子句时必须使用Order by对Compute by中by指定的列进行排序,否则错误
*************/
--(20)
select * from tb_movie
order by(movie_type_id)
compute avg(movie_price),sum(movie_price) by movie_type_id

/********************
联合查询
union查询:使用Union连接多个Select查询语句
实际上就是将两个结构相同或是选择相同列后具有相同列的查询结果连接起来
union:去掉重复项,union all:保留重复项
*********************/
--(21)
select movie_name from tb_movie
union
select movie_name from tempTable

--观察下面一个语句
--(22)
select movie_name ,movie_price,movie_detail from tb_movie
union
select type_name,type_id,type_english_name from tb_movie_type
--其中列数相同,但列所表示的意义并不一样。此语句语法无错误,可以执行
--这其中存在数据类型的默认转化问题,比如:type_id默认转换为movie_price的类型
select type_name,type_id,type_english_name from tb_movie_type
union
select movie_name ,movie_price,movie_detail from tb_movie
--以上两句话的查询结果是一样的,具体是先执行哪个查询,我也没搞明白,知道的请指点下。

/********************
范围检索:between...and...,not between...and...,in ,not in ,exist,not exist,like,
is null,
********************/
--(23)between:值范围,连续型
--查询票价在3-10之间的影片
select * from tb_movie
where movie_price between 3 and 10
--查询票价不在3-10之间的影片
select * from tb_movie
where movie_price not between 3 and 10

--(24)in:离散型范围
--查询不是儿童片的所有电影信息
select movie_name,movie_price,movie_detail,type_name
from tb_movie m,tb_movie_type t
where m.movie_type_id=t.type_id
and t.type_name in('新片','普通片')
--查询不是新片和普通片的所有电影信息
select movie_name,movie_price,movie_detail,type_name
from tb_movie m,tb_movie_type t
where m.movie_type_id=t.type_id
and t.type_name not in('新片','普通片')

--(24)like:模糊匹配
/*****************
%: 可匹配任意类型和长度的字符串
_( 下划线):可匹配任意单个字符
[]: 指定范围或集合中任何单个字符
[~]: 不属于指定范围或集合的任何单个字符串
******************/
--%查询
select * from tb_movie
where movie_name like '%红%'--查询电影名称有“红”字的

select * from tb_movie
where movie_name like '大%'--查询电影名称以“大”字开头的,‘%大’,表示以“大”结尾,这里不写了
--顺便说下转义字符,对于系统无法识别的字符或是和关键字一样的字符,需要使用escape关键字进行标记
--比如:我要查询电影名字中包含'%红'的电影信息,这里的%不是通配符,而是电影名称中的一个字符,
--如果直接使用like进行查询的话,系统会默认为这里的%是通配符,所以这里需要进行字符转义
select * from tb_movie
where movie_name like '%三/%%' escape '/'--查询电影名称 中含有’三%‘的电影信息
--以上语句有3个%,第一个和第三个是通配符,第二个是转义字符,
--/是转义字符标志,escape表明/后是一个转义字符

--(25)is null:空查询,也是一个离散型范围
select user_name,movie_name,rent_time
from tb_user u,tb_movie m,tb_retal r
where u.user_id=r.user_id and m.movie_id=r.movie_id
and return_time is null--查询未归还影片的客户和影片信息

select user_name,movie_name,rent_time
from tb_user u,tb_movie m,tb_retal r
where u.user_id=r.user_id and m.movie_id=r.movie_id
and return_time is not null--查询已归还影片的客户和影片信息

--子查询:即查询结果作为另一查询的条件
--(26)
select * from tb_movie
where movie_price>
(select avg(movie_price) from tb_movie)--查询价格大于平均价的电影信息,第二个即为子查询

/*************************
*多表连接查询:内连接、外连接、交叉连接
**************************/
/***********************************************
(Inner Join)将两个表中的列进行比较,
将两个表中满足连接条件的行组合起来,作为结果。
内连接有等值连接、自然连接和不等值连接
内连接可以使用where和inner join...on...来实现
其中等值连接和自然连接类似,inner join...on的效率要高于where
************************************************/
--(27)等值连接
select * from tb_movie m,tb_movie_type t
where m.movie_type_id=t.type_id
--(28)自然连接,消除了等值连接里的重复项
select tb_movie.*,type_name,type_english_name
from tb_movie m,tb_movie_type t
where m.movie_type_id=t.type_id
--不等值的和等值的类似,在此不列举了

/************************************
外连接:外连接有主表和从表之分,以主表中的列去匹配从表中的列,
符合连接条件的直接返回,不符合的填充null后才返回
************************************/
--(29)left join:左外连接,查询用户租碟记录
--其中tb_user(主表)中存在的用户,但在tb_retal(从表)没有租碟信息的以null填充
select user_name,tb_retal.*
from tb_user
left join tb_retal on tb_user.user_id=tb_retal.user_id
--(30)right join:右外连接,查询用户租碟记录
--右外连接,查询用户租碟记录
--其中tb_user(从表)中存在的用户,但在tb_retal(主表)没有租碟信息的用户不显示出来
select user_name,tb_retal.*
from tb_user
right join tb_retal on tb_user.user_id=tb_retal.user_id

/*************************
full join :全外连接,无主从表之分
*************************/
--(31)
select user_name,tb_retal.*
from tb_user
full join tb_retal on tb_user.user_id=tb_retal.user_id

/*************************
cross join :交叉连接,也叫非限制连接,
他将两个表不加任何约束的组合起来。
在数学上就是两个表笛卡尔积,结果集的行数是连个表行数的乘积
*************************/
--(32)
select * from tb_user,tb_movie
select * from tb_user
cross join tb_movie

/**************************
SELF JOIN就是一个表于它自身的不同行进行连接,
因为表名要在From子句中出现2次,所以要对表定义两个别名,
使之在逻辑上成为2张表,Select中引用的列名也要使用表的别名进行限定
**********************************/
--(33)
select a.* from tb_retal a,tb_retal b
where a.user_id=b.user_id and a.rent_time<>b.rent_time

/***********************
all和any的作用
共同点:均表示一个范围,离散的或连续的
不同点:all表示满足所有条件,any表示只需满足其中一个最弱的条件
***********************/
--all
select * from tb_movie
where movie_id>
all(select movie_id from tb_movie)
--any
select * from tb_movie
where movie_id>
any(select movie_id from tb_movie)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: