第1页共40页杨中科SQL课程课件数据库概述●DBMS(DataBaseManagementSystem,数据库管理系统)和数据库。平时谈到“数据库”可能有两种含义:MSSQLServer、Oracle等某种DBMS;存放一堆数据表的一个分类(Catalog)●数据库的构成-管理软件/服务/数据文件(表,视图...)●不同品牌的DBMS有自己的不同的特点:MYSQL、MSSQLServer、DB2、Oracle、Access、Sybase等。对于开发人员来讲,大同小异●SQLSQLServerMSSQLServer。最常见的错误。●除了Access、SQLServerCE等文件型数据库之外,大部分数据库都需要数据库服务器才能运行。学习\开发时是连接本机的数据库,上线运行时是数据库运行在单独的服务器备注:为什么要用数据库:我们平时把数据以文件的方式存放在硬盘里,但当数据量庞大的时候:文件大,操作效率很低下。所以,便有了很多种数据库软件(Mssql,Ora,DB2…),它们代替我们做数据文件的操作(mdf,ndf,ldf)并提供高效的存储和检索等操作。还提供了很多接口给其他程序语言调用。为什么要使用数据库?●用文件保存数据与用数据库的优劣:●高效维护大量数据-检索/增/删/改●处理各个表之间的关系●压缩表数据●安全数据库中的概念●Catalog(分类)(又叫数据库DataBase,表空间TableSpace),不同类的数据应该放到不同的数据库中第2页共40页1.便于对各个Catalog进行个性化管理2.避免命名冲突3安全性更高●Table(表):书都放到书架上,碗都放到橱柜中,不同类型的资料放到不同的“格子”中,将这种区域叫做“表”(Table)。不同的表根据放的数据不同进行空间的优化,找起来也方便。●列(Column)、字段(Field)主键(PrimaryKey)主键就是一个表中每个数据行的唯一标识。不会有重复值的列才能当主键。一个表可以没有主键,但是会非常难以处理,因此没有特殊理由表都要设定主键主键有两种选用策略:业务主键和逻辑主键。业务主键是使用有业务意义的字段做主键,比如身份证号、银行账号等;逻辑主键是使用没有任何业务意义的字段做主键,完全给程序看的,业务人员不会看的数据。因为很难保证业务主键不会重复(身份证号重复)、不会变化(帐号升位),因此推荐用逻辑主键。2003年5月入职,是产品开发部的,姓名马小虎王二小,技术支持部,入职是2005年7月2003年5月入职,是产品开发部的,姓名马小虎王二小,技术支持部,入职是2005年7月第3页共40页备注:表一定要有主键,否则。一会试一下删除没有主键的数据。自动增长主键和Guid外键(ForeignKey)—记录表与表的关联SQLServer的管理●需要安装SQLServer2005或者SQLServer2008,若要使用SQLServer管理工具进行开发还要安装SQLServerManagementStudio,还可以使用VisualStudio进行管理●使用免费的SQLServerExpress版本,Express版本的服务器名称.\SQLEXPRESS,对于开发人员来讲和其他版本没有区别。●SQLServer的两种验证方式:用户名验证和Windows验证,开发时用Windows验证就行。第4页共40页●开发人员关注点在开发上,而不是配置/备份等之上,那是DBA做的事情。●创建数据库,创建表,设置主键●SQLServer2008中:编辑200行;SQLServer2005中:打开表。●常用字段类型:bit(可选值0、1)、datetime、int、varchar、nvarchar(可能含有中文用nvarchar)●Nvarchar(50)、Nvarchar(MAX)●varchar、nvarchar和char(n)的区别:char(n)不足长度n的部分用空格填充。Var:Variable,可变的。SQL语句入门_StructuredQueryLanguage●SQL语句是和DBMS“交谈”专用的语句,不同DBMS都认SQL语法●SQL语句中字符串用单引号。●SQL语句是大小写不敏感的,不敏感指的是SQL关键字,字符串值还是大小写敏感的第5页共40页●创建表、删除表不仅可以手工完成,还可以执行SQL语句完成,在自动化部署、数据导入中用的很多,CREATETABLET_Person(IdintNOTNULL,Namenvarchar(50),AgeintNULL)、DroptableT_Person1●简单的Insert语句。INSERTINTOT_Person(Id,Name,Age)VALUES(1,'Jim',20)●(*)SQL主要分DDL(数据定义语言)和DML(数据操作语言)两类。CreateTable、DropTable、AlterTable等属于DDL,Select、Insert、Update、Delete等属于DML主键选择&GloballyUniqueIdentifier(全球唯一标识符)●SQLServer中两种常用的主键数据类型:int(或bigint)+标识列(又称自动增长字段);uniqueidentifier(又称Guid、UUID)●用标识列实现字段自增可以避免并发等问题,不要开发人员控制自增。用标识列的字段在Insert的时候不用指定主键的值。将字段的“是标识列”设置为“是”,一个表只能有一个标识列。●Guid算法是一种可以产生唯一标识的高效算法,它使用网卡MAC、地址、纳秒级时间、芯片ID码等算出来的,这样保证每次生成的GUID永远不会重复,无论是同一个计算机上还是不同的计算机。在公元3400年以前产生的GUID与任何其他产生过的GUID都不相同。SQLServer中生成GUID的函数newid(),.Net中生成Guid的方法:Guid.NewGuid(),返回是Guid类型。●(*)Int自增字段的优点:占用空间小、无需开发人员干预、易读;缺点:效率低;数据导入导出的时候很痛苦。●(*)Guid的优点:效率高、数据导入导出方便;缺点占用空间大、不易读。业界主流倾向于使用Guid。备注:UniqueIDentifier)GUID:用于指示产品的唯一性安装。是通过特定算法产生的一个二进制长度为128位的数字。在空间上和时间上具有唯一性,保证同一时间不同地方产生的数字不同。在公元3400年以前产生的UUID/GUID与任何其他产生过的UUIDs/GUIDs都不相同第6页共40页GUID的长度固定,并且相对而言较短小,非常适合于排序、标识和存储。新增-InertintoTable(col,col2...)values(data1,data2...)●Insert语句可以省略表名后的列名,但是不推荐●如果插入的行中有些字段的值不确定,那么Insert的时候不指定那些列即可。●给可以给字段默认值,如果Guid类型主键的默认值设定为newid()就会自动生成,很少这么干●主键:insertintoPerson3(Name,Age)values('lily',38);insertintoPerson4(Id,Name,Age)values(newid(),'tom',30);备注:用Guid插入的顺序和Select的顺序可能不一致,无论是用什么主键都不要依赖于主键排序。InSert[INTO]表名[列名]Values值列表看看这几句●INSERTINTOBook(b_title,b_cid,b_Content,b_author,b_isdel,b_addtime)VALUES('传智播客',5,'严谨负责','家宝',0,getdate())●INSERTINTOBookVALUES(1,'传智播客','严谨负责','家宝',0,getdate())●INSERTINTOBook(b_title,b_Content,b_author,b_isdel,b_addtime)VALUES('传智播客','严谨负责')●INSERTINTOBook(b_cid,b_title,b_Content,b_author,b_isdel,b_addtime)VALUES(2,'传智播客','严谨负责','家宝','删除了',getdate())●INSERTINTOBook(b_cid,b_title,b_Content,b_author,b_isdel,b_addtime)VALUES(1,'传智播客','严谨负责','家宝',0,getdate())●INSERTINTOBook(b_cid,b_title,b_isdel,b_addtime)VALUES(1,'传智播客',0,getdate())●INSERTINTOBook(b_cid,b_title,b_Content,b_author,b_isdel,b_addtime)第7页共40页VALUES(1,'有美女','严谨负责','家宝',0,getdate())●INSERTINTOBook(b_cid,b_title,b_Content,b_author,b_isdel,b_addtime)VALUES(1,'传智播客','严谨负责','家宝',DEFAULT,getdate())更新-updateTablesetcol=value,col2=value2where...●更新一个列:UPDATET_PersonSetAge=30●更新多个列:UPDATET_PersonSetAge=30,Name=‘tom’●更新一部分数据:UPDATET_PersonSetAge=30whereName=‘tom’,用where语句表示只更新Name是’tom’的行,注意SQL中等于判断用单个=,而不是==●Where中还可以使用复杂的逻辑判断UPDATET_PersonSetAge=30whereName=‘tom’orAge25,or相当于C#中的||(或者)●updatePerson1setNickName=N'二十岁'●where(Age20andAge30)or(Age=80)●Where中可以使用的其他逻辑运算符:or、and、not、、、=、=、!=(或)等备注:Update表名Set列名=更新值[Where更新条件]删除-delete[from]Tablewherecol=data●删除表中全部数据:DELETEFROMT_Person。●Delete只是删除数据,表还在,和DropTable不同。●Delete也可以带where子句来删除一部分数据:DELETEFROMT_PersonWHEREFAge20●TruncateTruncateTable表名检索-selectcol,col2[,*]fromTablewhere...●执行备注中的代码创建测试数据表。●简单的数据检索:SELECT*FROMT_Employee第8页共40页●只检索需要的列:SELECTFNumberFROMT_Employee、SELECTFName,FAgeFROMT_Employee●列别名:SELECTFNumberAS编号,FNameAS姓名,FAgeASAge111FROMT_Employee●使用where检索符合条件的数据:SELECTFNameFROMT_EmployeeWHEREFSalary5000。故事:新员工的数据检索噩梦。●还可以检索不与任何表关联的数据:select1+1;selectnewid();selectgetdate();备注:CREATETABLET_Employee(FNumberVARCHAR(20),FNameVARCHAR(20),FAgeINT,FSalaryNUMERIC(10,2),PRIMARYKEY(FNumber));INSERTINTOT_Employee(FNumber,FName,FAg