MS Sql server 2008 学习笔记

时间:2022-12-15 05:55:05

数据库中常用的概念

Sql本身是一个服务器,没有界面,Management Studio  只是一个SQL Server管理工具而已,不是服务器。

Sql server 在管理工具下面的服务SQL Server (MSSQLSERVER)

主键:就是唯一定位的一条数据的列。不会有重复的列才能当主键, 一个表可以没有主键,但是会非常难以处理,因此建议都要设主键。

两种主键:

业务主键:使用有业务意义的字段做主键,如身份证号、职工编号。

逻辑主键:使用任何没有意义的字段做主键,完全给程序看的。推荐用逻辑主键

常识:

1、sql语句中字符串是用单引号

2、 sql语句大小写不敏感的。

分类 备注和说明 类型 说明
二进制数据类型 存储非子符和文本的数据 Image 可用来存储图像
文本数据类型 字符数据包括任意字母、符号或数字字符的组合

Char

Varchar

Nchar

Nvarchar

Text

Ntext

固定长度的非 Unicode 字符数据

可变长度非 Unicode 数据

固定长度的 Unicode 数据

可变长度 Unicode 数据

存储长文本信息(指针,2G)保存的是字节数据

存储可变长度的长文本

日期和时间 日期和时间在单引号内输入 Datetime 日期和时间
数字数据 该数据仅包含数字,包括正数、负数以及分数

int  smallint

float  real

整数

数字

货币数据类型 用于十进制货币值 Money  
Bit数据类型 表示是/否的数据 Bit 存储布尔数据类型

Guid 算法是一种可以产生唯一标识的高效算法,它使用网卡MAC、地址、纳秒级时间、芯片ID码等算出来的,这样保证每次生成的GUID永远不会重复,无论是同一个计算机上还是不同的计算机。/

数据库的类型uniqueidentifier

SQLServer中生成GUID的函数newid(),.Net中生成Guid的方法:Guid.NewGuid()

use 数据库名,打开该数据库,有时候在新建查询时没选择对应的数据库,所以用这条语句。或者手动选择该数据库

Insert语句可以省略表名后的列名,但是不推荐

如果插入的行中有些字段的值不确定,那么Insert的时候不指定那些列即可。

当不提供字段名时,插入值需要加入默认值defaulf 也就默认值用defaulf表示

插入数据  insert  into 表名 (字段名) values  (值)

例:insert into student ([name],age,sex,birthday) values ('张三',21,1,1995-02-26)

字段与值一一对应

1. 新建一个表

语法:create table 表名 (字段1 类型1,字段2 类型2,……)

添加主键 primart key (字段)

例:

CREATE TABLE T_Employee     --创建一个表表名是T_Employee

(FNumber VARCHAR(20),   --字段 类型

FName VARCHAR(20),

FAge INT,

FSalary NUMERIC(10,2),

PRIMARY KEY (FNumber)); -- 设置主键

2. 删除整个表:Drop Table 表名

更新

语法:update Table set col=value,col2=value2 where ...

update 表名 set 字段 = 值,字段2 = 值2 where 条件

更新一个列:UPDATE T_Person Set Age=30

更新多个列:UPDATE T_Person Set Age=30,Name=‘tom’

更新一部分数据: UPDATE T_Person Set Age=30 where Name=‘tom’,用where语句表示只更新Name是’tom’的行,注意SQL中等于判断用单个=,而不是==

Where中还可以使用复杂的逻辑判断UPDATE T_Person Set Age=30 where Name=‘tom’ or Age<25,or相当于C#中的||(或者)

update Person1 set NickName=N'二十岁'  在字符前面加上N代表使用Unicode编号

where (Age>20 and Age<30) or(Age=80)

Where中可以使用的其他逻辑运算符:or(或)、and(与)、not(非)、<、>、>=、<=、!=(或<>)等

3. 修改表

添加字段

语法:alter  table 表名 add 字段 类型

例:ALTER TABLE T_Employee ADD FSubCompany VARCHAR(20);

4. 删除

语法:delete [from] Table where col=data

delete [from] 表名 价目where 条件

删除表中全部数据:delete from 表名

Delete只是删除数据,表还在,和Drop Table不同。

