sql数据库资料

 

 sql语法的特点

 1.没有"",所有的字符串都使用''包含

 2.它的逻辑相等与赋值运算符一样都是= 如 if 1=1

 3.不区别大小写,但是习惯函数上使用大写。所有与数据库相关的其实都不区分

 4.类型上没有c#严格。任何类型都可以做为字符串进行赋值

 5.没有bool值的概念,在视图中进行插入数据操作的时候必须输入true/false,但是在逻辑运算符的时候却不能写bool值

 6.它是解释语言,你选择了那一句执行那么就只执行你所选择的这一句

 

 1.它也算术运算符 + - / %

 2.它也有关系运算符: > >= < <= = != <>

 3.它也有逻辑运算符: not ! and && or ||


什么时候需要加,:

当它是一个可以独立运行的sql命令的时候就不需要加,,但是可以加;

但是如果它只是一个语句块中的某一个组成部分某种其中一句,那么就需要添加,,但是如果是最后一句那么就不能添加,

创建数据库需要设置那一些属性值

数据库名称 逻辑名称 初始大小 自动增加(增加方式,限制自动增长最大容量) 文件全路径

语法:

create database 数据库名称

on 文件组默认是主文件组primary

(

 name='逻辑名称_data' ,

 size='初始大小' ,

 FileGrowth =文件增长,

 maxSize=最大容量,

 FileName='文件全路径'

)

log on 日志文件

(

 name='逻辑名称_log' ,

 size='初始大小' ,

 FileGrowth =文件增长,

 maxSize=最大容量, 日志文件一般不限制最大容量

 FileName='文件全路径'

)

创建数据库TestSchool

use master 切换当前数据库

go

exists 如果()中的查询语句返回非空那么就得到true,否则就得到false

sql 没有sql server sql 没有等于大于吗_字符串

1 if exists(select * from sysdatabases where name='TestSchool')
 2    drop database TestSchool
 3 go
 4 自动创建文件夹
 5 exec sp_configure 'show advanced options',1
 6 go
 7 RECONFIGURE
 8 go
 9 exec sp_configure 'xp_cmdshell',1
10 go
11 RECONFIGURE
12 go
13 exec xp_cmdshell 'mkdir d:\qqaa\vv\cc'
14  
15 create database TestSchool
16 on primary
17 (
18  name='TestSchool_data',逻辑名称
19  size=3MB, 初始大小
20  FileGrowth=10%,每次增长按总大小的10%增长
21  maxSize=1000mb,最大容量
22  FileName='d:\qqaa\vv\cc\TestSchool_data.mdf'
23 ),
24 (
25  name='TestSchool_data1',逻辑名称
26  size=3MB, 初始大小
27  FileGrowth=10%,每次增长按总大小的10%增长
28  maxSize=1000mb,最大容量
29  FileName='d:\project\TestSchool_data1.ndf'
30 )
31 log on
32 (
33 name='TestSchool_log',逻辑名称
34  size=3MB, 初始大小
35  FileGrowth=10%,每次增长按总大小的10%增长
36  maxSize=1000mb,最大容量
37  FileName='d:\qqaa\vv\cc\TestSchool_log.ldf'
38 ),
39 (
40 name='TestSchool_log1',逻辑名称
41  size=3MB, 初始大小
42  FileGrowth=10%,每次增长按总大小的10%增长
43  maxSize=1000mb,最大容量
44  FileName='d:\qqaa\vv\cc\TestSchool_log1.ldf'
45 )

sql 没有sql server sql 没有等于大于吗_字符串

 

 

-创建表,需要做那一些设置?

字段名称,字段类型,是否为空 标识列 默认值 主键,唯一键,索引,关系,check约束

语法:

create table 表名

 字段名称 字段类型 列的特征(是否为空 标识列 默认值 主键 唯一键 索引 关系 check约束),

 字段名称 字段类型 列的特征(是否为空 标识列 默认值 主键 唯一键 索引 关系 check约束)

创建老师表Teacher Id、Name、Gender、Age、Salary、Birthday

确定表需要为那一个数据库创建

sql 没有sql server sql 没有等于大于吗_字符串

