Fork me on GitHub

李可

导航

T-SQL DBMS

dbo 默认架构schema

从一个数据库操作另个数据库的表的时候,要select * from 数据库.dbo.biao          

表名前面的dbo是一个默认架构schema,一个架构还有多张表,用来区分表格数据优化,权限管理

分离附加

数据库文件粘贴复制时,要先在sql中分离关闭数据库连接。

数据库附加时,右击任务附加,只会显示mdf,自动加载ldf文件。

注意:附加时长出的问题,一般出权限问题,就在mdf和ldf文件右击属性安全用户添加everyone 并在权限中对勾上

 

设计 编辑前200行

元祖:一行数据称为

08改不了,05可以改。列名字的更改:工具-选项-design-阻止更改

类型

 

 

sql联级丛书

二进制,image

字符串nvarchar()char() nchar varchar

var可变长度,没有就是固定长度 nvar  后面可以max2^31-1 存储的位置不同了

比如char(非unicode字1-8000)  char(10)    10个字节   10个数字1234567890  5个字 ABCDE  如果12存入后面就会自动补全有8个空格存入,因为固定。varchar也是字节数,但是不会自动补全

varchar比char检索效率高,数据优化,char需要 去掉空格。 存储的时候的char比varchar高,空间固定  手机号可以

n就是unicode编码,unicode字符一个字符占2个字节

nchar(unicode字1-4000) unicode字符一个字符占2个字节 nvarchar()   里面的1 2 3数字也占2个字节,因为也是unicode编码

date08时候加进来 少用

常用日期类型datetime,当成字符串来赋值2015-12-25 00:00:00.000

钱money 当成整数或者小数。

int smallint  real float

bool类型,设计器只能用true和false,SQL语句也可以,同时也可以用0  1代表,最后显示也是false和true   

 

主键Primary Key:一,区分不同的元祖(一条数据) 设计-右击列设为主键

改之后,要把修改后的选项卡关闭,然后再处理,因为选项卡保存的是改之前的状态。

业务主键:比如name  身份证号 是一个数据的一个部分。 业务主键可能重复

逻辑主键:单独加上的一列,一般为数字,也有字符串GUID   自动增长   设计 id-是否标示  是增量1 种子1

 

外键张表间关联Foreign Key,在外表的一列是主键的这列。

主键表含有主键的表

外键表含有外键(一列的数据在别的表中是主键,在此表这列就是外键)的表

 

SQL大小写一样,字符串用‘’单引号  双引号报错

DCL数据库控制语言 GRANT授权某用户 REVOKE取消授权    权限控制

DML数据库管理语言 增删查改

DDL 数据库定义语言建库 建表

 

use 数据库 go

自动增长的那列,不用赋值。

语句分号;结束    -- 注释      /* ssss*/

delete from biao where id=

子查询:单值子查询和多值子查询

独立标量(单值)子查询:就是一个select返回一个值。例如id。将这个查询出来的一个值,作为另个select查询的where条件。通常两张表。

独立多值子查询:返回多个值,例如id。这些值在另一个查询中当做where条件。因为返回多个值,所以where条件中在这些值中不能用”=“,而是用“in”。

 

字段:一张表中,要留空余的字段和和isdel是否删除的字段。

--解释 选中tap键向右移动

= like in is

 

where条件注意项:

1>2

多条件,括号的优先级调配。用(条件)and or(条件)

处理日期:查询某年某时间的匹配项。有一些函数,来处理。

当前时间getdate()year(时间字段) month(时间) day(时间)得到对应的年月日

例如:(year(getdate())-year(时间)=20)

时间:select id from biao where DATEDIFF()

模糊条件 like   not like  会全表扫描,木有优化。

%:任意个 任意字符

_任意一个字符

[]任意一个在括号的字符    假如值匹配_   用[_]

[^]任意一个不是括号内的字符

where (name like ”李%“) and (sex='女')

between and

