黑马程序员 sql
黑马程序员 SQL
WP7
培训
焊锡培训资料ppt免费下载焊接培训教程 ppt 下载特设培训下载班长管理培训下载培训时间表下载
、.NET培训、期待与您交流!
数据库概述:
? DBMS(DataBase Management System,数据库管理系统)和数据库。平时谈到的“数据库”可能有两种含义:
MSSQLServer、Oracle等某种DBMS;存放一堆数据表的一个分类(Catalog)。
? 不同品牌的DBMS有自己的不同特点:MYSQL、MSSQLServer、DB2、Oracle、Access、Sybase等。对于开发人员来讲,大同小异。
? SQL。。。SQLServer。。。MSSQLServer 这是最常见的错误。
? 除了Access、SQLServerCE等文件型数据库之外,大部分数据库都需要数据库服务器才能运行。学习、开发时是连接本机的数据库,上线运行时是数据库运行在单独的服务器。
数据库中的概念:
? Catalog(分类)(又叫数据库DataBase、表空间TableSpace),不同类的数据应该放到不同的数据库中 。
优点:
1. 便 于对各个Catalog进行个性化管理
2. 避免命名冲突
3. 安全性更高
? Table(表):书都放到书架上,碗都放到橱柜中,不同类型的资料收到不同的“格子”中。将这种区域叫做“表”(Table)。不同的表根据放的数据不同,进行空间的优化,找起来方便。
? 列(Column)、字段(Field)
主键(PrimaryKey)
主键就是数据行的唯一标识。不会重复的列才能当主键。一个表可以没有主键,但是会非常难以处理,因此没有特殊理由都要设定主键。
主键有两种选用策略:业务主键 和 逻辑主键。
业务主键是使用有业务意义的字段做主键,比如身份证号、银行账号等;逻辑主键 是使用没有任何业务意义的字段做主键,完全给程序看的,业务人员不会看的数据。因为很难保证业务主键不会重复(身份证号重复)、不会变化(账号升位),因此推荐用逻辑主键。
SQL Server Management Studio Express
创建数据库,创建表,创建主键
SQL语句中 通过 -- 为代码做注释。
常用字段类型:
bit 相当于C#中的bool 这里的bit只有两个值 0 和 1 .
10) :10个字符
datetime 系统时间
int 整数型
varchar 纯英文的字符
nvarchar 含有英文之外的字符
nvar50) 长度为50字符的nvarchar
nvarmax) 无限大
varchar 和 n)的区别:
n)不足长度n的部分用空格填充。
SQL语句入门
? SQL语句是是和DBMS“交谈”专用的语句。不同DBMS都认SQL语法。
? SQL语句中字符串用单引号。
? SQL语句是大小写不敏感的,不敏感指的是SQL关键字,字符串值还是大小写敏感的。
? 创建表、删除表不仅可以手工完成,还可以执行SQL语句完成。在自动化步署、数据导入中用的很多,Create TABLE Person03(Number
int,Name nvar10),Age int):这里是使用SQL语句创建一个表 DROP TABLE T_Person1 :这里是使用SQL语句删除一个表。
? 简单的Insert语句。INSERT INTO T_Person(ld,Name,Age)VALUES(1,’jim’,20) 使用SQL语句往表里填数据。
? SQL主要分DDL(数据定义语言)和DML(数据操作语言)两类。Create Table 、Drop Table、After Table等属于DDL, Select、Insert、Delete、Update 等属于DML。
主键的选择策略:
? SQLServer中两种常用的主键数据类型:int(或bigint)+标识列(又称自动增长字段); uniqueidentifier(又称Guid、UUID)
? 用标识能实现字段自增可以避免并发等问题,不要开发人员控制自增。用标识列的字段在Insert的时候不用指定主键的值。将字段的“是标识列”设置为“是”,一个表只能有一个标志列。
? Guid算法是一种可以产生唯一标识的高效算法,它使用网卡MAC、地址、纳秒级时间、芯片ID码等算出来的,这样保证每次生成的GUID永远都不会重复,无论是同一个计算机上还是不同的计算机。在公元3400年以前产生的GUID与任何其他产生过的GUID都不相同。 SQLServer中生
成GUID的函数newid(),.Net中生成GUID的方法:Guid.NewGuid(),返回是Guid类型。
? 在SQLServer中,可以调用下列指令产生一个GUID码。
select newId();
? int自增字段的优点:占用空间小,无需开发人员干预、易读;缺点:效率低; 数据库导入导出的时候很痛苦。
? GUID的优点:效率高、数据导入导出方便; 缺点:占用空间大、不易读。
? 业界主流倾向于使用GUID。
数据的插入:
? into Person1(Name,Age)values(‘Lilei’,20) *红色部分可省略。
?使用GUID做主键,插入数据方法:
? 可以给字段默认值,如果Guid类型主键的默认值设定为newid()就会自动生成。(很少这么干)
? 如果插入的行中有些字段的值不确定,那么Insert的时候不指定那些列即可。
数据的更新:
? 更新一个列:UPDATE T_Person SET Age=30
? 更新多个列:UPDATE Person SET Age=30,Name=’Lucky’
? UPDATE Person01 SET Age=Age+1 在字段本身的基础上+1
? UPDATE Person01 SET NickName=N青年人
where Age30
上式为一个带过滤语句的 更新语句。Age>30 时 NickName=’青年人’
? SQL语句中 [等于] 条件 就用“=”而非C#中的“==”。
? SQL语句中 [不等于]条件 可用“!=” 也可“”.
? SQL语句中 [或] 用“or” 而非C#中的“||” ,[且] and [非] not
?
数据的删除:
? 删除表中全部数据:DELETE From T_Person
? Delete只删除数据,表还在,和Drop Table不同,后者连表都删除。
? Delete也可以带where子句删除一部分数据: from T_Person Where
Age>20
?
数据检索:
? 简单的数据检索:select *from Person03 *表所有字段
? 如仅检索其中个别字段:select FName,FAge from Person03
? 使用条件:
select * from Person03
where FSalary5000 (工资小于5K)
? select的更多用法:
select getdate(); 获取当前时间
select newid(); 获取一个GUID码
select 1+2 3
select @@Version 查询软件版本
select count(*)from Person03 查有多少条数据
select count(*)from Person03
where FSalary>5000 查询工资大于5000的人数
SQL聚合函数:
select max(FSalary)from Person03 查最高工资
select min(FSalary)from Person03 查最低工资
select avg(FSalary)from Person03 平均工资
select sum(FSalary)from Person03 求和
数据排序:
按(年龄)排排列所有员工:
select * from Person03
order by FAge
(年龄)按升、降序排列
select * from Person03
order by FAge asc/DESC
年龄并列的人,工资再按升序排列
select * from Person03
order by FAge desc,FSalary asc //可用,分隔多个条件,越往前越优先。
order by 可放在where 子句后:
select * from Person03
where FAge>=25
order by FAge desc,FSalary asc
:25岁以上的员工,按年龄降序排列,年龄相同的,工资按升序排列。
通配符过滤:
? 通配符过滤使用LIKE。
? 单字符匹配的通配符为半角下划线“_” ,它匹配单个出现的字符。
? 多字符匹配的通配符为半角百分号“%”它匹配任意次数(零或多个)出现的任意字符。“k%”匹配以“k”开头、任意长度的字符串。
select * from Person03
where FName like %y;
空值处理:
? 数据库中,一个列如果没有指定值,那么值就为null,这个null和C#中的null不同,数据库中的null表示“不知道”,而不是表示没有。因此 select null+1结果还是null,因为“不知道”加1的结果还是“不知道”。SQL中使用is null is not null 来判断。
例:下面是一个错误的子句
select * from Person03 //此举本意是想查询FName为空的数据
where FName=null //“不知道”的意思!
正确的方式为:
select * from Person03
where FName is null
另:不为空的数据为:
select * from Person03
where FName is not null
? isnull(expression,value):如果expression不为空则返回expression,否则,返回value。例:
select isnull (FName,佚名)as 姓名from Person03
多值匹配:
select * from Person03 //查询年龄为3、25、28的成员
where FAge=23 or FAge=25 or FAge=28
另一种方法:
select * from Person03
where FAge in (23,25,28)
select * from Person03
where FAge>20 and FAge30 //取年龄20-30间的成员
另一种简便方法:
select * from Person03
where FAge between 27 and 30
数据分组:
? 按照年龄分组,统计各个年龄段的人数:
select FAge,count(*)from Person03
group by FAge
? Group by 子句必须放到where语句之后。
select FAge,count(*)from Person03
where FAge>=25
group by FAge
? 没出现在Group by 子句中的列是不能放到select 语句后的列名列表中的。(聚合函数中除外)聚合函数:sum avg max min
select FAge, FName,count(*)from Person03
group by FAge //错误用法
select FAge,max(FSalary),count(*)from Person03
group by FAge //正确用法 ,句中虚线部分使用聚合函数
Having语句:
? 聚合函数是不能出现在where子句中的。
select FAge,count(*) from Person03
where count(*)>1
group by FAge //错误的。用意是想检索按年龄分组,人员为1的组不显示,怎么解决才好?
se人间没有永恒的夜晚,世界没有永恒的冬天。