Quantcast
Channel: CodeSection,代码区,数据库(综合) - CodeSec
Viewing all articles
Browse latest Browse all 6262

数据库知识之SQLServer数据库操作(三)

$
0
0

主要内容:

1)数据分组:group by

2)数据筛选:having

3)类型转换函数:cast() convert()

4)union 联合结果集

5)插入多条记录

6)字符串函数

7)日期函数 (记忆比较细的知识点)

代码如下:

/*
快捷键 F1 表示打开帮助(要学会使用帮组文档,特别是对函数而言)
数据分组(order by与group by是不一样的)
在使用select查询的时候,有时对数据进行分组总汇,即将现有的数据按照某列来汇总统计,这是就需要用到group by语句。
分组一般和聚合函数连用。
使用聚合函数返回每一组的汇总信息。
关键是理解需求的含义:先筛选然后分组。
*/
--请从学生表中查询出每个班级的班级id和班级人数
SELECT *
FROM dbo.Student;
--按照某一列的数据进行分组(这一列中的数据相同的分为一组,select 后面跟的是列名),查询出所有的记录,
SELECT StuClassId AS 班级id ,
班级人数 = COUNT(*)
FROM dbo.Student
GROUP BY StuClassId;
--请统计班级中男同学和女同学的人数
SELECT StuGender ,
人数 = COUNT(*)
FROM dbo.Student
GROUP BY StuGender;
--请统计班级中所有的班级id和每个班级中的男同学数
SELECT *
FROM Student;
UPDATE dbo.Student
SET StuGender = '男'
WHERE StuClassId = 2;
SELECT * FROM dbo.Student;
UPDATE Student
SET StuClassId = 2
WHERE StuName = '张诗';
SELECT *
FROM dbo.Student;
--更新数据,把班级id为2的所有学生的性别改成男(查询这两列数据,统计所有的性别为男的记录)
SELECT 班级id = StuClassId ,男同学数 = COUNT(*) FROM Student WHERE StuGender = '男'GROUP BY StuClassId;
--下面的写法会报错(因为按照性别分组后,年龄字段就被合并了不能显示了,因为其他列就不存在了)
SELECT 姓名 = StuName ,
班级id = StuClassId ,
男同学数 = COUNT(*)
FROM Student
WHERE StuGender = '男'GROUP BY StuClassId;
/*
对分组以后的数据进行筛选
where与having都是对数据筛选,wher是对分组前的每一组数据进行筛选,而having是对分组后的的数据进行筛选。
where是对每条记录进行过滤的,having是对查询到的组进行过滤的。
*/
SELECT * FROM dbo.Student;
UPDATE Student
SET StuClassId=2
WHERE StuName = '张慧';
SELECT 班级id = StuClassId ,
女生人数 = COUNT(*)
FROM Student
WHERE StuGender = '女'
GROUP BY StuClassId
HAVING COUNT(*) > 1;
--查询班级人数超过两个人的班级
SELECT 班级id =StuClassId ,班级人数 = COUNT(*) FROM dbo.Student GROUP BY StuClassId HAVING COUNT(*) > 2;
/*
sql语句的执行顺序:
SELECT 选择的列、distinct、top 5列名
FROM 表名
WHERE 条件
GROUP BY 列名
HAVING 筛选添加
order by 排序
*/
--查询出热销商品,销售数量列,按照商品进行分组
/*
类型转换函数: 把数字类型的字符串转换成int类型
cast函数(表达式 as 数据类型) 表达式指待转化的字符串
convert函数(数据类型,表达式,style)style指定CONVERT 函数如何转换 expression 的整数表达式
日期转字符串:将日期转化成指定格式的字符串
*/
--内部帮我们进行了类型转换
SELECT 100+'1000';
SELECT '1000'+100;
--自己进行类型转换
--使用cast进行转换
SELECT 100+CAST('1000' AS INT);
--使用convert进行转换
SELECT 100+CONVERT(INT,'1000' );
SELECT '您的班级编号为:'+CONVERT(CHAR(1),1);
--把日期转化成字符串类型
SELECT CONVERT(varchar(50),GETDATE(),120);
SELECT CONVERT(varchar(50),GETDATE(),101);
/*
union联合结果集
1)集合运算符是对两个集合操作的,两个集合必须具备相同的列数,列具备相同的数据类型(至少能够隐式转化的),
最终输出的集合的列名有第一个集合的列名来确定
2)联合union与连接join不一样
3)简单的联合结果集(老师和学生) 基本的原则:每个结果集必须具备相同的列数,每个结果集列的类型必须兼容
4)联合:将多个结果集合并成一个结果集,union 去除重复 相当于默认应用了distinct,常见应用底部汇总。
联合:把多个查询结果合并成一个 列的数量一致,对应列上的数据类型至少能够隐式类型转化
使用nuion能够去除重复,但是使用union all不能去除重复数据
5)大多数情况下,联合的时候是不需要去除重复的,同时要保持数据的顺序,所以一般建议使用union all
因为union要进行重复值的扫描,所以效率比较低。
6)使用 union all执行插入操作:一次插入多条记录。
*/
--能够查询出两个陈如水
SELECT TeaName FROM dbo.Teacher UNION ALL SELECT StuName FROM Student;
--合并重复的记录
SELECT TeaName FROM dbo.Teacher UNION SELECT StuName FROM Student;
INSERT INTO dbo.Student
( StuName ,
StuGender ,
StuAddress ,
StuAge ,
StuBirthday ,
StuCardId ,
StuClassId
)
VALUES ( N'陈如水' , -- StuName - nvarchar(10)
N'男' , -- StuGender - nchar(1)
N'河南省项城市' , -- StuAddress - nvarchar(100)
55, -- StuAge - int
GETDATE() , -- StuBirthday - datetime
'412702199102181579' , -- StuCardId - varchar(18)
1 -- StuClassId - int
)
SELECT * FROM dbo.Student;
--查询所有年龄表中的最大年龄、最小年龄、平均年龄
SELECT 最大年龄=MAX(StuAge) FROM dbo.Student
SELECT 最小年龄=min(StuAge) FROM dbo.Student
SELECT 平均年龄=avg(StuAge) FROM dbo.Student
--此时列名是“名称”,其中的值为最大年龄、最小年龄、平均年龄。一定要特别记忆。
SELECT 名称='最大年龄',年龄=MAX(StuAge) FROM dbo.Student
UNION ALL
SELECT 名称='最小年龄', 年龄=min(StuAge) FROM dbo.Student
UNION ALL
SELECT 名称='平均年龄',年龄=avg(StuAge) FROM dbo.Student
SELECT * FROM dbo.Teacher;
--向表中插入一列
ALTER TABLE dbo.Teacher ADD TeaSalary int;
SELECT * FROM dbo.Teacher;
UPDATE Teacher SET TeaSalary =1600 WHERE TeaName='陈少文';
SELECT * FROM Teacher;
INSERT INTO dbo.Teacher
( TeaName ,
TeaGender ,
TeaAge ,
TeaBirthdat ,
TeaAddress ,
TeaEmail
)
VALUES ( N'陈少文' , -- TeaName - nvarchar(20)
0, -- TeaGender - bit
10 , -- TeaAge - int
GETDATE() , -- TeaBirthdat - datetime
N'河南省周口市' , -- TeaAddress - nvarchar(10)
N'2586622608@qq.com' -- TeaEmail - nvarchar(50)
)
--查询每位老师的信息包括姓名、工资并在最后一行加上平均工资和最高工资
SELECT 教师姓名=TeaName,教师工资=TeaSalary FROM dbo.Teacher
UNION ALL
SELECT '平均工资',AVG(TeaSalary) FROM dbo.Teacher
UNION ALL
SELECT '最高工资', MAX(TeaSalary) FROM dbo.Teacher;
--一次插入多条记录如何实现
--INSERT INTO SELECTUNION ALL
SELECT * FROM dbo.Teacher;
INSERT INTO dbo.Teacher
SELECT '陈如水',0,25,GETDATE(),'中国','2586622608@qq.com',1500
UNION ALL
SELECT '陈如水',0,25,GETDATE(),'中国','2586622608@qq.com',1500
UNION ALL
SELECT '陈如水1',0,15,GETDATE(),'中国武汉','2586622608@qq.com',1504;
/*
一次性向表中插入多条记录的方法
1)把现有的表的数据复制到一个已经存在的表,对于这种复制,只能复制表中的数据以及列的名字和数据类型,但是不会复制约束。
2)如何把表中的记录备份到另外一张表中
*/
--备份表,但是约束不能备份到另外一张表中(现在只能复制表数据)
--从老师表中查询数据,把查询到的数据备份到CopyTeacher表中;表CopyTeacher不存在,在执行sql语句的时候会自动创建一张表
SELECT * INTO CopyTeacher FROM Teacher;
SELECT * FROM CopyTeacher;
--如何将表结构复制一份呢,这时只赋值了表结构
SELECT * INTO CopyTeacher1 FROM dbo.Teacher WHERE 1<>1;
SELECT TOP 0 * INTO CopyTeacher2 FROM dbo.Teacher;
SELECT * FROM CopyTeacher2;
--如何将表结构和表数据赋值一份呢
--使用insert...into...SELECT...from...
INSERT INTO CopyTeacher2 SELECT TeaName,TeaGender,TeaAge,TeaBirthdat,TeaAddress,TeaEmail,TeaSalary FROM dbo.Teacher;
SELECT * FROM CopyTeacher2;
/*
字符串函数
len():计算字符串的长度
datalength():计算字符串所占用的字节数
lower():转化成小写
upper():转化成大写
ltrim():去掉字符串左侧空格
rtrim():去掉字符串右侧空格
截取字符串,有三个函数 left() right() substring(str,srartPosition,length)索引从1 开始
尝试使用sql帮助。----直接搜索:函数-->字符串函数
*/
PRINT LEN('碧云天黄叶地');
--一个汉字占用了两个字节
PRINT DATALENGTH('碧云天黄叶地 ');
--n表示所有的字符都是汉语,一个字符占用两个字节
PRINT DATALENGTH(N'碧云天黄叶地 ');
PRINT LOWER('Hello World!');
PRINT UPPER('Hello World!');
PRINT LTRIM(' 秋色连波,波上寒烟垂');
PRINT LTRIM('秋色连波,波上寒烟垂');
--截取字符串 截取几个字符。从左边开始截取,截取五个字符
PRINT LEFT('待我长发及腰',5);
--索引是从1开始的,不要使用0或者负数
PRINT SUBSTRING('念去去千里烟波,暮霭沉沉楚天阔',1,3)
/*
日期函数
1)getDate() 获取当前日期时间
2)dateadd(datepart,number,date)计算增加以后的日期,date表示带计算的日期,number为增量,datepart表示计量单位
3)datediff(datepart,startdate,enddate) 计算两个日期之间的差额,datepart表示计量单位
4)datepart(datepart,date)返回一个日期的特定部分
5)Month()、year()、day()
*/
--日期和时间函数
PRINT getdate();
PRINT SYSDATETIME();
--从当前时间增加两百天,两百月,两百年,两百分钟,两百秒
PRINT DATEADD(DAY,200,GETDATE());
PRINT DATEADD(month,200,GETDATE());
PRINT DATEADD(year,200,GETDATE());
PRINT DATEADD(minute,200,GETDATE());
PRINT DATEADD(hour,200,GETDATE());
PRINT DATEADD(second,200,GETDATE());
PRINT DATEADD(week,200,GETDATE());
--公司给员工发奖金,入职一年以上的员工才会有奖金,如何实现
--关键是与当前时间进行比较
SELECT * FROM dbo.Teacher;
SELECT * FROM dbo.Teacher WHERE DATEADD(hour,1,TeaBirthdat)<=GETDATE();
--计算两个日期的差值 datediff() 主要是当前日期的差值
SELECT DATEDIFF(month,'2015-01-04',GETDATE())
--获取日期某部分的值
PRINT DATEPART(YEAR,GETDATE());
PRINT DATEPART(month,GETDATE());
--获取当前的年部分 含义是获取日期并截取其中的年部分
PRINT YEAR(GETDATE());
PRINT MONTH(GETDATE());

Viewing all articles
Browse latest Browse all 6262

Trending Articles