1 use TestSchool
 2 go
 3 if exists(select * from sysobjects where name='Teacher')
 4  drop table Teacher
 5 go
 6 create table Teacher
 7 (
 8  Id int primary key identity(1,1), 主键是非空唯一
 9  Name nvarchar(50) not null, not null不为空
10  Gender bit not null default(1) ,
11  Age int not null check(age>0 and age<=100),
12  Salary money, 可以为null可以写null,或者不写也默认是可以为null
13  Birthday datetime not null
14 )

sql 没有sql server sql 没有等于大于吗_字符串

 


约束-保证数据完整性

数据完整性:为了保证数据是安全和准确的

1.实体完整性:实体就是指一条记录,实体完整性就是为了保证这一条记录是有效的和不重复的。

 1.主键:非空 唯一,一个表只能有一个主键

 2.标识列:是由系统自动生成的,永远不会重复

 3.唯一键:唯一的,可以为null,但是只能null一次,一个表的唯一键可以有多个

2.域完整性:域就是指某一个字段列,也就意味着这个完整性是为了保证这一列的值是合理有效的

 check约束 类型 非空 默认值 标识列

3.自定义完整性:按用户自己的需要创建check约束

 check约束 存储过程 触发器

4.引用完整性:某一个表的字段值不是独立存在的,它引用自另外一个已经存在的表的字段值。它的取值范围不能超出主表对应字段的值的范围.被引用的表就是主表,引用的表就是从表,也称为外键表

 1.选择外键表去创建主外键关系

 2.建立主外键关系的字段的类型需要一致

 3.建立主外键关系的字段的意义必须要一样。

 4.在添加主外键表数据的时候,先添加主表,再添加外键表

 5.在删除主外键关系表数据的时候,先删除从表,再删除主表的值。

 6.建议主外键关系的字段在主表中必须是 主键或者 唯一键

级联操作:

1.不执行任何操作:如果有引用就不能删除,如果没有引用 就可以删除

2.删除主表,从表对应的记录也删除太恶心

3.删除主表 的值,从表对应记录的建立了关系的字段值设置为NULL,前提是这个字段值可以为null

4.设置为默认值,从表对应记录的建立了关系的字段值设置为默认值,前提是这个字段值你已经添加了默认值

 

代码创建约束:

语法:

alter table 表名

add constraint 约束名称(PRIMARY KEYPK uniqueUQ checkCK default DF foreign keyFK) 约束类型 约束说明(字段,关系表达式,值)

-为Teacher表添加主键值

1 if exists(select * from sysobjects where name='PK_id')
2  alter table teacher drop constraint PK_id
3 alter table teacher
4 add constraint PK_id primary key(id)

为name添加唯一键

alter table teaher
add constraint UQ_name unique(name)

为age添加check约束 0~100

1alter table teacher20100) 

为birthday添加默认值

alter table teacher
add constraint DF_Birthday default('1999-9-9') for birthday

为subjectId添加外键约束

alter table teacher with nocheck 不检查现有数据
add constraint FK_teacher_subjectId foreign key(subjectid) references subject(id)
on delete no action

Len():得到当前指定字符串的个数,中英文无关

字符串变量.方法()

字符串函数(字符串变量)

DataLength():得到当前字符串占据的字节数,与字符类型有关

select LEN('abcdefg')
select DataLength('中华人民共和国')

 

 

 

 

n代表是unicode字符,任何字符都占据两个字节空间 。当以后有中文字符的时候,就使用它。

select LEN(NChar) from chartest
select DataLength(NChar) from chartest

NVarChar 是一个可变unicode字符

select LEN(NVarChar) from chartest
select DataLength(NVarChar) from chartest

 

 Insert

6.任何内容都可以使用’‘包含,但是如果是字符串类型的数据没有使用’‘就会报错。其实原因主就是:系统会对你传入的值做隐式的类型转换,如果可以转换成功,那么就转换后再使用,如果不能那么就报错

但是如果是字符串值没有添加’‘,那么会将这个字符串值当成一个列名变量名

insert into Student(LoginPwd,StudentName,Gender,GradeId,Birthday) values('123456','张三',男,'2','1999-9-9')

7.日期值如果没有添加’‘,那么就得到日期的默认值1905-6-5