Delete 也可以带where子句来删除一部分数据:DELETE FROM T_Person WHERE FAge > 20

删除表中全部的数据

1、  Delete 表名  删除之后的id继续上一次的值后。

2、runcate Table 表名  同时还原标识 也就是说设置默认的id从1开始

5. 检索

语法: select col,col2[,*] from Table where ...

            Select 字段 from 表名 where 条件

简单的数据检索 :SELECT * FROM表名

只检索需要的列 :SELECT 字段 表名

列别名:SELECT FNumber AS 编号,FName AS 姓名,FAge AS Age111 FROM T_Employee

使用where检索符合条件的数据:SELECT 字段 FROM 表名 WHERE 条件。故事:新员工的数据检索噩梦。

还可以检索不与任何表关联的数据:select 1+1;select newid();select getdate();

6. 函数

1、   聚合函数

最大值 MAX(字段)

最小值 MIN(字段)

平均值 AVG (字段)

求和   SUM (字段)

数量  COUNT(*)

2、   数字函数

执行备注中的代码

  ABS() :求绝对值。

CEILING():舍入到最大整数 。3.33将被舍入为4、2.89将被舍入为3、-3.61将被舍入为-3。 Ceiling→天花板

FLOOR():舍入到最小整数。3.33将被舍入为3、2.89将被舍入为2、-3.61将被舍入为-4。 Floor→地板。

ROUND():四舍五入。舍入到“离我半径最近的数” 。Round→“半径”。例:Round(3.1425,2)。

解释:3.1425是在四舍五入的值,2是精确的位数

3、   字符串函数

LEN() :计算字符串长度   求字符

DATALENGTH(): 计算字节长度  求字节  一个汉字两个字节

                     例:

                     select len('123是数字') --字符

select datalength('123是数字') --字节

注意:text类型保存的是字节数据,所以不能用len()

LOWER():  转小写

UPPER () :转大写

LTRIM():  字符串左侧的空格去掉

RTRIM () :字符串右侧的空格去掉

例:LTRIM(RTRIM('         bb        '))

SUBSTRING(string,start_position,length)

参数:string为主字符串,

start_position为子字符串在主字符串中的起始位置,从1开始

length为子字符串的最大长度。

例:SELECT  SUBSTRING('abcdef111',2,3)

4、   日期函数

GETDATE() :取得当前日期时间

DATEADD (datepart , number, date ),计算当前的时间前或后

参数:datepart 计量单位  值:year、month、day

number 增量 正数是后,负数是前

date 日期

例:--获得当前日期前年的时间

select dateadd(month,1,getdate())

DATEDIFF ( datepart , startdate , enddate ) :计算两个日期之间的差额。 参数:datepart  计量单位

  startdate  起始日期

enddate  结束日期

例:统计不同工龄的员工的个数:

select DateDiff(year,FInDate,getdate()),count(*) from T_Employee group by DateDiff(year,FInDate,getdate())

DATEPART (datepart,date):返回一个日期的特定部分

参数:datepart  计量单位

date   日期

统计员工的入职年份个数:

select DatePart(year,FInDate),count(*) from T_Employee

group by DatePart(year,FInDate)

5、   类型转换函数

CAST ( expression AS data_type)

参数:expression 要转换的值

data_type  要转换的类型

例:select cast(right('abc2011-02-24',10) as datetime)

CONVERT ( data_type, expression)

参数:expression 要转换的值

data_type  要转换的类型

例:select convert(datetime,right('2012-11-24',10))

6、空值处理函数

ISNULL(expression,value) :

参数:如果expression值为null,刚返回value的值

7、   CASE函数

单值判断,相当于switch case

例:select fsalary, case

when fsalary < 4500 then '初级'

when fsalary < 8000 then '中级'

when fsalary > 8000 then '高级'

end as '等级'

from t_employee

注:then 后面除了给常量之外,还可以给列

7. 数据排序

ORDER BY子句位于SELECT语句的末尾,它允许指定按照一个列或者多个列进行排序,

升序  ASC(从小到大排列)默认

降序  DESC(从大到小排列)。

