SQL数据库开发知识总结:基础篇
1数据库概述
(1) ⽤⾃定义⽂件格式保存数据的劣势。
(2) DBMS(DataBase Management System,数据库管理系统)和数据库,平时谈到”数据库”可能有两种含义:MSSQL Server,Oracle 等某种DBMS;存放⼀堆数据库的 ⼀个分类(CateLog)。
(3) 不同品牌的DBMS有⾃⼰不同的特点:MYSQL,MSSQLServer,DB2,Oracle,Access,Sybase等。对于开发⼈员来讲,⼤同⼩异。
(4) 除了Access,SQLServerCE等⽂件型数据库之外,⼤部分数据库都需要数据库服务器才能运⾏。学习,开发时是连接本机的数据库,上线运⾏时是数据库运⾏在单独的服 务器。
2数据库中的概念
(1) CataLog(类)(⼜叫数据库DataBase,表空间TableSpace),不同类的数据因该放到不同的数据库中。
1) 便于对各个CataLog进⾏个性化管理
2) 避免命名冲突
3) 安全性更⾼
(2) Table(表);不同类型的资料放到不同的”格⼦”中,将这种区域叫做”表”,不同的表根据放的数据不同进⾏空间的优化,起来也⽅便。
(3) 列(Column),字段(Field)。
(4)主键(Primarykey)
(1) 主键就是数据⾏的唯⼀标⽰,不会重复的列才能当主键,⼀个表可以没有主键,但是会⾮常难以处理,因此没有特殊理由表都会设定主键。
(2) 主键有两种选⽤策略;业务主键和逻辑主键。业务主键是使⽤有业务意义的字段做主键,⽐如⾝份证号,银⾏账号等。逻辑主键是使⽤没有任何业务意义的字段做主 键,因为很难保证业务主键不会重复(⾝份证号重复),不会变化(账号升位),因此推荐⽤逻辑主键。
(3) 逻辑主键:完全给程序看的,业务员不会看的数据。
3.SQL Server管理
(1) SQL Server的两种验证⽅式:⽤户名验证和Windows验证,开发时⽤Windows验证就⾏了。
(2) 常⽤字段类型:bit(可选值0,1),datetime,int,varchar,nvarchar(可能含有中⽂⽤nvarchar)。
(3) varchar(),nvarchar().char(n)的区别:char(n)不⾜长度n的部分⽤空格填充。Var: variable:可变的。
4.SQL语句⼊门
(1) SQL语句是和DBMS”交谈”专⽤的语句,不同DBMS都认SQL语法。
(2) SQL语句中字符串⽤单引号。
(3) SQL语句是⼤⼩写不敏感的,不敏感指的是SQL关键字,字符串值还是⼤⼩写敏感。
(4) 创建表,删除表不仅可以⼿⼯完成,还可以执⾏SQL语句来完成,在⾃动化部署,数据导⼊中⽤的很多。
创建表: create table T_Person
(
ID int not null,
Name nvarchar(50),
Age int null
)
删除表:drop table T_Person
(5) 执⾏简单的Insert语句: insert into T_Person(ID,Name,Age) values(1,’Jim’,39)
*(熟悉):SQL主要分DDL(数据定义语⾔)和DML(数据操作语⾔)两类,create table,drop table,alter table等属于
DDL,select,insert,Update,delete等属 于DML。
5. 主键选择
(1) SQL Server中两种常⽤的主键数据类型:int(或bigint)+标识列(⼜称⾃动增长字段);uniqueidentifier(⼜称Guid)。
(2) ⽤标识列实现字段⾃增可以避免并发等问题,不⽤开发⼈员控制⾃动增长,⽤标识列的字段在insert的时候不⽤指定主键的值,将字段的”是标识列”设置为”是”,⼀个表只 能有⼀个标识列。
(3) Guid算法是⼀种可以产⽣唯⼀标⽰的⾼效算法,它使⽤⽹卡MAC地址,纳秒级时间,芯⽚ID码算出来的,这样保证每次⽣成的GUID永远不会重复,⽆论是同⼀个计算机 上还是不同的计算机,SQL Server中⽣成GUID的函数newid(),.NET中⽣成GUID的⽅法:Guid.NewGuid(),返回值是GUID类型。
例如:SQL Server:select newID()
C#代码中:Guid id=Guid.NewGuid();
(4) (*)int⾃增字段的优点:占⽤空间少,⽆需开发⼈员⼲预,易读。缺点:效率低,数据导⼊导出的时候很痛苦。
(5) (*)Guid的优点:效率⾼,数据导⼊导出⽅便,缺点:占⽤空间⼤,不易读。
6. 数据的基本操作
1. 数据插⼊
(1) insert语句可以省略表名后的列名,但是不推荐。Insert into Person2 values(‘lucy’,’38’)
(2) 如果插⼊的⾏中有些字段的值不确定,那么insert的时候不指定那些列即可。
(3) 给字段可以设置默认值,如果Guid类型主键的默认值设定为newid()就会⾃动⽣成,很少这样⼲: insert into
person3(ID,Name,Age) values(newid(),’tom’,30)
2. 数据更新
(1) 更新⼀个列:update T_Person set Age=30
(2) 更新多个列:update T_Person set Age=30,Name=’Tom’
(3) 更新⼀部分数据:update T_Person set Age=30 where Name=’Tom’,⽤where语句表⽰只更新Name是’Tom’的⾏,注意SQL 中等于判断⽤单个=,⽽不 是==。
(4) where中还可以使⽤复杂的逻辑判断:
update T_Person set Age=30 where Name=’Tom’ or Age<25. or相当于C#中的||(或者)。
(5) where中可以使⽤的其他逻辑运算符是:or,and,not,<,>,>=,<=,!=(或< >)等。
3. 数据删除
(1) 删除表中的全部数据:delete from T_Person。
(2) delete只是删除数据,表还在,和drop table不同。
(3) delete也可以带where⼦句来删除⼀部分数据:delete from T_Person where FAge>30。
4. 数据检索
(1) 简单的数据检索:select * from T_Employee。
(2) 只检索需要的列:select FName from T_Employee。
(3) 列别名:select FNumber as 编号,FName as 姓名 from T_Employee。
(4) 还可以检索不与任何表关联的数据:select 1+1,select newId(),select getDate()。
5. 数据汇总
(1) SQL聚合函数:max(最⼤值),min(最⼩值),avg(平均值),sum(和),count(数量)。
6. 数据排序
(1) order by⼦句位于select语句的末尾,它允许指定按照⼀个列或者多个列进⾏排序,还可以指定排序⽅式是升序(从⼩到⼤排
序,ASC)还是降序(从⼤到⼩排 序,DESC)。
(2) 按照年龄从⼤到⼩排序,如果年龄相同则按照⼯资从⼤到⼩排序
select * from T_Employee order by FAge Desc,FSalary Desc
(3) order by⼦句要放到where⼦句之后:
select * from T_Employee where FAge>23 order by FAge Desc,FSalary Desc
7. 通配符过滤(模糊匹配)
(1) 通配符过滤使⽤Like。
(2) 单字符匹配的通配符为半⾓下划线”_”,它匹配单个出现的字符,以任意字符开头,剩余部分为”erry”:
select * from T_Employee where FName like ‘_erry’
(3) 多字符匹配的通配符为半⾓百分号”%”,它匹配任意次数(零或者多个)出现的任意字符,”K%”匹配以K开头,任意长度的字符串。检索姓名中包含”n”的员⼯的信息:
select * from T_Employee where FName like ‘%n%’
8. 空值处理
(1) 数据库中,⼀个列如果没有指定值,那么值就为null,这个null和C#中的null不⼀样,数据库中的null表⽰”不知道”,⽽不是表⽰没有,因此select null+1结果是null, 因为”不知道”加1的结果还是”不知道”。
(2) select * from T_Employee where FName=null and select * from T_Employee where FName!=null。都没有任何返回结果,因为数据库”不知道”。
(3) SQL中使⽤is null,is not null来进⾏空值判断。
select * from T_Employee where FName is null
select * from T_Employee where FName is not null
9. 多值匹配
(1) select FAge,FNumber,FName from T_Employee where FAge in(34,23,35)
(2) 范围值:
1) select * from T_Emploee where FAge>=23 and FAge<=27
2) select * from T_Employee where Fage Between 23 and 27
10. 数组分组
(1) 按照年龄进⾏分组统计各个年龄段的⼈数:
select FAge,Count(*) from T_Employee Group by Fage
(2) Group by⼦句必须放在where语句的后⾯
(3) 没有出现在Group by⼦句中的列是不能放到select语句后的列名列表中的(聚合函数除外)。
1) 错误:select FAge,FSalary from T_Employee group by Fage。
2) 正确:select Fage,Avg(FSalary) from T_Employee group by Fage。
11. Having⼦句
(1) 在where中不能使⽤聚合函数,必须使⽤Having,Having要位于Group by之后。
select Fage,Count(*) as ⼈数 from T_Employee Group by FAge Having Count(*)>1
(2) 注意Having中不能不能使⽤为参数分组的列,Having不能代替where,作⽤不⼀样,Having是对组进⾏过滤。
12. 限制结果集⾏数
(1) select top 5 * from T_Employee order by FSalary Desc
(2) (*)检索按照⼯资从⾼到低排序检索从第六名开始⼀共三个⼈的信息
select top 3 * from T_Employee where FNumber not in (select top 5 FNumber from T_Employee order by Fsalary desc) order
by FSalary Desc。
db2数据库sql语句
(3) SQL Server2005后增加了Row_Number函数简化实现
13. 去掉数据重复
(1) select FDepartment from T_Employee——>select distinct FDepartment from T_Employee
(2) distinct是对整个结果集进⾏数据重复处理的,⽽不是针对某⼀个列,因此下⾯的语句并不会只保留Fdepartment进⾏重复值处理。
select distinct FDepartment,FSubcompany from T_Employee
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论