l 数据库简单认识
l 主键外键
l 基本SQL语句
l 数据检索
l 聚合函数,数字函数
l Case函数
l 索引和子查询
1.数据库
概念:按照数据结构来组织、存储和管理数据的仓库。 英文:Database
数据库管理系统:用于管理数据库的系统。
英文:DataBase Management System
2.除了某些文件型数据库,大部分数据库都需要连接服务器才能运行。
3.Catclog 分类 , Table 表 , Column列
Field 字段
4.主键 数据行的唯一标识,不会重复的列才能当主键。
选择:
业务主键 有意义的字段(如身份证号等)
逻辑主键 没意义的字段(纯属为了标号)
一般设置逻辑主键,主键不能被使用者看到。
数据类型标注(MAX)的不能设为主键。
SQL中常用的主键数据类型:int(或bigint),uniqueidentifier(Guid,全局唯一标示符,从来不会产生相同的标示符,不能设置为标识列)
主键名统一叫id.
Int类型主键可以设置自增主键:
设置为自增主键的字段被称为标识列,每个表只能有一个标识列。
Int自增主键用insert语句添加时可以不指定主键。
Guid需要。例如:
insertinto newtable1(name,age)values('王明',21)
insertinto table_1(id,name,age)values(newid(),'王明',21)
SQLserver用于生成Guid的函数:newid()
SQL语句中设置主键的方法:
在类型设置后加上:primary key(主键名)
createtable table_2(iduniqueidentifier,namenvarchar(50),ageint,primarykey(id))
C#中生成Guid的方法:Guid.NewGuid();返回类型为Guid类型
Guid id =Guid.NewGuid();
Console.WriteLine(id);
两种数据类型作为主键的比较:
主键数据类型 | 占用空间 | 开发人员干预 | 可读性 | 效率 |
Int自增字段 | 小 | 不需要 | 易读 | 数据导入导出慢 |
Guid | 大 | 需要 | 不易读 | 数据导入导出方便 |
推荐使用Guid作为主键。
5.外键:跟主键不在同一表中,指向主键。 ForeignKey
6.数据类型(只写C#中没的)
bit 在SQLserver中只有0和1两种选择,对应到数据库的值中为true和false.
nvarchar(50)
nvarchar(MAX) unicode类型字符,()内为长度,MAX表明自设最大长度(<255)
varchar(50)
varchar(MAX) char类型字符(阿斯科码表)
+++varchar()与char()的比较+++
char(等效长度)类型数据字符串后面会被加上多余的空格以达到等效长度。
Varchar()字符串后面的不会有多余空格。
例如:
注意存储数据时,最好用varchar ,防止存储上多余的空格。
7.SQL语句
DBMS中用到的语句。不同的DBMS通用。
SQL语句中字符串用单引号引起来。
SQL语句的关键字大小写不敏感,但是字符串中的数据大小写敏感。
SQL语句可以创建,修改,删除表。
例如:
createtable newtable(idint,namenvarchar(max),weightint,ageint) 创建表
droptable newtable 删除表
insertinto newtable(id,name,age)values(1,'王明',21) 修改表
把SQL语句分为两类:
DDL 数据定义语句
Create table , drop table , alter table(修改删除字段或列)
DML 数据操作语句
Insert into(插入) , select , update ,delete
更新一个列:
update table_1setname=N'王明'
更新多个列:
update table_1setname=N'王明',age=50 //加上N保证输入中文等unicode字符不出错
update table_1setname=N'刘忻'where age=55 where设定条件
SQL中的等于判断用单个=
其他判断符:and ,or, not ,<>(相当于!=)
Delete 删除数据不同于drop,只删除数据不删除表。加上where设定条件后可以只删除部分数据。
执行SQL语句delete from table_1 where age=55
8数据检索
1) Select * from表名 检索所有数据
select*from table_1
2)Select 字段名 from表名 检索某一个,或多个字段
selectnamefrom table_1
selectname,agefrom table_1
3)可以加上where设定条件
selectname,agefrom table_1where age=22
4)字段名 as别名 可以给字段改名(仅限检索结果,表中并未改变)
selectnameas姓名,ageas年龄from table_1
selectnameas姓名,ageas年龄from table_1where age=22andname!='柳树'
5)聚合函数
selectmax(age)from table_1 查询最大年龄
selectmin(age)from table_1 查询最小年龄
selectmax(age),min(age)from table_1 查询最大最小年龄
selectavg(age)from table_1 查询平均年龄
selectsum(age)from table_1 查询年龄之和
selectcount(*)from table_1 查询个数()中必须有一个参数
selectcount(*)from table_1wherename='柳树' 按条件查询
6)检索与表不相干的数据
select'姓名',name,'年龄',agefrom table_1 orderby agedesc
7)按条件排列
order by字段 asc 按字段的值从小到大排列
order by字段 desc 按字段的值从大到小排列
select*from table_1orderby age asc,weightdesc 先按age的升序排,后按weight的降序排
如果语句中有where设定条件,排序要写在它后面
select*from table_1 where age!=22orderby ageasc,nameasc
8)通配符过滤
Like ‘_字符’ 单字符匹配,_上是只差的一个字符就是完整字段(不常用)
Like ‘%字符%’ 多字符匹配
select*from table_1 where idlike'A344%' 以A344开头
select*from table_1 where idlike'%90c' 以90c结尾
select*from table_1 where idlike'%44%' 包含44
9)数据库中的null
数据库中的null表示不知道(空值,无类型)
SQL语句中用 is null 和 is not null来判断是否为空值
10)检索某些值和检索范围值
select*from table_1 where weight in(11,99) 检索weight为11和99的数据
select*from table_1 where weightbetween 11and 99 检索weight为11到99的数据
11)数据分组
Group By
Group By子句必须放在where语句之后
Group by字段1 按字段1分组
select age,count(*)from table_1 groupby age
检索的项必须包含在分组中或者聚合函数中,聚合函数不能出现在where子句中,用having,在group之后,但是having的设定条件必须是检索项。
select age,count(*)from table_1 groupby agehaving age>22 //不能是having name !=N’柳树’
取出年龄大于22的分组,按年龄不同分组标出每组的个数
12)限制检索
Select top数字 * from表名
selecttop 3*from table_1 orderby agedesc 取按照年龄降序排列前三名
selecttop 3*from table_1
where agenotin(selecttop 3 agefrom table_1orderby agedesc)
orderby agedesc //嵌套检索,取出年龄降序后第4-6名
检索后:
13)向表中加入列
Alter table表名 add 列名列名数据类型
alter table table_1add classnumber int
altertable table_1add nicknamenvarchar(MAX)
加入信息:
update table_1set classnumber=408,nickname=N'北京的云'where age=22 更新和插入insert有区别,更新会取代原来的数据,插入会加入新数据
14)检索不重复信息
Distinct 其后字段有一个不同就会被检索.
selectdistinct age,name,nicknamefrom table_1
取出年龄,姓名,昵称中有一个不同的信息
15)联合结果集
Union 用于连接两个检索结果,两个检索字段数必须相同,对应位置上的类型必须兼容。
selectname,agefrom table_1
union
selectname,agefrom table_2
只有检索字段中不相同的内容才会被检索出来,如果两表中检索内容都相同,只会出现一个。
Union all 检索内容重复也会被列为结果。
selectname,weightfrom table_1
union all
select'平均体重',avg(weight)from table_1
与union比较:
Union除了不会列出重复结果,还会打乱检索顺序,所以一般都用union all
16)数字函数
Abs() 求绝对值
Ceiling() 舍入到最到整数。
selectceiling(-3.4) -3
selectceiling(2.8) 3
selectceiling(2.2) 3
selectceiling(-3.8) -3
Floor() 舍入到最小整数。
selectfloor(-3.8) -4
selectfloor(2.8) 2
2selectfloor(2.2) 2
selectfloor(-3.1) -4
Round(数字,小数点后保留位数)四舍五入
selectround(2.1,0) 2
selectround(2.5,0) 3
selectround(-3.4,0) -3
selectround(-3.8,0) -4
17)字符串函数
Len( ) 求字段长度(字段后边长度不计)
selectlen(2.5) 3
selectlen('abc') 3
selectlen('abc ') 3
selectlen(null) null
selectlen(newid()) 36
Ltrim() 去掉左边空格
Rtrim() 去掉右边空格
Ltrim(rtrim(字段)) 去掉两边空格
Substring(字段,起始截取位置,截取长度)
selectsubstring('abcdefg',0,3) ab 从零截取只有两位
selectlen(substring('abcdefg',0,3)) 2
selectsubstring('abcdefg',1,3) abc 注意SQL中字符下标从1开始
getdate() 获取当前时间
Dateadd(datepart, number,date) date为日期,number为增量,datepart为要增加的部分,可以是年,月,日,小时,分,秒
Datediff(datepart,startdate,enddate) 计算两个日期时间差
Datepart(datepart,date)返回时间一部分,返回年,月,日,等
select'当前时间和三天前此时差多少小时',datediff(hour,getdate(),dateadd(day,-3,getdate()))
汉字不能直接连接到SQL语句中。
根据入职年数查询人数和根据入职时间查询人数
18)类型转换函数
Cast(字段 as 类型)
Convert(类型,字段)
19)空值处理函数
Isnull(待判断字段,取代值)
如果待判断字段不为null则返回其值,如果为null则返回取代值。
selectisnull(weight,0)from table_1 如果体重为空(null)则用0代替
selectisnull(name,'匿名')from table_1 如果姓名为空(null)则用匿名代替
20)case函数
相当于C#中switch和if—else的结合
语法:
抓取值判断:
Case(字段)
When 值1then 返回结果1
When 值1then 返回结果2
When 值1then 返回结果3
Else 返回其他结果
End
抓取条件判断:
Case
When 条件1then 返回结果1
When 条件2then 返回结果2
When 条件3then 返回结果3
Else 返回其他结果
End
联合聚合函数示例:
21)索引
在经常检索的字段上创建索引,提高检索效率。
虽然索引能提高检索效率,但索引也占据空间,而且添加,更新,删除数据时也需要同步更新索引,因此会降低insert,update,delete的速度。
22)表连接join
Inner join , left join , right join
语法:
Select 字段(必须明确)from
表1 join 表2 on 表1.列=表2.列 列中有相同内容
例如下表1记录了一些人的姓名和他们的体重等信息,表2记录了这些人中个别人的年龄,这时,姓名可以作为连接输出不同的内容。
As 可以省略。
可以在连接的基础上设定where条件。
23)子查询
将一个查询语句作为一个结果集供其他SQL语句使用。
语法: select查询内容 from(select语句) as别名
括号内的查询语句必须有别名才能使用
单值子查询:只有返回一行一列(就是一个数)的子查询才能被当成单值子查询。