你所需要的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
 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 )

 

 
-创建表,需要做那一些设置?
字段名称,字段类型,是否为空 标识列 默认值 主键,唯一键,索引,关系,check约束
语法:
create table 表名
 字段名称 字段类型 列的特征(是否为空 标识列 默认值 主键 唯一键 索引 关系 check约束),
 字段名称 字段类型 列的特征(是否为空 标识列 默认值 主键 唯一键 索引 关系 check约束)
创建老师表Teacher Id、Name、Gender、Age、Salary、Birthday
确定表需要为那一个数据库创建
 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 )

 


约束-保证数据完整性
数据完整性:为了保证数据是安全和准确的
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
 1 alter table teacher 2 add constraint CK_Age check(age>0 and age<=100) 
为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('中华人民共和国')
char:char类型空间一旦分配,就不会做自动收缩,就算没有存储满也需要占据指定分配的空间,如果存储过多,就会报错二进制数据截断的错误,不能越界
select LEN(Char) from chartest
select DataLength(Char) from chartest
 
VarChar它会根据存储的内容的长度自动收缩,如果存储的内容小于指定的空间范围,那么多余的空间会收回。所以当存储的内容的长度波动较大的时候就考虑使用VarChar
select LEN(VarChar) from chartest
select DataLength(VarChar) from chartest
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 [into] 表名[(字段列表)] values(值列表)
1.为student表添加全部的列数据,如果没有指定具体的字段列表,那么就需要为所有列添加值,但是标识列是永远不能人为添加值的,因为它是系统自动生成的。
insert into Student values('123455667','张三','',4,'110',N'广州','1990-1-1','aa@bb.com')
2.如果字段可以为null,或者字段有默认值,那么在添加值的时候可以使用null/default
insert into Student values('123455667','张三','',4,null,'广州','1990-1-1',default)
3.如果没有指定可以为null或者有默认值的字段,那么就不需要为他赋值:列名或所提供值的数目与表定义不匹配。
insert into Student(LoginPwd,StudentName,Gender,GradeId,Birthday) values('123455667','张三','',4,'1990-1-1') 
INSERT 语句中列的数目小于 VALUES 子句中指定的值的数目。VALUES 子句中值的数目必须与 INSERT 语句中指定的列的数目匹配
4.非空字段一定需要传入值
insert into Student(LoginPwd,StudentName,Gender,GradeId) values('123455667','张三','',4)
5.插入的值必须符合表的完整性约束
insert into Student(LoginPwd,StudentName,Gender,GradeId,Birthday) values('123456','张三','',5,'1999-9-9')
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 条件
修改qq的性别为女
update Student set Gender='' where StudentNo=1
多条件查询 如果是一个数组组成的字符串就可以不添加’‘
update Student set Phone=119 where StudentName='qq' and Gender=''
多值同时修改,修改多个字段值的时候使用,分隔
update Student set LoginPwd='aaaaaa' ,Gender='',GradeId=1,Address='东莞' where StudentNo=6
修改的时候可以直接赋值,也可以使用表达式
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
查询所有学员信息
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='广州'
 
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 

 

posted @ 2014-06-19 23:08  李京阳  阅读(212)  评论(1编辑  收藏  举报