in

带条件查询的条件补充

多少多少之间的用between and

select * from 表 where 字段 between 18 and 25   包含18和25

查询id 为 1 2 3的数据   not in

select * from 表 where 字段 in (1,2,3)

 

as:就是一数据的名字1,字段 as 别名(as可以省略) 2,别名 = 字段  注意别名在前

 

select可以显示数据和运算结果。

select ‘李可’  例如:select ‘李可’ ,* from 表   会在没行数据前都加上‘李可’

select getdate(), 2+3  

从左到右运算,变量。同一级别 select 1  +'1'     显示2

 

top order by放在select 后面,其他字段前面,后面不要加”,“top(50),括号可以省略    --desc倒序 asc 默认升序

1,筛选排名前多少或者多少百分比2,把这些前多少数据进行排序

select top (100) * from where sex='女' order by fenshu desc

select top (100) percent * from where sex='女' order by fenshu desc

 数据库是基于集合概念,就有无规律特征,top 100数据 结果不一定完全一样,而MSSQL按照存入数据的顺序来筛选。

结果集:数据有一个数据集概念,通过没有order by查询得到的结果,成为结果集

游标cursor:只有order by的时候。不具备一些集合的特征,派生表  表表达式 公共表表达式 视图 存储过程 结果集 子查询 都不能使用游标,因为游标不是集合

1,使用order by查出的的数据就不是(集合),有了顺序的结果,成为游标。

top 和order by连用时候是结果集

筛选和排序()。因为排序有可能是一个无序的结果。比如:一张表有10个10岁的,top 5个时候order by年龄 ,可能从这10个中随机选,所以是无序的。所以是结果集。

2,查询数据的一种索引方式。

 

distinct 去除重复的数据,多集(有重复的数据)转换成单集,但是并木有修改数据库的东西和top一样是”修饰”字段的。

select distinct 字段 from 表 

 

*代替字段不好的原因:

1,当数据库更新的时候,假如多了几个字段,但是依然是*,就会出现错误

2,从优化的角度,查询这张表的话会先从数据库中查询这张表有多少字段,然后再查询。多了一步。不优化。

 

聚合函数:汇总的意思。select 聚合函数代替*了做汇总。总数,平均,最大,最小。一般起个名字 as哦!

MAX(字段)   MIN(字段) AVG(字段)  SUM(字段)  COUNT(*)  只是一行值。所以select 聚合后不能再跟一列出现多行数据字段。

avg(分数)   不会计入null的个数和值,不考虑null。

count(分数)不会计入个数,但是count(*)会计入

 

null  

1,select中isnull(字段,123)如果数据为null  则被替换成123,有数据就不替换。数据类型一定相同。

select isnull(字段,123)from

2,在where 条件中 不能用=  而是用is null 或者is not null

在sql中三值逻辑  不是true的话,可能是false 还可能是null

=

>

<

>=

<=

<>(!=)不等于

!>(<=)不大于 小于等于

!<(>=)不小于 大于等于

select *from 表名 where sex <> '女'   可能为男,也可能为null

null表示不知道,不论加减乘除都为null

等价,永远不会有数据 

select * from 表名  where 字段 = null

select * from 表名  where 字段 <> null

 

group by数据分组  和order by 位置一样放在最后      查各班人数

一般和聚合函数搭配使用。查询按某个字段分组后汇总信息。

select banji , count(*)  from biao where sex = ‘女’ group by banji   因为为汇总信息只有一行,所以select后不能是含有多行数据的字段。

 

 

执行顺序

from选择数据源

where对数据源筛选

group by对筛选后的数据汇总

having 对汇总的数据再进行筛选

select后执行顺序distinct top

order  by得到集合或者cursor

 

所以不能在where使用count(*)

查询名字出现2次或者两次以上的女人

select name ,count(*)

from biao

where  sex='女' and count(*)>=2         有对应的分组后的的数据再进行筛选就是having