按照年龄从大到小排序,如果年龄相同则按照工资从大到小排序 :SELECT * FROM  T_Employee ORDER BY FAge DESC,FSalary DESC(多个排序条件)

ORDER BY子句要放到WHERE子句之后

例:       SELECT * FROM T_Employee WHERE FAge>23 ORDER BY FAge DESC,FSalary DESC

8. 通配符过滤

通配符过滤关键字使用LIKE 。

单字符匹配的通配符为半角下划线“_”,它匹配单个出现的字符。

例:以任意字符开头,剩余部分为“erry”

SELECT * FROM T_Employee WHERE FName LIKE '_erry'

多字符匹配的通配符为半角百分号“%”,它匹配任意次数(零或多个)出现的任意字符。 “k%”匹配以“k”开头、任意长度的字符串

例:检索姓名中包含字母“n”的员工信息

SELECT * FROM T_Employee WHERE FName LIKE '%n%'

通配符 解释 示例
‘_’ 一个字符 A Like 'C_'
% 任意长度的字符串 B Like 'CO_%'
[ ] 括号中所指定范围内的一个字符 C Like '9W0[1-2]'
[^] 不在括号中所指定范围内的一个字符 D Like ‘%[A-D][^1-2]'

-任意一个字符

%                  任意多个字符

'[^a]%a%'  非a开头,中间含有a的任意多个字符

'[a-d]'    匹配a到d之间任意一个字符

9. 空值处理

数据库中,一个列如果没有指定值,那么值就为null,这个null和C#中的null不一样,数据库中的null表示“不知道”,而不是表示没有

因此select null+1结果是null,因为“不知道”加1的结果还是“不知道”。

SQL中使用is null、is not null来进行空值判断:

例:

SELECT * FROM T_Employee WHERE FNAME is null ;FNAME为空的值

SELECT * FROM T_Employee WHERE FNAME is not null ;fname不是空值

10. 多值匹配  使用关键字

要删除多条记录怎么办?

例:Delete T_Employee where FId in (21,22)

BETWEEN  包括该值

例:SELECT * FROM T_Employee WHERE FAGE BETWEEN 23 AND 27

等价于:SELECT * FROM T_Employee WHERE FAGE>=23 AND FAGE <=27

11.  数据分组

按照年龄进行分组统计各个年龄段的人数:

SELECT FAge,Count(*) FROM T_Employee GROUP BY Fage

GROUP BY子句必须放到WHERE语句的之后

没有出现在GROUP BY子句中的列是不能放到SELECT语句后的列名列表中的 (聚合函数中除外)

多条件查询:多条件分组时,将条件相加,看是否相等,如果相等,就为一组

例:select fage,ftest,count(*) from t_employee group by fage,ftest

Having语句(分组后查询条件)

分组统计之后查询条件不能用where 而要用having语句,Having要位于Group By之后

例:--进年龄分组统计,同时ftese数量等于的

select fage,count(fage) from t_employee group by fage having count(ftest) = 2

12.  限制结果集行数  top

--查询前行记录

select top 3 * from T_Employee order by fsalary desc

--分页查询

select top 3 * from t_Employee where fnumber not in (

select top 3 fnumber  from T_Employee order by fsalary desc

)order by fsalary desc

13.  去掉数据重复  distinct

例:select distinct fdepartment from t_employee

--多个列时和group by 一样,按照多个列组合值判断是否重复

select distinct fdepartment,fsubcompany from t_employee

14. 联合结果集 UNION 

基本的原则:每个结果集必须有相同的列数;每个结果集的列必须类型相容

1. UNION合并两个查询结果集,并且将其中完全重复的数据行合并为一条

2. Union因为要进行重复值扫描,所以效率低,因此如果不是确定要合并重复行

那么就用UNION ALL

Union 和Union All 的区别

Union         合并重复项,并且去掉重复项

Union All 合并重复项,不去掉重复项

问题:

在sql server 2008 中出现了“阻止保存要求重新创建表的更改”

解决办法:工具->选项->-Designers>取消“阻止保存要求重新创建表的更改”

行号和自动换行

工具—>选项—>文本编辑器—>纯文本 右边就有行号和文本编辑器

那些都是浮云,只有本领才是王道