【网学网提醒】:本文主要为网学会员提供4SQL持之以恒,希望对需要4SQL持之以恒网友有所帮助,学习一下!
SQLServer2008序列号:
Developer:PTTFM-X467G-P7RH2-3Q6CG-4DMYB
Enterprise:JD8Y6-HQG69-P9H84-XDTPG-34MBB
--------------------------------------------------------
数据库概述
DBMS数据库管理系统(对数据库进行管理的系统)
不同品牌的DBMS有自己不同的特点:MYSQL(速度非常快,对数据的保存不怎么好)、MSSQLServer(跟.NET结合非常好,酷毙了)、DB2、Oracle(这两个比较大的数据库)、Access(能把他当文件来用,不需要服务器就可以)、Sybase等。
差别对开发者而言微乎其微,一通全通,大同小异。
SQL(查询语句)<>SQLServer<>MSSQLServer.三者是不一样的。
除了Access、SQLServerCE等文件型数据库之外,大部分数据库都需要数据库服务器才能运行。学习、开发是连接本机的数据库,上线运行时是数据库运行在单独的服务器。
--------------------------------------------------------
数据库中的概念
Catalog(分类)(又叫数据库Database,表空间TableSpace)
不同类的数据应该放到不同的数据库中
便于对各个Catalog进行个性化管理
避免命名冲突
安全性高
Table(表):不同类型的资料放到不同的个子中,将这种区域叫做表。不同的表根据放的数据不同进行空间的优化,找起来也方便。
列(Column)、字段(Field)
主键(PrimaryKey)
主键是数据行的唯一标识。不会重复的列才能当主键。一个表可以没有主键,但是会非常难以处理,因此没有特殊理由表都要设定主键。
主键有两种选用策略:业务主键和逻辑主键。业务主键是使用有业务意义的字段做主键,比如身份证号,银行账号等;逻辑主键使用没有业务意义的字段做主键。因为很难保证业务主键不会重复,因此推荐使用逻辑主键。完全给程序看的,业务人员不会看的!
标间关联、外键(ForeignKey)可以避免出现字段的重复。
SQLServer的管理--安装SQLServer和SQLServerManagementstudio
--------------------------------------------------------
SQLServer服务器名称:.:表示本机
先建数据库,在建表
新建,修改等
数据类型:
bit布尔类型,trueorfalse数据库中值为0和1
char(10)字符类型是个字符
datetime日期
int整数(32位)bigint大整数(64位)
nvarchar(50)长度为50的字符串,可能含有非ASCII码的信息,可能含有中文等文字
nvarchar(MAX)无限大的字符串
varchar(50)纯英文信息
char(n)不足长度n用空格填充
--------------------------------------------------------
SQL语句入门
SQL语句就是和DBMS交谈的专用语言,不同的DBMS都认识SQL语法。
SQL语句中字符串用单引号。
SQL语句是大小写不敏感的,不敏感指的是是SQL关键字,字符串值还是大小写敏感的。
创建表、删除表不仅可以手工完成,还可以执行SQL语句完成,在自动化部署、数据导入中用的很多
表->右击->新建查询输入SQL语言进行操作
SQL语句主要分为DDL(数据定义语言)和DML(数据操作语言)两类。createtable、droptable等属于DDL,select、insert等属于DML。
主键的设置
在表上右击->修改表,打开表名的修改。
把id做主键的名字,所有主键名字都用id。主键不能重复
SQLServer中两种常用的主键数据类型:int+标识列(又称自动增长字段);uniqueidentifier(又称Guid、UUID)
字符串也可以设置主键,但是最大字符不能设置主键。
列属性->标识规范->是->自动增长字段
表中只能有一个标志列,一般将主键设置为标识字段
用标识列实现的字段自增可以避免并发等问题,不要开发人员控制自增。用标识列的字段在INSERT的时候不用指定主键的值。将字段的“是标识列”设置为是,一个表只能有一个标识列。
Guid算法是一种可以产生唯一标识的高效算法。它使用网卡MAC、地址、纳秒级时间、芯片ID码等算出来的,保证每次生成的GUID永远不会重复,无论是同一个计算机还是不同的计算机。
SQLServer中生成的GUID的函数newid(),.net中生成的Guid方法:Guid.NewGuid(),返回是Guid类型。
int自增长字段的优点:占用空间小、无需开发人员干预、易读;
缺点:效率低,数据导入导出的时候很痛苦。
Guid的优点:效率高、数据导入导出方便;
缺点:占用空间太大、不易读。
业界主流倾向于是用Guid。
--------------------------------------------------------
数据插入
insertintoPerson3(Name.Age)values('lily',30);
或者
insertintoPerson3values('lily',38);
选中执行的时候就执行选中的部分,不选择的话就执行全部语句。
Guid插入:
insertintoPerson4(id,name,age)values(newid(),'lily',38);
列属性默认值的绑定,可以不用写函数,自动生成一些字段。
如果Guid字段的默认值设定为newid()就会自动生成。很少这么干。
--------------------------------------------------------
数据更新
更新一个列:UPDATEperson1setage=30;
更新多个列:UPDATEperson1setage=30,name='lucy';
有约束的更新:
UPDATEperson1setNickName=N'青年人'
whereage>=20;
--------------------------------------------------------
数据删除
删除表中的全部数据:
DELETEFROMPerson.
Delete只是删除数据,表还在,和DropTable不同。
Delete也可以带where子句来删除一部分数据:
deletefromPersonWHEREAge>20;
--------------------------------------------------------
数据检索
简单的数据检索:
select*FROMPerson
*表示所有的字段
select字段名1,字段名2FROMPerson
有约束的检索:
select*FROMPers
on
whereAge<20
给列起别名:
selectNameas,Ageas年龄FROMPerson
whereAge<20
也可以用select执行与表不相关的数据。
select1+1as列1,getdate()as日期,newid()as编号
--------------------------------------------------------
数据汇总
SQL聚合函数:MAX、MIN、AVG、SUM、COUNT。
SELECTNameas,Ageas年龄,Salary+10000as月薪,
detdate()as当前时间FROMPerson;
selectcount(*)fromPerson;
selectmax(salary)fromPerson;
...
对数据进行统计的函数叫做聚合函数。
--------------------------------------------------------
数据排序(orderby)
select*fromPerson
orderbyAge,salaryASC;//按照年龄进行排序
首先按照年龄排列,如果年龄相同,则按照工资进行升序排列
ASC代表升序
DESC代表降序
orderby子句要放到where子句之后(注意顺序)
select*fromPerson
whereAge>20
orderbyAge,salaryASC;
--------------------------------------------------------
通配符过滤(模式匹配)模糊查找
通配符过滤使用LIKE
单字通配符为半角下划线“_”,他匹配单个字符。例如:以任意字符开头,剩余部分为‘erry’:
select*fromPerson
whereNameLIKE‘_erry’;
多字通配符为半角百分号‘%’,他匹配任意次数(0个或多个)出现的任意字符。
--------------------------------------------------------
空值处理
数据库中,一个值如果没有指定值,那么值就为NULL,这个null与c#中的null不同,数据库中的null表示“不知道”,而不是表示没有。因此selectnull+1结果还是null,因为不知道的结果还是不知道。
查询是,无论是等于null还是不等于null,都是一条数据都没有
要查询时:
select*fromPerson
whereNameisnull;//如果用等号,就什么都不显示
可以显示要查询的数据。
--------------------------------------------------------
多值匹配
select*fromPerson
whereAge=23orAge=25orAge=28;
或者
select*fromPerson
whereAgein(23,25,28);
select*fromPerson
whereAge>20andAge<30;
或者
select*fromPerson
whereAgebetween20and30;
--------------------------------------------------------
数据分组
selectAge,count(*)FROMPerson
GRUOPBYAge;
//根据年龄相同的数据进行分组,数各组中数据的个数
没有出现在GRUOPBY子句中的列是不放到select语句后的列名列表里的(聚合函数除外)
GRUOPBY子句必须放到where语句之后
--------------------------------------------------------
Having语句
在where中不能使用聚合函数
必须使用Having,Having要位于GRUOPBY之后
selectAge,count(*)FROMPerson
GRUOPBYAge
HavingCount(*)>1;
Having是对分组后信息的过滤,能用的列和select中能用的列是一样的。所以不能用Having来代替where;
-----------
---------------------------------------------
限制结果集的函数
selecttop3*fromPerson
wherenumbernotin(selecttop5numberfromPerson
orderbysalaryDESC)
orderbySalaryDESC
//检索按照工资降序排列的前三人的信息
--------------------------------------------------------
去掉重复的数据
selectdistinctdepartmentfromPerson
distinct去除重复的信息,是用来消除完全重复的行,如果有两个字段的话,完全消除才会被去除
--------------------------------------------------------
联合结果集
union在两个查询结果连接起来,合并到一起
上下两个列数(个数)要相同,数据类型也要相容,才能构成连接。
unionall不会导致数据丢失,不会进行重复行的合并,如果不是故意的去除重复行,就一定要加上all
--------------------------------------------------------
案例1:要求查询员工的最低年龄和最高年龄;
select‘正式员工最高年龄’,MAX(Age)fromPerson
unionall
select‘正式员工最低年龄’,MIN(Age)fromPerson
unionall
select‘临时工最高年龄’,MAX(Age)fromPerson
unionall
select‘临时工最低年龄’,MIN(Age)fromPerson
案例2:查询每位正式员工的信息,包括工号、工资,并且在最后加上员工工资额合计。
selectnumber,salaryfromPerson
union
select‘工资合计’,sum(salary)fromPerson
--------------------------------------------------------
数字函数
ABS():求绝对值
CEILING():舍入到最大整数,例如:1.1舍入到2。ceiling:天花板
FLOOR():舍入到最小整数,floor:地板
ROUND():四舍五入,有两个参数:round(-3.61,0)
0表示精度,表示0个小数点
字符串函数
LEN():计算字符串的长度
LOWER()、UPPER():转小写、大写
LTRIM():字符串左侧的空格去掉
RTRIM():字符串右侧的空格去掉
SUBSTRING(string,start_position,length)
//参数string为主字符串,start_position为子字符串在主字符串中的起始位置,length为子字符串的最大长度
从start_position开始,长度为length的string中的字符。
日期函数
GETDATE():取得当前日期时间
DATEADD(datepart,number,date),计算增加以后的日期
datepart为DAY、MONTH、YEAR、HH等
number为时间,正的就增加,负的就减少
date为当前的日期
DATEDIFF(datepart,startdate,enddate):计算两日之间的差额。datepart为计量单位。
DATEPART(datepart,date):返回一个日期的特定的部分
类型转换函数
CAST(expressionASdata_type)
CONVERT(data_type,expression)
selectcast(‘123’,asint)
convert(datetime,‘123’)
空值处理函数
ISNULL(expression,value):如果expression不为空则返回expression,否则返回value。
CASE函数用法1:
CASEexpression
whenvalue1thenreturnvalue1
whenvalue2thenreturnvalue2
whenvalue3thenreturnvalue3
whenvalue4thenreturnvalue4
elsedefaultreturnvalue
end
SQL语句中用--作注释
--------------------------------------------------------
索引Index
全表扫描:对数据进行检索(select)效率最差的是全表扫描
就是一条条的找。
如果没有目录,差汉语词典就要一页一页的翻,而有了索引,只要查目录即可,为了提高索引的速度,可以为经常进行检索的列添加索引,相当于创建目录。
创建索引的方式:在表设计器中点击右键,选择“索引/键”->添加->在列中选择索引包含的列
使用索引能提高查询效率,但是索引也是占据空间的,而且添加、更新、删除数据的时候需要同步更新索引,因此会降低insert、update、delete的速度。只在经常检索的字段上创建索引。
即使创建了索引,仍然有可能全表扫描,比如like、函数、类型转换等。
--------------------------------------------------------
Join表连接
进行表之间的查询,表的关联
join...on...
--------------------------------------------------------
子查询
将一个查询语句作为一个结果集供其他SQL语句使用,就像普通的表一样,被当做结果集的查询语句被称为子查询。所有可以使用表的地方几乎都可以使用子查询来代替。