insert into Student(LoginPwd,StudentName,Gender,GradeId,Birthday) values('123456','张三','男','2',1999-9-9)

 


数据更新(数据修改) 强调,修改删除一定需要考虑有没有条件。一般来说可以做条件一般是主键,唯一键或者标识列

语法:

update 表名 set 字段=值/表达式 where 条件

 

修改的时候可以直接赋值,也可以使用表达式

update Student set Birthday+=30

 

将没有填写电话号码的人员信息中的号码修改-=110 判断null使用 is null

update Student set Phone='110' where Phone is null
update Student set Address=DEFAULT where StudentNo=5
update Student set Phone='NULL' where StudentNo=3
 
update Student set Address='我在广州' where Address=default

 


数据删除:对于整个行而言,不能删除其中某一列,也就意味着,它只是来删除表的数据行,但是不能修改表的结构

语法:

delete [from] 表名 where 条件

删除所有男生信息

delete from Student where Gender='男'
delete from Student

 

删除是一条一条删除,它每一次删除都需要将操作写入到日志文件中,所以效率低

删除过后标识列不会从种子值重新计算,而是接上一次删除最后生成的标识列

 

truncate 删除方法

语法 :

truncate table 表名 没有条件,它是一次性删除整个表的数据

truncate table student

 

truncate它是一次性删除表的所有数据,所以日志文件是以最小化的方式写入的。

它删除后标识列会从种子值重新计算


select * from Student where Sex='女' and StudentName='林%'

通配符:

%:.*:代表任意个任意字符

_:它就代表一个字符占位,相当于 . 代表一个具体的字符

[]:相当于指定一个具体的范围或者具体的值范围。这点用法与正则表达式一样

[^]:取反值

like:像。。一样:如果要使用通配符,则必须配合 模糊查询关键字:

select * from Student where Sex='女' and StudentName like '林%'
select * from Student where Sex='女' and StudentName like '林__'

 

查询学员信息,学号是13,15,18,19

select * from Student where StudentNo in (13,15,18,19)
select * from Student where StudentNo like '[11-14]'

 

 

ISNULL对所查询出的结果值做判断,如果是null值就使用指定的内容进行替换

select StudentNo,StudentName,ISNULL(Email,'没有填写') from Student

 

 

排序 默认是升序排序,如果排序有多字段,是指,先按第一个字段进行排序,相同的记录再按第二个字段进行排序

select * from Student order by sex desc,StudentNo desc

 


顺序不能变 select(5) top/distinct 7 查询字段 from (1)表列表 where (2)对源数据进行筛选 group by(3) 分组统计字段列表 having (4)对分组统计结果集做筛选 order by (6)对最终的结果集做记录重排

 

where是对源数据做筛选的。它只能去使用from后面的表中所指定的列

聚合不应出现在 WHERE 子句中,就意味着聚合函数的条件不能通过where来指定

如果是对分组之后的结果集做筛选,那么就需要使用having

having的列是从group by中获取的

对分组统计结果集做筛选后再进行数据的显示。

select ClassId, COUNT(*) num from Student group by ClassId order by num desc
 
select top 2 ClassId, COUNT(*) num from Student group by ClassId order by num desc

 

 

1.查询每个班级的总学时数,并按照升序排列

2.查询每个参加考试的学员的平均分

3.查询每门课程的平均分,并按照降序排列

4.查询每个班级男女生的人数

 

当你看到类似于:各个,各自,每个,不同这些词的时候需要 考虑分组

select ClassId, SUM(ClassHour) from Subject where ClassId is not null group by ClassId
 
select StudentNo,AVG(StudentResult) from Result group by StudentNo
 
select SubjectId,AVG(StudentResult) from Result group by SubjectId

 


数据检索返回虚拟结果集

语法:

