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一下就好