SQL语句
来源:互联网 发布:网络歌手大赛 编辑:程序博客网 时间:2024/06/11 20:55
---分组-------
--分组的目的:对数据进行汇总,统计. 与聚合函数一块使用。
select COUNT(*) from dbo.TblStudent --对表进行分组了,作为一组。
select * from TblStudent
select tSGender, COUNT(*) from TblStudent group by tSGender--先对学生表中的数据按照性别分组,分组以后再执行Count(*)
--统计每个班级有多少人?
select tSClassId,COUNT(*) as 人数 from TblStudent group by tSClassId
select tSName,tSClassId,COUNT(*) as 人数 from TblStudent group by tSClassId--显示的内容必须包含在分组中。(该语句错误)
select tSName, COUNT(*)as 总人数 from TblStudent--count(*),聚合函数返回一个值,无法与tsName对应.(错误!!)
select count(tSName), COUNT(*)as 总人数 from TblStudent
---在select的后面不能跟非分组列.
--1.请从学生表中查询出每个班的班级Id和班级人数:(见备注1)
select tSClassId,count(*) as 人数 from TblStudent group by tSClassId
--2 .请从学生表中查询出每个班的班级Id和班级中男同学的人数: (见备注2)
select --4
tSClassId,count(*) as 人数 from TblStudent ---1
where tSGender='男' ---2,由于where条件比group by 现执行,那么就是先过滤条件,然后再进行分组.
group by tSClassId--3
----------------------------Having-----------------------
---having:表示对组进行过滤,符合having指定条件的组将显示,否则不显示。having是在group by 后执行,并且只能与group by 连用.
--3. 统计出班级人数大于10人的班级,显示出班级编号。(先分组,后统计)
select tSClassId,count(*) as 人数 from TblStudent group by tSClassId having count(*)>10
--where与having区别: where:先过滤后分组,并且该关键字可以任意结构 。having,是在分组之后,再进行过滤,并且只能用于分组结构中。where后面不能跟聚合函数,但是having可以。
select count(*) from TblStudent where count(*)>20(错误)
select tSClassId,count(*) as 人数 from TblStudent group by tSClassId having
tSGender='男'--(错误)
select * from TblStudent
select tSGender, COUNT(*) AS 人数 from TblStudent group by tSClassId(错误)
select tSClassId,count(*)from TblStudent where TsGender='男' group by tSClassId having count(*)>2
----------------------练习----------------------
--1.热销售商品排名表,【即按照每种商品的总销售数量排序】。
select 商品名称,SUM(销售数量) as 销售数量 from MyOrders GROUP BY 商品名称 order by 销售数量 desc
--2.请统计销售总价超过3000元的商品名称和销售总价,并按销售总价降序排序。
select 商品名称, SUM(销售价格*销售数量)as 销售总价 from MyOrders GROUP by 商品名称 having SUM(销售价格*销售数量)>3000 order by 销售总价 desc--注意:having不能再跟别名,因为having在select之前执行.
--3.统计各个客户对"可口可乐"的喜爱度(既统计每个购买人对“可口可乐”的购买量)
select 购买人, sum(销售数量) from MyOrders where 商品名称='可口可乐' group by 购买人
--select 购买人 from dbo.MyOrders where 商品名称='可口可乐'
select * from dbo.MyOrders
--------------------------转换函数-------------------------------
select * from MyOrders
select 商品名称+100 from MyOrders
select 商品名称+'100' from MyOrders
select 商品名称+cast(100 as nvarchar(10)) from MyOrders
select 商品名称+convert(nvarchar(10),100) from MyOrders
select * from dbo.ColumnDataTypeConvert
select * from dbo.ColumnDataTypeConvert order by CAST(bid as int) desc
----对日期进行格式转换
select CONVERT( nvarchar(20), GETDATE(),120)
---------------------联合结果集union--------------------------
union:--将多个结果集组成一个结果集,但是union会执行去除重复操作
union all(推荐)--将多个结果集组成一个结果集,但是union all 不会执行取出重复操作
--union 会执行一次去除重复的操作,性能上相对于union all低
--要求:进行组合的结果集必须列的个数相同,而且每个列的类型一致或者是兼容.
select * from dbo.TblStudent
select * from dbo.TblTeacher
select tsName, tsGender from TblStudent union all
select ttName,tTGender from TblTeacher
select * from dbo.TblScore
select 最高分=MAX(tEnglish),最低分=MIN(tMath),平均分=AVG(tMath) from TblScore
select 说明='最高分',分数=Max(tEnglish) from TblScore union all
select 说明='最低分',分数=MIN(tMath) from TblScore union all
select 说明='平均分',分数=avg(tMath) from TblScore
---------------------------向表中插入多条记录------------------------
select * from dbo.Contacts
--将多个结果集组合成一个结果集,然后插入到数据表中。
insert into Contacts(contactName, cellPhone, email, groupId)
select '张小三','88888811111','xiaosan@126.com',4 union all
select '张小四','88888811111','xiaosan@126.com',4 union all
select '张小五','88888811111','xiaosan@126.com',4
----------------批量插入--------------
select * from Myabc
select * into Myabc from Contacts--将Contacts表中的数据插入到Myabc,如果Myabc表没有,那么会创建一个。那么Myabc表与Contacts结构以及存储的数据一致。如果Myabc表已经存在了,那么在执行上面的语句出错.
select * into Myabcd from Contacts where 1<>1--只是将Contacts的结构复制到Myabcd
select * from Myabcd
drop table Myabcd
select top 0 * into Myabcd from Contacts--只是将Contacts的结构复制到Myabcd
-------------------批量插入3-------------------------------------
select * from dbo.TblStudent
insert into Contacts(contactName, cellPhone, email, groupId) select tsName,tSPhone,'zhangsan@126.com',tSClassId from dbo.TblStudent where tSGender='男'--注意:查询select后面的跟的字段一定要与insert 后面跟的字段个数一致,类型一致。
select * from Contacts
-----------------字符串函数----------------------------
select LEN('sadfjlkdsaf中国')--字符长度
select datalength('sadfjlkdsaf中国')--字节数.
select LOWER('Aaa') --转成小写字母
select UPPER ('bbb') --大写字母
select LTRIM(' SADFDSAFDSA ')
select LTRIM(RTRIM (' bbb '))--去掉两测空格。
sELECT LEFT('abcdefg',2)
select SUBSTRING('abcdef111',2,3)
----------------日期函数------------
select DATEADD(MONTH,12,'2012-3-11')
select DATEDIFF(DAY,'2012-3-11','2014/3/11')
--假设 当前时间 1967年 7月31日
select * from dbo.Employees
select * from Employees where DATEDIFF(year,BirthDate,'1967-7-31')>5
select DATEPART(month,getdate())
--统计员工的生日月份个数
select 月份=DATEPART(month,BirthDate),count(*) from Employees group by DATEPART(month,BirthDate)
select year(getdate())
select month(getdate())
select day(getdate())
----------------------------练习-------------------------------
select * from CallRecords
---假设2010-7-31日
--输出所有数据中通话时间最长的5条记录。orderby datediff
select top 5 *,DATEDIFF(SECOND,StartDateTime,EndDateTime) AS 通话秒数 from CallRecords order by 通话秒数 desc
--输出所有数据中拨打长途号码(对方号码以0开头)的总时长。like、sum
select sum(datediff(SECOND,StartDateTime,EndDateTime))as 总时长 from CallRecords where TelNum like'0%'
--输出本月通话总时长最多的前三个呼叫员的编号。
select top 3 CallerNumber from CallRecords where datepart(month,StartDateTime)=month('2010-7-31') group by CallerNumber order by sum(Datediff(second,StartDateTime,EndDateTime)) desc
--输出本月拨打电话次数最多的前三个呼叫员的编号.group by,count(*)
select top 3 CallerNumber,count(*) as 拨打次数 from CallRecords where datediff(month,StartDateTime,'2010-7-31')=0 group by CallerNumber order by 拨打次数 desc
select * from dbo.TblScore
--分组的目的:对数据进行汇总,统计. 与聚合函数一块使用。
select COUNT(*) from dbo.TblStudent --对表进行分组了,作为一组。
select * from TblStudent
select tSGender, COUNT(*) from TblStudent group by tSGender--先对学生表中的数据按照性别分组,分组以后再执行Count(*)
--统计每个班级有多少人?
select tSClassId,COUNT(*) as 人数 from TblStudent group by tSClassId
select tSName,tSClassId,COUNT(*) as 人数 from TblStudent group by tSClassId--显示的内容必须包含在分组中。(该语句错误)
select tSName, COUNT(*)as 总人数 from TblStudent--count(*),聚合函数返回一个值,无法与tsName对应.(错误!!)
select count(tSName), COUNT(*)as 总人数 from TblStudent
---在select的后面不能跟非分组列.
--1.请从学生表中查询出每个班的班级Id和班级人数:(见备注1)
select tSClassId,count(*) as 人数 from TblStudent group by tSClassId
--2 .请从学生表中查询出每个班的班级Id和班级中男同学的人数: (见备注2)
select --4
tSClassId,count(*) as 人数 from TblStudent ---1
where tSGender='男' ---2,由于where条件比group by 现执行,那么就是先过滤条件,然后再进行分组.
group by tSClassId--3
----------------------------Having-----------------------
---having:表示对组进行过滤,符合having指定条件的组将显示,否则不显示。having是在group by 后执行,并且只能与group by 连用.
--3. 统计出班级人数大于10人的班级,显示出班级编号。(先分组,后统计)
select tSClassId,count(*) as 人数 from TblStudent group by tSClassId having count(*)>10
--where与having区别: where:先过滤后分组,并且该关键字可以任意结构 。having,是在分组之后,再进行过滤,并且只能用于分组结构中。where后面不能跟聚合函数,但是having可以。
select count(*) from TblStudent where count(*)>20(错误)
select tSClassId,count(*) as 人数 from TblStudent group by tSClassId having
tSGender='男'--(错误)
select * from TblStudent
select tSGender, COUNT(*) AS 人数 from TblStudent group by tSClassId(错误)
select tSClassId,count(*)from TblStudent where TsGender='男' group by tSClassId having count(*)>2
----------------------练习----------------------
--1.热销售商品排名表,【即按照每种商品的总销售数量排序】。
select 商品名称,SUM(销售数量) as 销售数量 from MyOrders GROUP BY 商品名称 order by 销售数量 desc
--2.请统计销售总价超过3000元的商品名称和销售总价,并按销售总价降序排序。
select 商品名称, SUM(销售价格*销售数量)as 销售总价 from MyOrders GROUP by 商品名称 having SUM(销售价格*销售数量)>3000 order by 销售总价 desc--注意:having不能再跟别名,因为having在select之前执行.
--3.统计各个客户对"可口可乐"的喜爱度(既统计每个购买人对“可口可乐”的购买量)
select 购买人, sum(销售数量) from MyOrders where 商品名称='可口可乐' group by 购买人
--select 购买人 from dbo.MyOrders where 商品名称='可口可乐'
select * from dbo.MyOrders
--------------------------转换函数-------------------------------
select * from MyOrders
select 商品名称+100 from MyOrders
select 商品名称+'100' from MyOrders
select 商品名称+cast(100 as nvarchar(10)) from MyOrders
select 商品名称+convert(nvarchar(10),100) from MyOrders
select * from dbo.ColumnDataTypeConvert
select * from dbo.ColumnDataTypeConvert order by CAST(bid as int) desc
----对日期进行格式转换
select CONVERT( nvarchar(20), GETDATE(),120)
---------------------联合结果集union--------------------------
union:--将多个结果集组成一个结果集,但是union会执行去除重复操作
union all(推荐)--将多个结果集组成一个结果集,但是union all 不会执行取出重复操作
--union 会执行一次去除重复的操作,性能上相对于union all低
--要求:进行组合的结果集必须列的个数相同,而且每个列的类型一致或者是兼容.
select * from dbo.TblStudent
select * from dbo.TblTeacher
select tsName, tsGender from TblStudent union all
select ttName,tTGender from TblTeacher
select * from dbo.TblScore
select 最高分=MAX(tEnglish),最低分=MIN(tMath),平均分=AVG(tMath) from TblScore
select 说明='最高分',分数=Max(tEnglish) from TblScore union all
select 说明='最低分',分数=MIN(tMath) from TblScore union all
select 说明='平均分',分数=avg(tMath) from TblScore
---------------------------向表中插入多条记录------------------------
select * from dbo.Contacts
--将多个结果集组合成一个结果集,然后插入到数据表中。
insert into Contacts(contactName, cellPhone, email, groupId)
select '张小三','88888811111','xiaosan@126.com',4 union all
select '张小四','88888811111','xiaosan@126.com',4 union all
select '张小五','88888811111','xiaosan@126.com',4
----------------批量插入--------------
select * from Myabc
select * into Myabc from Contacts--将Contacts表中的数据插入到Myabc,如果Myabc表没有,那么会创建一个。那么Myabc表与Contacts结构以及存储的数据一致。如果Myabc表已经存在了,那么在执行上面的语句出错.
select * into Myabcd from Contacts where 1<>1--只是将Contacts的结构复制到Myabcd
select * from Myabcd
drop table Myabcd
select top 0 * into Myabcd from Contacts--只是将Contacts的结构复制到Myabcd
-------------------批量插入3-------------------------------------
select * from dbo.TblStudent
insert into Contacts(contactName, cellPhone, email, groupId) select tsName,tSPhone,'zhangsan@126.com',tSClassId from dbo.TblStudent where tSGender='男'--注意:查询select后面的跟的字段一定要与insert 后面跟的字段个数一致,类型一致。
select * from Contacts
-----------------字符串函数----------------------------
select LEN('sadfjlkdsaf中国')--字符长度
select datalength('sadfjlkdsaf中国')--字节数.
select LOWER('Aaa') --转成小写字母
select UPPER ('bbb') --大写字母
select LTRIM(' SADFDSAFDSA ')
select LTRIM(RTRIM (' bbb '))--去掉两测空格。
sELECT LEFT('abcdefg',2)
select SUBSTRING('abcdef111',2,3)
----------------日期函数------------
select DATEADD(MONTH,12,'2012-3-11')
select DATEDIFF(DAY,'2012-3-11','2014/3/11')
--假设 当前时间 1967年 7月31日
select * from dbo.Employees
select * from Employees where DATEDIFF(year,BirthDate,'1967-7-31')>5
select DATEPART(month,getdate())
--统计员工的生日月份个数
select 月份=DATEPART(month,BirthDate),count(*) from Employees group by DATEPART(month,BirthDate)
select year(getdate())
select month(getdate())
select day(getdate())
----------------------------练习-------------------------------
select * from CallRecords
---假设2010-7-31日
--输出所有数据中通话时间最长的5条记录。orderby datediff
select top 5 *,DATEDIFF(SECOND,StartDateTime,EndDateTime) AS 通话秒数 from CallRecords order by 通话秒数 desc
--输出所有数据中拨打长途号码(对方号码以0开头)的总时长。like、sum
select sum(datediff(SECOND,StartDateTime,EndDateTime))as 总时长 from CallRecords where TelNum like'0%'
--输出本月通话总时长最多的前三个呼叫员的编号。
select top 3 CallerNumber from CallRecords where datepart(month,StartDateTime)=month('2010-7-31') group by CallerNumber order by sum(Datediff(second,StartDateTime,EndDateTime)) desc
--输出本月拨打电话次数最多的前三个呼叫员的编号.group by,count(*)
select top 3 CallerNumber,count(*) as 拨打次数 from CallRecords where datediff(month,StartDateTime,'2010-7-31')=0 group by CallerNumber order by 拨打次数 desc
select * from dbo.TblScore
0 0
- SQL语句
- sql语句
- SQL语句
- SQL语句
- SQL语句
- SQL语句
- SQL语句
- SQL语句
- SQL 语句
- sql语句
- sql语句
- Sql语句
- SQL语句
- SQL语句
- sql语句
- SQL 语句
- sql语句
- sql语句
- 飞机大战小游戏
- 仿QQ临时群组成员界面GridView的使用
- 编程之美 2014 格格取数(最小费用最大流)
- Java设计模式之从[打飞机游戏中的控制器]分析命令(Command)模式
- nginx log 记录请求的头信息
- SQL语句
- UML简说——类图
- Visual Studio 2008 简体中文正式版下载及序列号(无使用期限限制,正式版)
- JSP/Servlet文件上传下载
- 发布的Qt工程无法显示图标和图片的问题
- 反射+多态:生成容器实例化并装好view子类
- Android系统启动过程
- UML
- 小凡实验室卧龙老师CCIE学习方法:CCIE涅槃五剑