group by name

having count(*)>=2

having用来分组后对数据筛选  和top 位置不一样也是筛选

 

筛选 where  having  top  位置不同哦

 

ADO.NET是一组类库

FWGH SDTO

SQL-Sever执行逻辑流程  书籍:SQL-Sever技术内幕2005存储内幕  深入理解SQL-Sever2008

服务器上的DBMS数据库管理系统 里面几个引擎,这几大引擎通力合作。 

sql语句-->DBMS(关系引擎(语法解析器(检查语法报错)-->优化器--> 执行器得到编译好的sql语句)--  存储引擎 )-->只经过FROM WHERE数据文件-->DBMS(得到set虚拟表(也是结果集)group having->set虚拟表-->distinct top-->set虚拟表-->set或者cursor-->应用程序)

事务:sql语句每个动作都是一个事务

每个过程都会得到一张set 虚拟表(结果集),供作下一过程的数据源 

 

 UNION

多集 联合结果集

UNION并集INTERSECT交集 EXCEPT差集   两个select之后的两张表的合并   看联级丛书

union和union all(并集中可以包含重复数据(两行数据完全一样叫做重复,叫做多集),效率高于union)

select '平均' as ‘说明’,avg(fen_01), avg(fen_02), avg(fen_03) from biao where id=1          --起列明用第一个表的as后列名字

union all                                                                                                                    --允许多集

select '总分', sum(fen_01), sum(fen_02), sum(fen_03) from biao where id=1                   --数据类型要相同

说明 fen_01 fen_02 fen_03
平均      
总分      

 

insert  select 

插入数据的时候可以用 insert  select ,此时的select 代替了values

insert into 表(列) select 查询    --一次性插入多个数据,将一个结果集插入

insert into 表(列) select 列     --每次只能插入一行数据     这个歌select是一个显示方法,得到的结果集,所以可以插入一行的数据

一次性插入多数据(用union)

可以使用union将结果集联合后得到一个联合结果集插入。

2008以前2005的用法,08的替代方法是“表值构造函数”  

values (值),(值),(值)   --这些值是一个虚拟的表,操作是”原子性“的,不可分割。如果给这个表添加约束,只要有一个插入的某个值不符合这个约束,这张虚拟表都不能插入。

insert into biao(列1,列2,列3,)                                              --select * from (values(1,值),(2,值),(3,值))as biaoming(列名,列名)

select 列1,列2,列3 union

select 列1,列2,列3 

 

字符串函数  日期函数  类型转化函数 

都是用于select 之后用于显示。select nchar(25105),LEN(N'12345'),datalength(N'12345'),lower(‘abDc’),upper('abDc') ,ltrim('   abc '),rtrim('  abc   ')

--我 转换成字符  5字符个数(默认去掉里面的空格不算)  10  字节长度   unicode编码(系统函数) 10 小写 大写 去掉左空格 右面空格   ltrim(rtrim('  adc '))去掉左右空格

substring(字符串,开始位置,长度)不是从0开始,而是从1开始。

 

日期时间函数 year()  month() day()

dateadd(部分,增量,时间)在这是时间上的那个部分增多少select getdate(),dateadd(YY,10,getdate())   得到也是个时间yy--mm-dd

 yy  mm  d getdate()同时运行,时间一样

datediff(单位,开始时间,结束时间)  得到时间长度

select datediff(d,‘2015-1-16 09:00:00.000’,'2015-6-25 12.00.00.999')        hour minute millisecond

 

类型转换函数 比如在union中数据类型要相同

1cast(数据 as 类型)    

2convert(类型 数据)

针对时间类型,有第三个参数控制格式  select convert(nvarchar(10), getdate(),20)

查联机丛书上的类型格式代码 一般都是110  客户端 拿到这个时间,只需split一下就好

posted on 2015-01-15 15:14  李可在江湖  阅读(391)  评论(0编辑  收藏  举报