当前位置: 代码迷 >> SQL >> Sql_Server基础知识小结
  详细解决方案

Sql_Server基础知识小结

热度:119   发布时间:2016-05-05 10:14:03.0
Sql_Server基础知识总结
--------------------------------------第一章? Sql Server数据库基础-----------------------------------------------
1,sql server的历史:
?? ? 第一代数据库:网状与层次模型
?? ? 第二代数据库:关系模型 (sql server属于关系模型数据库)
?? ? 第三代数据库:对象模型
2,实体:客观存在的可以被描述的事物叫实体
3,冗余:存在重复的数据
?? ? 消除冗余的办法:分类存储
4,完整性:指的是数据的准确性
5,系统的内置数据库:
?? ? (1)master:存储着系统信息。
?? ? (2)model:所有数据库的模板
?? ? (3)msdb:sql server代理服务存储系统任务以及自动化作业使用的数据库。
?? ? (4)tempdb:存放临时数据的数据库,包括临时表,临时存储过程等。
6,数据库文件后缀
?? ? mdf:主数据库文件,一个数据库只可以有一个主数据库文件,但可以有多个次数据库文件
?? ? ldf:事物日志文件,用于存储对数据库的操作
?? ? ndf:次要数据库文件
7,创建数据库用户并设置权限
?? ? (1)权限:用户对服务器的操作权限
?? ? ?? ? sysadmin:可以在sql server中执行任何操作
?? ? ?? ? serveradmin:可以设置服务器范围的配置选项,关闭服务器。
?? ? ?? ? setupadmin:可以管理链接服务器和启动过程
?? ? ?? ? securityadmin:可以管理登录和create database 权限,还可以读取错误日志和更改密码
?? ? ?? ? processadmin:可以管理在sql server中运行的进程
?? ? ?? ? dbcreator:可以创建、更改和除去数据库
?? ? ?? ? diskadmin:可以管理磁盘文件
?? ? ?? ? bulkadmin:可以执行 bulk insert 语句
?? ? (2)用户映射:指定用户对指定数据库的操作权限
?? ? db_owner:拥有数据库的所有许可
?? ? db_securityadmin:能建立架构、更改角色
?? ? db_accessadmin:能添加删除用户、组或成员
?? ? db_backupoperator:能备份数据库
?? ? db_datareader:能从数据库中读取数据
?? ? db_datawriter:能修改数据库表中的数据
?? ? db_ddladmin:能添加、修改或删除数据库对象
?? ? db_denydatareader:不能从数据库表中读数据
?? ? db_denydatawriter:不能修改数据库表中的数据
?? ? public 维护默认的权限
-------------------------------------第二章?? 数据库表的创建与管理-------------------------------------
1,数据表的完整性
?? ? (1)实体完整性:保证表中每行数据都是唯一的,不能重复存在
?? ? (2)域完整性:某一列数据的完整性
?? ? (3)引用完整性:保证数据先在主表中存在,然后才能出现在子表。
?? ? (4)自定义完整性:自己定义的完整性
2,sql server中常用的数据类型
?? ? (1)二进制数据类型:
?? ? ?? ? binary??? 固定长度的二进制数据
?? ? ?? ? varbinary? 可变长度的二进制数据
?? ? ?? ? image???? 可用来存储图像
?? ? (2)文本数据类型
?? ? ?? ? char? 固定长度的字符串,最大长度为8000个字符(一个字符占一个字节)
?? ? ?? ? varchar?? 可变长度的字符串
?? ? ?? ? nchar???? 固定长度的字符串(一个字符占两个字节)
?? ? ?? ? nvarchar? 可变长度的字符串(一个字符占两个字节)
?? ? ?? ? text???? 长文本信息
?? ? ?? ? ntext???? 可变长度的文本信息
?? ? (3)日期类型
?? ? ?? ? datetime?? 日期和时间
?? ? (4)整数
?? ? ?? ? int ,smalint,tinyint,bigint
?? ? (5)浮点数
?? ? ?? ? decimal,float,real
?? ? (6),货币数据类型
?? ? ?? ? money
?? ? (7),bit数据类型
?? ? ?? ? 表示是/否? 1代表true 0代表false
3,约束
?? ? 主键约束,默认值约束,标识列,检查约束,外键约束
--------------------------------------第三章? T-SQL编程--------------------------------------------
1,T-SQL的组成:
?? ? (1)DML(数据操作语言):增删改查数据操作
?? ? (2)DDL(数据定义语言):用来建立数据库、数据库对象和定义
?? ? (3)DCL(数据控制语言):用来控制存取许可、存取权限等
2,T-SQL中的条件表达式和逻辑运算符
?? ? (1),比较运算符
?? ? ?? ? =?? 等于
?? ? ?? ? >?? 大于
?? ? ?? ? <?? 小于
?? ? ?? ? >=? 大于等于
?? ? ?? ? <=? 小于等于
?? ? ?? ? <>? 不等于
?? ? ?? ? !?? 取反
?? ? (2)通配符
?? ? ?? ? _?? 任意一个字符
?? ? ?? ? %?? 任意长度的字符
?? ? ?? ? []? 括号内指定范围的一个字符(只包括数字和字母)
?? ? ?? ? [^] 不在括号内指定的范围内的一个字符
?? ? (3)逻辑表达式
?? ? ?? ? and?? 并且
?? ? ?? ? or??? 或者
?? ? ?? ? not?? 非
?? ? (4)模糊查询(like)
?? ? ?? ? select * form 表名
?? ? ?? ? where 列名 like '%许超%'
?? ? (5)len()函数
?? ? ?? ? 获取长度
3,数据基本操作
?? ? 增:
?? ? ?? ? 单行:insert into 表名(列名) values(值)
?? ? ?? ? 多行:insert into 表名(列名)
?? ? ?? ? select 值? union
?? ? ?? ? select 值? union
?? ? ?? ? select 值 ?
?? ? 删:
?? ? ?? ? delete from 表名? where? 条件
?? ? 改:
?? ? ?? ? update 表名? set? 列名=新值 where 条件
?? ? 查:
?? ? ?? ? select * from 表名? where 条件
4,截断表
?? ? trun cate table 表名
?? ? 速度快,不可恢复
5,数据备份
?? ? (1),
?? ? ?? ? select 列名? into? 新表名?? from 源表名?? (只会备份表结构不会备份表约束)
?? ? (2),把现有数据复制到另一个现有的表,必须先建好一章新的表
?? ? ?? ? insert into 新表名 (新列名)? select 源列名?? from? 源表名
----------------------------------第四章,T-SQL查询基础--------------------------------------
1,和并列、起别名、查空行、常量列
?? ? 合并列和起别名:
?? ? ?? ? select 列名+列名 as 别名和别名 from 表名
?? ? 查空行和查无空行:
?? ? ?? ? select * from 表名? where 列名 is null or 列名=''
?? ? ?? ? select * form 表名? where is not null and 列名<>''
?? ? 常量列:
?? ? ?? ? select * form 列名1 as 别名,列名2 as 别名,新值 as 新列名?? from 表名
2,限制返回行数(top)
?? ? select top 3 * from 表名
3,排序(order by)
?? ? asc 升序(默认)
?? ? desc 倒叙
?? ? select * from 表名? where 条件? ?
?? ? order by? 列名,可加多列? 顺序(ase或desc)
4,消除重复列(distinct)
?? ? select distinct? 列名? from? 表名
5,函数
?? ? (1)字符串函数
?? ? ?? ? CharIndex()? 用来寻找指定的字符串在另一个字符串中的起始位置。????? 例:select charIndex('china','inchina',1),返回3
?? ? ?? ? len()??????? 返回指定字符串的长度??????????????????????????????? 例:select len('ab'),返回2
?? ? ?? ? Upper()????? 将指定的字符串全部大写?????????????????????????????? 例:select upper('ab'),输出AB
?? ? ?? ? lower()????? 将指定的字符串全部大写?????????????????????????????? 例:select lower('AB'),输出ab
?? ? ?? ? Ltrim()????? 清除字符串左边空格?????????????????????????????????? 例:select Ltrim(' ab'),输出ab
?? ? ?? ? Rtrim()????? 清除字符串右边空格?????????????????????????????????? 例:select Rtrim('ab '),输出ab
?? ? ?? ? right()????? 从字符串右边返回指定数目的字符串????????????????????? 例:select right('abacd',2),返回cd
?? ? ?? ? left()?????? 从字符串左边返回指定数目的字符串????????????????????? 例:select left('abacd',2),返回ab
?? ? ?? ? replace()??? 替换字符串中的字符??????????????????????????????????? 例:select replace('china','a','ese'),输出chinese
?? ? ?? ? stuff()????? 在一个字符串中删除指定长度的字符,并在该位置插入一个新的字符?? 例:select stuff('china',2,3,'-'),返回c-a
?? ? ?? ? substring()? 提取字符串??????????????????????????????????????????????? 例:select substring('abcd',2,1),返回b
?? ? (2)日期函数
?? ? ?? ? getdate()??? 获取当前系统日期?? 例:select dateadd(dd,10,getdate())? 输出:2015-01-21 20:22:21.783
?? ? ?? ? dateadd()??? 在日期的指定部分加上或减去指定的值?????? 例:select dateadd(dd,10,'2015-01-21')?? 输出:2015-01-31
?? ? ?? ? datediff()?? 获取两个日期之间指定部分之差???????????? 例:select datediff(yy,'2014-8-15','2015-01-21')? 输出:1
?? ? ?? ? datename()?? 获取日期中指定的部分,返回字符串类型???? 例:select datename(mm,'2015-01-21')??? 输出:01
?? ? ?? ? datepart()?? 获取日期中指定的部分,返回int类型??????? 例:select datepart(yy,'2015-01-21')??? 输出:2015
?? ? ?? ? year()?????? 获取日期中年的部分?????????????????????? 例:select year('2015-01-21')??????????? 输出:2015
?? ? ?? ? month()????? 获取日期中月的部分?????????????????????? 例:select month'2015-01-21')??????? 输出:01
?? ? ?? ? day()??????? 获取日期中日的部分?????????????????????? 例:select day('2015-01-21')????????? 输出:21
注:
?? ? 日期的指定部分:
?? ? ?? ? yy 年
?? ? ?? ? mm 月
?? ? ?? ? dd 日
?? ? ?? ? hh 小时
?? ? ?? ? mi 分钟
?? ? ?? ? ss 秒
?? ? ?? ? ms 毫秒
?? ? ?? ? dw 星期
?? ? ?? ? sql server中日期的格式必须为 2015-01-21 或 2015/01/21
?? ? (3)数学函数
?? ? ?? ? abs() 获取数值表达式的绝对值????????????????? 例:select abs(-2)? 输出:2
?? ? ?? ? ceiling()? 返回大于或等于所给数字的最小整数??? 例:select ceiling(2) 输出:2??? select ceiling(2.1) 输出:3
?? ? ?? ? floor()??? 返回小于或等于指定表达式的最大整数?? 例:select floor(3)? 输出3???? select floor(3.1)?? 输出:3
?? ? ?? ? power()??? 取数值表达式的幂值?????????????????? 例:select power(5,2)? 输出:25?? 注:power(底数,幂数)
?? ? ?? ? round()??? 将数值表达式四舍五入为指定精度?????? 例:select? round(56.765,1) 输出:56.8
?? ? ?? ? sign()???? 正数返回1,负数返回-1,0返回0??????? 例:select sign(-55)? 输出:-1
?? ? ?? ? sqrt()???? 去浮点表达式的平方根??????????????? 例:select sqrt(9)??? 输出:3
?? ? (4)系统函数
?? ? ?? ? convert()? 用来转变数据类型??? 例:select '他的年龄是'+convert(varchar(20),userAge) from users?? 注:convert(目标类型,'需要转换的值')
?? ? ?? ? current_user?? 返回登录的用户名和类型
?? ? ?? ? host_name????? 返回当前登录用户的计算机名
?? ? ?? ? user_name???? 返回当前登录的用户名类型
?? ? ?? ? system_user??? 返回当前登录sql server的用户名
?? ? ?? ? datalength? 返回指定的字节数???? 例:select datelength('中国A盟')
???? ?
-------------------------------------第五章 T-SQL 高级查询------------------------------------------------------
1,模糊查询(like)
?? ? select *
?? ? from 表名? where name like? '许%'??????????? //查询所有以许开头的数据
2,查询指定范围内的数据(between and)
?? ? select * from 表名? where id? between 5? and?? 10???? //查询从id从5到10的所有数据,包括5和10
3,使用in在指定集合内查询
?? ? select * from 表名 where name in('许超','李四')????? //查询name为许超,或者李四的所有信息
4,聚合函数
?? ? (1)sum()???? 求和,只能用于数值类型的列
?? ? (2)avg()???? 求平均数,只能用于数值类型的列
?? ? (3)max()???? 求最大值,能用于数值类型和字符类型的列
?? ? (4)min()???? 求最小值,能用于数值类型和字符类型的列
?? ? (5)count()?? 统计行数,能用于数值类型和字符类型的列
5,分组查询(group by)
?? ? 规则:
?? ? ?? ? (1)如果select后除了聚合函数还有其他列,就必须使用group by
?? ? ?? ? (2)group by后放除了聚合函数的其他列,都要添加到group by 后面
?? ? ?? ? (2)where 条件必须写在group by之前,在group by 之后添加条件用 having
?? ? ?? ? (3)order by 必须在group by后面使用
?? ? ?? ? select stateid as '状态',sum(userpoint) as '积分' from users
?? ? ?? ? where 条件
?? ? ?? ? group by stateid
6,使用having分组筛选
?? ? //使用having分组筛选,总积分大于200的用户和人数,并倒叙排序
?? ? select username as '用户',count(*) as '人数' from users
?? ? group by username
?? ? having sum(userpoint)>200
?? ? order by count(*) desc
7,多表连接
?? ? (1)内连接
?? ? ?? ? 1>第一种:在where子句中指定连接条件,实现多表连接
?? ? ?? ? select a.Statename,b.Rolename,c.username? from state as a,Roleinfo as b,users as c
?? ? ?? ? where a.stateid=c.stateid and b.reoleid=c.roleid
?? ? ?? ? 2>第二种:在from子句使用 join...no,实现两表连接
?? ? ?? ? select a.StateName,b.username from
?? ? ?? ? state as a inner join users as b on a.stateid=b.stateid
?? ? (2)外连接
?? ? ?? ? 1>左外连接? left join
?? ? ?? ? 左表中的数据全部显示
?? ? ?? ? 右表中有关系的连成一行
?? ? ?? ? 没有关系的添null
?? ? 例:
?? ? select a.StateName,b.username from
?? ? state as a left join users as b on a.stateid=b.stateid
?? ? 2>右外连接? right join
?? ? ?? ? 右表中的数据全部显示
?? ? ?? ? 左表中有对应的拼成一行
?? ? ?? ? 没有对应的补null
?? ? 例:
?? ? select a.StateName,b.username from
?? ? state as a right join users as b on a.stateid=b.stateid
?? ? 3>完全外连接? full join
?? ? ?? ? 左表中的数据全部显示
?? ? ?? ? 右表中的数据全部显示
?? ? ?? ? 有对应的拼成一行
?? ? ?? ? 没有对应的补null
?? ? 例:
?? ? select a.StateName,b.username from
?? ? state as a full join users as b on a.stateid=b.stateid
?? ? (3)交叉连接? cross join
?? ? ?? ? 左表中的数据和右表中的数据每次都拼接
?? ? 例:
?? ? select a.StateName,b.username from
?? ? state as a cross join users as b
  相关解决方案