SQL Server简介:
主流数据库: SQL Server(微软),Oracle(甲骨文公司),IBM DB2, MySQL
Oracle数据库系统是世界上最好的数据库系统
数据库管理系统(DataBase Management System ,DBMS):是一个系统软件
主要功能是维护数据库,并有效地访问数据库中各个部分的数据
数据库系统( DataBase System,DBS ):是一个实际可运行的系统,由软件、数据库、数据库管理员组成
数据库管理员(DataBase Administrator)
系统数据库:
1;Master数据库
记录sql server 所有系统级别信息包括
所有登录账户和系统配置
所有其他数据库和数据库文件的位置
sql server 的初始化
2;Temp数据库
保存所有临时表和临时存储过程
3;Model数据库
可用于在系统上创建的所有数据库模板
4;Msdb数据库
数据库的备份和还原 记录、警报
5;Resource数据库
是一个只读数据库他包含了SQL Server 中所有的系统对象、
是隐藏了的数据库
sa (Super Administrator)超级管理员
数据库的安全性:
第一级服务器:登录 1. window身份验证(与登录系统的用户一致)
2.SQL Server身份验证(与系统用户无关)验证密码
二级数据库:数据库用户(与登录相关)
三级数据:表及列的操作安全
安全性设置方法:
1.先新建登录(服务器的安全性),再在相应的数据库创建用户
2.在创建登录时,同时设置相应数据库的角色
数据库的管理和维护
点击相应的数据库右键--任务--分离
1, 分离和附加数据库
移动数据库:从一个服务器移至另一个服务器
分离数据库:脱离服务器,文件可以拷贝
附加数据库;关联到服务器中,服务器可以对其管理
数据库管理系统(DataBase Management System,DBMS):提供管理数据库的程序(服务)
数据库:包含一个主数据文件(Primary Database File),mdf ,,包含n个次数据文件.ndf(Secondary Database File) ,至少一个日志文件 .ldf(Trannsaction Log File)
数据存放在表中。
2:备份和还原数据库
SQL Server提供了四种数据库备份方式
1,完全备份:备份整个数据库的所有内容,包括事务日志( Trannsaction Log File ),
2, 差异备份:只备份上次完整备份后更改的数据部分
3.事物日志备份:只备份事物日志里的内容
4.?文件和文件组备份:如果数据库创建了多个数据库文件或文件组,只备份数据库中的这些文件的某些文件
做法: 点击相应的数据库右键--任务--备份
如果不想使用系统默认的地址,删除他并选择添加
数据库就是表的集合,逻辑上数据库包括数据表、存储表间关系的表及各种关系对象。
数据表每一行对应一个实体,通常叫作一条记录,每一列称为“字段”。
SQL Server Management Studio是数据库管理的集成环境,简称“SSMS”,或管理器
数据完整性:
1.实体完整性约束:要求表中的每一行数据都反映不同的实体,不能存在相同的数据行。通过索引、唯一约束、主键约束或标识列属性。
2.域完整性约束:指给定列输入的有效性。通过限制数据类型、检查约束、输入格式、外键约束、默认值、非空约束等
3.在输入或删除数据行时,引用完整性约束用来保持表之间已定义的关系。通过主键与外键之间的引用关系来实现。
4.自定义完整性约束用来定义特定的规则。
引用完整性:主外键关系
域完整性:有一个范围
实体完整性:主键不能为空 , 通过索引、唯一约束、主键约束或标识列属性可以实现表的实体完整性
列的数据类型
Unicode 是一种在计算机上使用的字符编码,是全球统一并且唯一的二进制编码
从存储方式上,nvarchar是按字符存储的,而 varchar是按字节存储的;
从存储量上考虑, varchar比较节省空间,因为存储大小为字节的实际长度,而 nvarchar是双 字节
在使用上,如果存储内容都是英文字符而没有汉字等其他语言符号,建议使用varchar;含有汉字的使用nvarchar,因为nvarchar是使用Unicode编码,即统一的字符编码标准,会减少乱码的出现几率;
有n的是Unicode编码,有var的是可变长度的,否则是固定的非编码的
variable [ˈveəriəbl] 变量
二进制数据类型 | 储存非字符和文本的数据 | binary | 固定的 |
| | varbinary | 可变的 |
| Varbinary(max) | image | 储存图像 |
文本数据类型 | 字母、字符、数字字符的组合 | char | 固定非Unicode字符数据 |
| | varchar | 可变非Unicode字符数据 |
| | nchar | 固定Unicode字符数据 |
| | nvarchar | 可变Unicode字符数据 |
| | text | 储存长文本信息 |
| | ntext | 储存可变的长文本信息 |
日期和时间数据类型 | 日期和时间 | date | 日期 |
| | datetime | 日期和时间 |
| | time | 时间 |
数字数据类型 | 正数、负数及分数 | int | 整数 |
| | smallint | |
| | tinyint | |
| | bigint | |
| | float | 浮点数 |
| | real | |
货币数据类型 | 精确到小数点后4位数字 | money | |
bit数据类型 | 表示是否的数据,0和1 | bit | 储存布尔数据类型 |
数据放在表中
设计表:考虑设计的完整性
1.类的数据类型
2.非空约束
3.主键约束:primary key 唯一描述一条记录(唯一、非空)
一张表只能有一个主键(单列、多列)
4.默认值;default 当新增记录时,不输入时,自动填入默认值
5.标识列:identity 自动编号,不能输入、修改,自动生成;种子:起始号;增量;自增量
该编号一旦使用(报错、删除),该号不能使用 数值型(int)
6.外键约束:foreign key(实现表与表之间的关系)
从表的外键值依赖于主表的主键值、唯一键
7.检查约束:check
限制该列的取值范围
-- : SQL Server 注释 or/and/not
密码长度 : len(LoginPsw)>=6
邮箱必须包含@:email like '%@%' %:代表任意多个字符
8.唯一约束:unique(索引、键)唯一标识一条记录,唯一,可空
第8章用SQL语句操作数据
SQL语言是数据库能够识别的通用的指令集
SQL的全称是“结构化查询语言(Structured Query Language)”,是1974年由Boyce( 博伊斯 )和Chamberlin( 钱伯林 )提出来的
SQL语言的组成:
Manipulation (记忆这个单词:妈妈和你扑上去操控遥控)
DML(Data Manipulation Language数据操作语言,也称数据操纵语言):用来插入、修改和删除数据库中的数据,如INSERT / UPDATE /DELETE等
DDL(Data Definition Language,数据定义语言):用来建立数据库、数据库对象和定义其列,大部分以Create开头的命令,如Create table/create view/ drop table等
DQL(Data Query Language,数据查询语言):用来对数据库的数据进行查询,如select等
DCL(Data Control Language,数据控制语言):用来控制数据库组件的存取许可、存取权限等,如crant /revoke
使用T-SQL插入数据
insert语法
insert [into] 表名[(列名列表)]
values(值列表)
insert into test(name,age,sex)
values('张三',20,'男')
/*
注意:1.列列表和值列表一一对应,(顺序,类型)直插入一行
2.列列表不能包含标识列
3.必须包含非空无默认值
4.违法约束,新增失败
5.有默认列,可以不输入,也可以用default
6.省略列列表,值列表必须按结构顺序列出,但不包含标识列
insert into Student values('S1201302003',default,'王五','男',1,'13912345678',default,'1995-5-3',null)
*/
/*
insert select语法(将已有的表的数据添加到指定表中)可插入多行
insert [ into ]表1(列列表)
select 列列表 from 表2
--添加多行数据
insert into 通讯录
select '刘德华','234334','34@gsd' union
select '张学友','2343324','34@gsd'
--在已有的表中添加多行值(使用insert into 新表 select语句)
insert into 通讯录(姓名,电话,邮箱) --列名不用引号
select StudentName,Phone,Email from Student
--在新表中添加多行数据
select 语句 into 新表 from 始表
select identity(int,1,1) AS ID, StudentName,Phone,Email into 新通讯录 from Student
select identity(int,1,1) AS ID, StudentName as 姓名,Phone as 电话,Email 邮箱 into 新通讯录1 from Student
select * from 通讯录
下面的这个比较常用
insert into 表(列列表)
select 值列表 union
--复制表中结构
把a的表结构复制到a1表,1=2不复制数据,如果要复制数据,就不要whereselect * into a1 from a where 1=2
select top 0 * into a1 from a
注意:这种方式
不能复制主键、索引
等信息
/*
select into语法(将现有表中的数据添加到新表中,新表结构与原表对应)
select 列列表 into 新表 from 现有表
注意:新表不存在,现有表已存在
*/
/*
insert union语法:将一组值记录添加到表中(乱序)
insert into 表(列列表)
select 值列表 union
........
select 值列表
*/
更新数据Update
update 表名 set 列名=更新值 [where 条件] 多个条件用and 连接
--更新数据
Update Student set Email='未知@'
where Email is null or Email='' --为空
is not null --非空
Update Result set StudentResult=StudentResult+5
where SubjectId=1 and StudentResult<60 and ExamDate='2013-9-13'
delete 语法
--删除数据(写日志、标识符不重置)
--delete [from] 表名 [where 条件]
不能删除主键值被其他数据表引用的数据行
delete from Student
where StudentNo='S1201302002'
--删除表(删除表中所有记录)性能高,标识列重置,但先删除关系,一般删除测试数据
truncate table 用来删除表中的所有行,但是表的结构、列、约束、索引等都不会被改动、不能用于有外键约束引用的表、不能有where条件
truncate table Student
|---- 表示删除student表中的所有记录行
--性能高 标识列重置、删除关系
delete from Student --性能低 标识列不重置
数据的导入导出
|----任务---导出数据
关键步骤:选择对应的表-----编辑映射
第9章数据查询基础
比较运算符:=,< , >, <=, >=,<>不等于,!=
重命名可以用as 也可以不写
也可以用= 比如:
select 姓名=name from student
查询空值用 is(not) null
在查询中使用常量列:例如学生的学校名称都为 广东工业大学
select name ,sex,' 广东工业大学' as 学校名称 from student
使用top关键字---查询限制的行,前5名
查询排序
asc(ascending)升序
order by desc(descending降序)---一定是放在最后
各时间类型范围、精度一览表:
数据类型 | 时间范围 | 精度 |
datetime | 1753-01-01到9999-12-31 00:00:00 到 23:59:59.997 | 3.33毫秒 |
smalldatetime | 1900-01-01 到 2079-06-06 00:00:00 到 23:59:1 | 分钟 |
date | 0001-01-01 到 9999-12-31 | 天 |
time | 00:00:00.0000000 到 23:59:59.9999999 | 100 纳秒 |
datetime2 | 0001-01-01 到 9999-12-31 00:00:00 到 23:59:59.9999999 | 100 纳秒 |
datetimeoffset | 0001-01-01 到 9999-12-31 00:00:00 到 23:59:59.9999999 -14:00 到 +14:00 | 100 纳秒 |
各时间类型表达式一览表:
数据类型 | 输出 |
time | 12:35:29. 1234567 |
date | 2007-05-08 |
smalldatetime | 2007-05-08 12:35:00 |
datetime | 2007-05-08 12:35:29.123 |
datetime2 | 2007-05-08 12:35:29. 1234567 |
datetimeoffset | 2007-05-08 12:35:29.1234567 +12:15 |
举例如下:
select CONVERT(varchar, getdate(), 120 )
2004-09-12 11:06:08
select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':','')
20040912110608
select CONVERT(varchar(12) , getdate(), 111 )
2004/09/12
select CONVERT(varchar(12) , getdate(), 112 )
20040912
select CONVERT(varchar(12) , getdate(), 102 )
2004.09.12
select CONVERT(varchar(12) , getdate(), 101 )
09/12/2004
select CONVERT(varchar(12) , getdate(), 103 )
12/09/2004
select CONVERT(varchar(12) , getdate(), 104 )
12.09.2004
select CONVERT(varchar(12) , getdate(), 105 )
12-09-2004
select CONVERT(varchar(12) , getdate(), 106 )
12 09 2004
select CONVERT(varchar(12) , getdate(), 107 )
09 12, 2004
select CONVERT(varchar(12) , getdate(), 108 )
11:06:08
select CONVERT(varchar(12) , getdate(), 109 )
09 12 2004 1
select CONVERT(varchar(12) , getdate(), 110 )
09-12-2004
select CONVERT(varchar(12) , getdate(), 113 )
12 09 2004 1
select CONVERT(varchar(12) , getdate(), 114 )
11:06:08.177
select getdate()
结果:2003-12-28 16:52:00.107
select convert(char(8),getdate(),112)
结果:20031228
select convert(char(8),getdate(),108)
结果:16:52:00
select convert(char(8),getdate(),112)
指日期格式
规则如下:
1 101 美国 mm/dd/yyyy
2 102 ANSI yy.mm.dd
3 103 英国/法国 dd/mm/yy
4 104 德国 dd.mm.yy
5 105 意大利 dd-mm-yy
6 106 - dd mon yy
7 107 - mon dd, yy
8 108 - hh:mm:ss
- 9 或 109 (*) 默认值 + 毫秒 mon dd yyyy hh:mi:ss:mmmAM(或 PM)
10 110 美国 mm-dd-yy
11 111 日本 yy/mm/dd
12 112 ISO yymmdd
- 13 或 113 (*) 欧洲默认值 + 毫秒 dd mon yyyy hh:mm:ss:mmm(24h)
14 114 - hh:mi:ss:mmm(24h)
- 20 或 120 (*) ODBC 规范 yyyy-mm-dd hh:mm:ss[.fff]
- 21 或 121 (*) ODBC 规范(带毫秒) yyyy-mm-dd hh:mm:ss[.fff]
- 126(***) ISO8601 yyyy-mm-dd Thh:mm:ss:mmm(不含空格)
- 130* 科威特 dd mon yyyy hh:mi:ss:mmmAM
- 131* 科威特 dd/mm/yy hh:mi:ss:mmmAM
关于Emaker中字段的格式转换和字段间的运算代码可以加到属性里的“格式转换(读出)”和“格式转换(写入)”,table字段设定里的“字段”位置也可以灵活加函数。比如:'AF'+ID 或者ID+'/'+PWD ,convert(varchar(50),F1) ,
convert(int,%)-19110000 (读出)
convert(char(8),convert(int,%)+19110000) (写入)
实现行的合计运算等等。加入:%系统变量%,则是调用在Emaker 系统中设定的系统变量。
F1 (帮助)
查询语句 :
select
select <列名>/*
from <表名>
[where <条件>]
[ order by <排列的列名> asc/desc] --默认asc 升序排
--查询邮箱为空
select top 5 * from Student where Email is null or Email='' order by GradeId desc
--添加学校名:‘广东工业大学’
select '
广东工业大学
'
as
SchoolName,*
from
Student
select * from student
字符串函数---记住下标从1开始
函数名 | 描述 | 举例 |
charindex | 用来寻找一个指定的字符串在另一个字符中的起始位置 | select charindex('name','My name is lo',1) |
len | 返回字符串长度 | select Len('SQL Server') 返回 10 |
upper | 将传递给他的字符串转换成大写 | select upper('sql server') 返回 SQL SERVER |
Ltrim /Rtrim | 清除字符串左边或右边的空格 | select Ltrim('sdd ') |
right | 从字符串右边返回指定数目的字符 | select right('dfasdfs',3) 3为长度 |
left | | |
replace | 代替一个字符串中的字符 | select replace('我是男的','男','女') 返回: 我是女的 |
stuff | 在一个字符串中,删除指定长度的字符,并插入一个新的字符串 | select stuff('abcdefg',2,3,'我的世界') 返回: a我的世界efg |
where StudentName like '张%'
select * from Student
where GradeId in('1','2')
select sex+'生 '+StudentName+' 住在'+address as 信息 from Student
--查询排序
select top 5 * from Result order by
StudentResult desc
--两重排序
select* from Result where SubjectId=1 order by ExamDate asc,StudentResult desc
select Email,CHARINDEX('@',Email,1) from Student
select StudentName,left(StudentName,1) as 性,right(StudentName,Len(StudentName)-1) 名 from Student
日期函数:
函数名 | 描述 | 举例 |
getdate() | 取得当前的系统日期 | select getdate() 返回: 2015-11-1 12:00:00 |
dateadd() | 请指定的数值添加到指定的日期部分后的日期 | select dateadd(mm,4,'01/01/2009') 返回: 01/05/2009 |
datediff() | 两个日期之间的指定日期部分的间隔 | select datediff(dd,'2009-2-3','2009-2-6') 返回;3 |
datename() | 日期中指定日期部分的字符串形式 | select datename(dw,'2009-3-4') 返回; 星期三 |
datepass() | 日期中的指定日期部分的整数形式 | select datename(day,'2009-3-4') 返回:3 |
| | |
日期部分参数及其缩写
日期部分参数 | 缩写 | 日期部分参数 | 缩写 |
year() | yy/yyyy | weekday | dw,w |
quarter (一个季度) | qq/q | hour | hh |
month() | mm/m | minute | mi/n |
dayofyear() | dy/y | second | ss/s |
day() | dd/d | millisecond | ms |
week | wk/ww | | |
数字函数
函数名 | 描述 | 举例 |
rand | 返回从0到1之间的随机float值 | select rand() |
abs | 取数值表达式的绝对值 | select abs(-33) |
ceiling | 向上取数,最小整数 | select ceiling(33.3) |
floor | 向下取数,最大整数 | |
round | 四舍五入的数 | select round(239.33) |
sign | 整数返回-1,负数返回+1,0返回0 | select sign(-3) |
sqrt | 取浮点表达式的平方根 | select sqrt(9) |
| | |
系统函数
函数名 | 描述 | 举例 |
convert | 用来转变数据类型 | |
current_user | 返回当前用户的姓名 | |
dataLength | 返回当前表达式的字节数 | select dataLengthh('中国A联盟') 返回:5 |
host_name | 返回当前用户所登录的计算机名称 | select host_name() |
user_name | 从给定的用户ID返回用户名 | select user_name(1) |
system_user | 返回当前所登陆的用户名称 | select system_user |
日期函数:
getdate() -->系统函数
dateadd(间隔单位,增量,时间) -->时间
datediff(间隔单位,开始时间,结束时间)
datePart(间隔单位,时间)
datename(单位,时间) --》字符串
year(时间) ,month(时间) ,day(时间)
数学函数
rand() .rand(种子)--》0--1
种子相同,产生的随机数相同,没种子,产生的都不同
select rand(400),rand(400)
select rand(),rand()
--四舍五入:round(数值,精确位数)
select round(234.355,-2) --负数表示整数位
--幂值 power
select power(3,4)
--向上取值 ceiling
select ceiling(23.4),ceiling(-33.3) 24,-33
--向下取值 floor
系统函数
--类型转换
1.convert(新类型,日期设置[日期格式])
select '我今年'+convert(nvarchar(10),19)+'岁' 类型相同才能运算
--只查询日期,不显示时间
select convert(nvarchar(10),getdate(),111) 111(2015/2/2)、120(2015-3-3)、112(20130303)、114(10:22:23)。。。日期格式(只能在日期格式中使用)
2.cast(表达式 as 新类型) (没有日期格式)
--系统变量
select @@version --SQL Severt 版本
select @@language --语言
select @@servername --服务器名
select @@servicename --服务名
瑟道ddfff
多列合并成新的列(同类型)
select sex+'生 '+StudentName+' 住在'+address as 信息 from Student
前三名
select s.StudentNo ,s.StudentName,r.StudentResult from Student as S,Result as R where S.StudentNo=R.StudentNo and studentresult in(select distinct top 3 StudentResult from Result order by StudentResult desc) order by studentResult desc
第10章模糊查询和聚合函数
like+通配符
_ :一个字符 A like 'c_'
% :任意字符 A like 'c_%'
[]:括号中所指定范围的一个字符 A like 'c_%[1-9]'[]
[^]:不包含括号中所指定范围的一个字符
(not)bteween 20 and 40
|----20和40不可倒置,否则出错
使用in在列举的值中进行查询
(not)in('广州','上海')
聚合函数:
sum()、avg()、只针对数值类型,对于null也算一个数
max()、min()、
count(),参数一般放主键和*号,忽略
第11章连接和分组查询
使用group by 进行分组查询
group by 中一定要包含所有非聚合的列名,而且列名不能写别名
多列分组查询:
select count(*),sex, grade from student group by grade ,sex order by grade
使用having 子句进行分组筛选
简单来说having子句将聚合出来的东西进行筛选
总结:
select ....from ....where....group by....having....order by ......
多表连接查询的分类
|----内连接查询:使用“=”或“<>不等于”
inner join on 关联字段
|----------外连接查询:至少返回一个表中的所有记录,在外连接中参与连接的表有主从表之分,
以主表的每行数据匹配从表的数据列,将符合条件的数据返回到结果集中,对那些不符合条件的列将被填上null值
|------左外连接
左外连接查询的结果集包含left join 子句中指定的左表(主表)的所有行,没有右表对应的列则为null
关键字:left join ....on 或 left outer join .....on进行表之间的关联
|------右外连接:反之