select 字段列表/* from 表列表 where 条件not and or

sql 没有sql server sql 没有等于大于吗_字符串

查询所有学员信息
select * from Student
指定查询的列
select StudentNo,StudentName,Gender,Address from Student
指定查询的列及查询的条件
select StudentNo,StudentName,Gender,Address from Student where Gender='女' and Address='广州'
设置虚拟结果集中的列名
select StudentNo as 学号,StudentName 姓名,性别=Gender,Address from Student where Gender='女' and Address='广州'
添加常量列
select StudentNo as 学号,StudentName 姓名,性别=Gender,Address, 国籍='中国' from Student where Gender='女' and Address='广州'

sql 没有sql server sql 没有等于大于吗_字符串

 

select 可以做查询,也可以赋值和输出

select '1'+'1'

 

select StudentNo as 学号,StudentName 姓名,性别=sex,Address from Student where sex='女' and Address='广州传智播客'

使用top可以返回指定条数或者百分比的记录

select top 10 percent StudentNo as 学号,StudentName 姓名,性别=sex,Address from Student order by StudentName

 

 

使用distinct来去除重复记录:

重复记录与表的原始数据行无关。它只关注通过查询语句查询出来之后的结果集,如果虚拟结果集的每一列的值都一样,那么才算重复记录,如果有一个值不一样,那么就是一条单独的记录

select distinct 性别=sex,Address from Student
 
select distinct sex from Student

SQL聚合函数

count():求满足条件的记录数,与值无关

max():求最大值

min():求最小值

sum():求和 只能对数值进行计算不能运用于日期和字符串

avg():求平均值

1.求整个表的记录数,随意传入参数,因为它与具体的值无关,只与记录数有关

select COUNT(sex) from Student

查询班级年龄最小的学员和最大的学员

select MAX(BornDate) from Student
select min(BornDate) from Student

不管什么类型都可以使用max/min进行计算,如果是数值就比较大小,如果是字符串变比较拼音的大小

select MAX(sex) from Student nv
select min(sex) from Studentnan

查询成绩最高分和最低分,平均分和总分

select MAX(StudentResult) from Result
select MIN(StudentResult) from Result
 
select sum(StudentResult) from Result where StudentNo=2
select avg(StudentResult) from Result where StudentNo=2

-不能使用sum/avg去计算日期类型的值

select sum(BornDate) from Student where StudentNo=2
select avg(BornDate) from Student where StudentNo=2

也不能运用于字符串类型

select sum(StudentName) from Student where StudentNo=2
select avg(StudentName) from Student where StudentNo=2




 sql语法的特点

 1.没有"",所有的字符串都使用''包含

 2.它的逻辑相等与赋值运算符一样都是= 如 if 1=1

 3.不区别大小写,但是习惯函数上使用大写。所有与数据库相关的其实都不区分

 4.类型上没有c#严格。任何类型都可以做为字符串进行赋值

 5.没有bool值的概念,在视图中进行插入数据操作的时候必须输入true/false,但是在逻辑运算符的时候却不能写bool值

 6.它是解释语言,你选择了那一句执行那么就只执行你所选择的这一句

 

 1.它也算术运算符 + - / %

 2.它也有关系运算符: > >= < <= = != <>

 3.它也有逻辑运算符: not ! and && or ||


什么时候需要加,:

当它是一个可以独立运行的sql命令的时候就不需要加,,但是可以加;

但是如果它只是一个语句块中的某一个组成部分某种其中一句,那么就需要添加,,但是如果是最后一句那么就不能添加,

创建数据库需要设置那一些属性值

数据库名称 逻辑名称 初始大小 自动增加(增加方式,限制自动增长最大容量) 文件全路径

语法:

create database 数据库名称

on 文件组默认是主文件组primary

(

 name='逻辑名称_data' ,

 size='初始大小' ,

 FileGrowth =文件增长,

 maxSize=最大容量,

 FileName='文件全路径'

)

log on 日志文件

(

 name='逻辑名称_log' ,

 size='初始大小' ,

 FileGrowth =文件增长,

 maxSize=最大容量, 日志文件一般不限制最大容量

 FileName='文件全路径'

)

创建数据库TestSchool

use master 切换当前数据库

go

exists 如果()中的查询语句返回非空那么就得到true,否则就得到false

sql 没有sql server sql 没有等于大于吗_字符串

1 if exists(select * from sysdatabases where name='TestSchool')
 2    drop database TestSchool
 3 go
 4 自动创建文件夹
 5 exec sp_configure 'show advanced options',1
 6 go
 7 RECONFIGURE
 8 go
 9 exec sp_configure 'xp_cmdshell',1
10 go
11 RECONFIGURE
12 go
13 exec xp_cmdshell 'mkdir d:\qqaa\vv\cc'
14  
15 create database TestSchool
16 on primary
17 (
18  name='TestSchool_data',逻辑名称
19  size=3MB, 初始大小
20  FileGrowth=10%,每次增长按总大小的10%增长
21  maxSize=1000mb,最大容量
22  FileName='d:\qqaa\vv\cc\TestSchool_data.mdf'
23 ),
24 (
25  name='TestSchool_data1',逻辑名称
26  size=3MB, 初始大小
27  FileGrowth=10%,每次增长按总大小的10%增长
28  maxSize=1000mb,最大容量
29  FileName='d:\project\TestSchool_data1.ndf'
30 )
31 log on
32 (
33 name='TestSchool_log',逻辑名称
34  size=3MB, 初始大小
35  FileGrowth=10%,每次增长按总大小的10%增长
36  maxSize=1000mb,最大容量
37  FileName='d:\qqaa\vv\cc\TestSchool_log.ldf'
38 ),
39 (
40 name='TestSchool_log1',逻辑名称
41  size=3MB, 初始大小
42  FileGrowth=10%,每次增长按总大小的10%增长
43  maxSize=1000mb,最大容量
44  FileName='d:\qqaa\vv\cc\TestSchool_log1.ldf'
45 )

sql 没有sql server sql 没有等于大于吗_字符串

 

 

-创建表,需要做那一些设置?

字段名称,字段类型,是否为空 标识列 默认值 主键,唯一键,索引,关系,check约束

语法:

create table 表名

 字段名称 字段类型 列的特征(是否为空 标识列 默认值 主键 唯一键 索引 关系 check约束),

 字段名称 字段类型 列的特征(是否为空 标识列 默认值 主键 唯一键 索引 关系 check约束)

创建老师表Teacher Id、Name、Gender、Age、Salary、Birthday

确定表需要为那一个数据库创建

sql 没有sql server sql 没有等于大于吗_字符串

1 use TestSchool
 2 go
 3 if exists(select * from sysobjects where name='Teacher')
 4  drop table Teacher
 5 go
 6 create table Teacher
 7 (
 8  Id int primary key identity(1,1), 主键是非空唯一
 9  Name nvarchar(50) not null, not null不为空
10  Gender bit not null default(1) ,
11  Age int not null check(age>0 and age<=100),
12  Salary money, 可以为null可以写null,或者不写也默认是可以为null
13  Birthday datetime not null
14 )

sql 没有sql server sql 没有等于大于吗_字符串

 


约束-保证数据完整性

数据完整性:为了保证数据是安全和准确的

1.实体完整性:实体就是指一条记录,实体完整性就是为了保证这一条记录是有效的和不重复的。

 1.主键:非空 唯一,一个表只能有一个主键

 2.标识列:是由系统自动生成的,永远不会重复

 3.唯一键:唯一的,可以为null,但是只能null一次,一个表的唯一键可以有多个

2.域完整性:域就是指某一个字段列,也就意味着这个完整性是为了保证这一列的值是合理有效的

 check约束 类型 非空 默认值 标识列

3.自定义完整性:按用户自己的需要创建check约束

 check约束 存储过程 触发器

4.引用完整性:某一个表的字段值不是独立存在的,它引用自另外一个已经存在的表的字段值。它的取值范围不能超出主表对应字段的值的范围.被引用的表就是主表,引用的表就是从表,也称为外键表

 1.选择外键表去创建主外键关系

 2.建立主外键关系的字段的类型需要一致

 3.建立主外键关系的字段的意义必须要一样。

 4.在添加主外键表数据的时候,先添加主表,再添加外键表

 5.在删除主外键关系表数据的时候,先删除从表,再删除主表的值。

 6.建议主外键关系的字段在主表中必须是 主键或者 唯一键

级联操作:

1.不执行任何操作:如果有引用就不能删除,如果没有引用 就可以删除

2.删除主表,从表对应的记录也删除太恶心

3.删除主表 的值,从表对应记录的建立了关系的字段值设置为NULL,前提是这个字段值可以为null

4.设置为默认值,从表对应记录的建立了关系的字段值设置为默认值,前提是这个字段值你已经添加了默认值

 

代码创建约束:

语法:

alter table 表名

add constraint 约束名称(PRIMARY KEYPK uniqueUQ checkCK default DF foreign keyFK) 约束类型 约束说明(字段,关系表达式,值)

-为Teacher表添加主键值

1 if exists(select * from sysobjects where name='PK_id')
2  alter table teacher drop constraint PK_id
3 alter table teacher
4 add constraint PK_id primary key(id)

为name添加唯一键

alter table teaher
add constraint UQ_name unique(name)

为age添加check约束 0~100

1alter table teacher20100) 

为birthday添加默认值

alter table teacher
add constraint DF_Birthday default('1999-9-9') for birthday

为subjectId添加外键约束

alter table teacher with nocheck 不检查现有数据
add constraint FK_teacher_subjectId foreign key(subjectid) references subject(id)
on delete no action

Len():得到当前指定字符串的个数,中英文无关

字符串变量.方法()

字符串函数(字符串变量)

DataLength():得到当前字符串占据的字节数,与字符类型有关

select LEN('abcdefg')
select DataLength('中华人民共和国')

 

 

 

 

n代表是unicode字符,任何字符都占据两个字节空间 。当以后有中文字符的时候,就使用它。

select LEN(NChar) from chartest
select DataLength(NChar) from chartest

NVarChar 是一个可变unicode字符

select LEN(NVarChar) from chartest
select DataLength(NVarChar) from chartest

 

 Insert

6.任何内容都可以使用’‘包含,但是如果是字符串类型的数据没有使用’‘就会报错。其实原因主就是:系统会对你传入的值做隐式的类型转换,如果可以转换成功,那么就转换后再使用,如果不能那么就报错

但是如果是字符串值没有添加’‘,那么会将这个字符串值当成一个列名变量名

insert into Student(LoginPwd,StudentName,Gender,GradeId,Birthday) values('123456','张三',男,'2','1999-9-9')

7.日期值如果没有添加’‘,那么就得到日期的默认值1905-6-5

insert into Student(LoginPwd,StudentName,Gender,GradeId,Birthday) values('123456','张三','男','2',1999-9-9)

 


数据更新(数据修改) 强调,修改删除一定需要考虑有没有条件。一般来说可以做条件一般是主键,唯一键或者标识列

语法:

update 表名 set 字段=值/表达式 where 条件

 

修改的时候可以直接赋值,也可以使用表达式

update Student set Birthday+=30

 

将没有填写电话号码的人员信息中的号码修改-=110 判断null使用 is null

update Student set Phone='110' where Phone is null
update Student set Address=DEFAULT where StudentNo=5
update Student set Phone='NULL' where StudentNo=3
 
update Student set Address='我在广州' where Address=default

 


数据删除:对于整个行而言,不能删除其中某一列,也就意味着,它只是来删除表的数据行,但是不能修改表的结构

语法:

delete [from] 表名 where 条件

删除所有男生信息

delete from Student where Gender='男'
delete from Student

 

删除是一条一条删除,它每一次删除都需要将操作写入到日志文件中,所以效率低

删除过后标识列不会从种子值重新计算,而是接上一次删除最后生成的标识列

 

truncate 删除方法

语法 :

truncate table 表名 没有条件,它是一次性删除整个表的数据

truncate table student

 

truncate它是一次性删除表的所有数据,所以日志文件是以最小化的方式写入的。

它删除后标识列会从种子值重新计算


select * from Student where Sex='女' and StudentName='林%'

通配符:

%:.*:代表任意个任意字符

_:它就代表一个字符占位,相当于 . 代表一个具体的字符

[]:相当于指定一个具体的范围或者具体的值范围。这点用法与正则表达式一样

[^]:取反值

like:像。。一样:如果要使用通配符,则必须配合 模糊查询关键字:

select * from Student where Sex='女' and StudentName like '林%'
select * from Student where Sex='女' and StudentName like '林__'

 

查询学员信息,学号是13,15,18,19

select * from Student where StudentNo in (13,15,18,19)
select * from Student where StudentNo like '[11-14]'

 

 

ISNULL对所查询出的结果值做判断,如果是null值就使用指定的内容进行替换

select StudentNo,StudentName,ISNULL(Email,'没有填写') from Student

 

 

排序 默认是升序排序,如果排序有多字段,是指,先按第一个字段进行排序,相同的记录再按第二个字段进行排序

select * from Student order by sex desc,StudentNo desc

 


顺序不能变 select(5) top/distinct 7 查询字段 from (1)表列表 where (2)对源数据进行筛选 group by(3) 分组统计字段列表 having (4)对分组统计结果集做筛选 order by (6)对最终的结果集做记录重排

 

where是对源数据做筛选的。它只能去使用from后面的表中所指定的列

聚合不应出现在 WHERE 子句中,就意味着聚合函数的条件不能通过where来指定

如果是对分组之后的结果集做筛选,那么就需要使用having

having的列是从group by中获取的

对分组统计结果集做筛选后再进行数据的显示。

select ClassId, COUNT(*) num from Student group by ClassId order by num desc
 
select top 2 ClassId, COUNT(*) num from Student group by ClassId order by num desc

 

 

1.查询每个班级的总学时数,并按照升序排列

2.查询每个参加考试的学员的平均分

3.查询每门课程的平均分,并按照降序排列

4.查询每个班级男女生的人数

 

当你看到类似于:各个,各自,每个,不同这些词的时候需要 考虑分组

select ClassId, SUM(ClassHour) from Subject where ClassId is not null group by ClassId
 
select StudentNo,AVG(StudentResult) from Result group by StudentNo
 
select SubjectId,AVG(StudentResult) from Result group by SubjectId

 


数据检索返回虚拟结果集

语法:

select 字段列表/* from 表列表 where 条件not and or

sql 没有sql server sql 没有等于大于吗_字符串

查询所有学员信息
select * from Student
指定查询的列
select StudentNo,StudentName,Gender,Address from Student
指定查询的列及查询的条件
select StudentNo,StudentName,Gender,Address from Student where Gender='女' and Address='广州'
设置虚拟结果集中的列名
select StudentNo as 学号,StudentName 姓名,性别=Gender,Address from Student where Gender='女' and Address='广州'
添加常量列
select StudentNo as 学号,StudentName 姓名,性别=Gender,Address, 国籍='中国' from Student where Gender='女' and Address='广州'

sql 没有sql server sql 没有等于大于吗_字符串

 

select 可以做查询,也可以赋值和输出

select '1'+'1'

 

select StudentNo as 学号,StudentName 姓名,性别=sex,Address from Student where sex='女' and Address='广州传智播客'

使用top可以返回指定条数或者百分比的记录

select top 10 percent StudentNo as 学号,StudentName 姓名,性别=sex,Address from Student order by StudentName

 

 

使用distinct来去除重复记录:

重复记录与表的原始数据行无关。它只关注通过查询语句查询出来之后的结果集,如果虚拟结果集的每一列的值都一样,那么才算重复记录,如果有一个值不一样,那么就是一条单独的记录

select distinct 性别=sex,Address from Student
 
select distinct sex from Student

SQL聚合函数

count():求满足条件的记录数,与值无关

max():求最大值

min():求最小值

sum():求和 只能对数值进行计算不能运用于日期和字符串

avg():求平均值

1.求整个表的记录数,随意传入参数,因为它与具体的值无关,只与记录数有关

select COUNT(sex) from Student

查询班级年龄最小的学员和最大的学员

select MAX(BornDate) from Student
select min(BornDate) from Student

不管什么类型都可以使用max/min进行计算,如果是数值就比较大小,如果是字符串变比较拼音的大小

select MAX(sex) from Student nv
select min(sex) from Studentnan

查询成绩最高分和最低分,平均分和总分

select MAX(StudentResult) from Result
select MIN(StudentResult) from Result
 
select sum(StudentResult) from Result where StudentNo=2
select avg(StudentResult) from Result where StudentNo=2

-不能使用sum/avg去计算日期类型的值

select sum(BornDate) from Student where StudentNo=2
select avg(BornDate) from Student where StudentNo=2

也不能运用于字符串类型

select sum(StudentName) from Student where StudentNo=2
select avg(StudentName) from Student where StudentNo=2