一、数据库概述

l   DBMS(DataBase Management System,数据库管理系统)和数据库数据库Schema有两种含义,一种是概念上的Schema,指的是一组DDL语句集,该语句集完整地描述了数据库的结构。还有一种是物理上的Schema,指的是数据库中的一个名字空间,它包含一组表、视图和存储过程等命名对象MSSQLServer、Oracle等某种DBMS;存放一堆数据表的一个分类(Catalog )。

l   不同品牌的DBMS有自己的不同的特点:

l   MYSQL(速度很快,适合对数据要求并不是十分严谨的地方,去掉了很多中小型企业中不常用的功能),

l   MSSQLServer(与.net结合很好,只能运行在windows平台下,大数据量、大交易量表现并不十分好),

l   DB2(大型)、Oracle(大型),

l   Access(文件)、 SQLite(极其轻量级数据库)、Sybase等。对于开发人员来讲,大同小异

l   SQL(语言)<>SQLServer<>MSSQLServer。最常见的错误。

l   SQL是英文Structured Query Language的缩写,意思为结构化查询语言

l   除了Access、SQLServerCE、SQLite等文件型数据库之外,大部分数据库都需要数据库服务器才能运行。学习、开发时是连接本机的数据库,上线运行时是数据库运行在单独的服务器。

二、主键

主键就是数据行的唯一标识。不会重复的列才能当主键。一个表可以没有主键,但是会非常难以处理,因此没有特殊理由表都要设定主键

主键有两种选用策略:业务主键和逻辑主键。业务主键是使用有业务意义的字段做主键,比如身份证号、银行账号等;逻辑主键是使用没有任何业务意义的字段做主键,完全给程序看的,业务人员不会看的数据。因为很难保证业务主键不会重复(身份证号重复)、不会变化(帐号升位),因此推荐用逻辑主键

======================================================

主键的作用:唯一标识表中的一条记录。

选择多列同时作为一个主键→组合主键(复合主键).(一般不建议采用)

组合主键-复合主键(多列同时作为主键)—不推荐

唯一的。不能为空值

不经常变化的(稳定)比较稳定的列(不经常更新的,最好是建好以后再也不更新。)

大量字符串的列不适合作为主键

优先选择单列作为主键(避免使用组合主键)

优先使用逻辑主键(没有意义的),避免使用业务主键(身份证号、工号等。)


上图中编号跟商品编号适合做主键

三、外键

所谓外键就是在A表中引用B表中的主键,那么此时A表叫外键表,B表叫主键表,两表之间联系通过主键和外键联系。

数据冗余,占用空间多,但保证了数据的安全性。

存储空间的浪费

更新数据的时候需要将表中所有原数据都更新。

四、基本语句

 

1、建立数据库

--drop database StudentPerformanceSystem
CREATEDATABASE StudentPerformanceSystem--创建数据库
ONPRIMARY
(
NAME=StudentPerformanceSystem_data,--         mdf文件的名字
FILENAME='E:\DataBase\StudentPerformanceSystem.mdf',--绝对路径
SIZE=5MB,--                            初始大小
FILEGROWTH=1MB--                   自增长量
--MAXSIZE=100MB                    最大容量
)
LOGON—事物日志文件
(
NAME=StudentPerformanceSystem_log,--         ldf文件的名字
FILENAME='E:\DataBase\StudentPerformanceSystem.ldf',--绝对路径
SIZE=3MB,--                     初始大小
FILEGROWTH=10%--                   自增长量
--MAXSIZE=100MB                       最大容量
)

2、建立表

CREATETABLE UserList--管理员账户列表
(
autoIdINT IDENTITY(1,1) PRIMARY KEY,--主键,自增长1
userNameVARCHAR(18) NOT NULL,
userPwdVARCHAR(16) NOT NULL,
userNiChengNVARCHAR(20),
quanXianINT NOT NULL,
errorTimesINT ,
localDateTimeDATETIME
)
--drop table student
createtable Student
(--创建学生信息表
sId int identity(1,1) primary key,--自动编号
sClassId int not null,  --班级外键
sName nvarchar(50) not null,
sAge int not null,
sNo numeric(18,0),--身份证号,十八位数字,小数为
sSex char(2) not null,
sEmail varchar(50)
)

3、select

SELECT*FROMUserList

select * --表示选择要查询表中的哪些列(*表示全部)from--查询的数据来源于那个表

print '您好现在是北京时间'+convert(char(20),getdate());=========

select '您好现在是' as 问好,GETDATE() as 时间===============

SELECT*FROMUserList WHEREautoId=@cinID

where条件--where部分表示要查询表中的哪些行(用来筛选哪些行需要显示)

Select* from Person和select* From person一样(不敏感)

查询前10条数据 select top 10 * from Customers

查询前百分之十  selecttop 10 percent* from Customers

表达式要加括号  selecttop (10*2) percent * from Customers

selecttop 5 * from Products order by UnitPrice desc--默认是升序,这样表示降序
selecttop 5 * from Products order by UnitPrice asc--默认升序(可不写)
============================================================
selecttop 5 * from TblStudent order by tSAge—年龄最小的5个学生
selecttop 10 percent* from TblStudent order by tSAge desc—获得年纪最大的10%学生
===========================================================================
selectdistinct *from T1--关键字作用是已经查询后的结果再去除重复
Selectdistinct sname,sage,sgender from T1
=======================================================
Selecttop 5 sName,sAge from student
Selecttop 30 percentsName,sAge from student非四舍五入,返回最大整数返回3
selecttSId,tSName+tSGender+tSAddress as 信息from TblStudent----查询信息合集

--模糊查询

select* from tblstudent
--找张什么什么的--%表示任意字符多个字
select* from TblStudent where tSName like '张%'
--(-)表示任意字符一次
select* from TblStudent where tSName like '张__'
select* from TblStudent where tSName like '张%'and LEN(tSName)=3
select* from TblStudent where tSName like '张[a-z]_'
select* from TblStudent where tSName like '张[0-9]_‘
select * from TblStudent where tSName like'张[^0-9]_‘
select* from TblStudent where tSName like '张%[%]%‘
select * from TblStudent where tSName like'张%[_]%'

4、insert

l  Insert into 表名(列名1,列名2)values(值1,值2)

l 插入数据时,只向某些列插入数据:如果插入的行中有些字段的值不确定,那么Insert的时候不指定那些列即可。

Insert into 表(列1)  values(值1)

l 自动编号列不需要手动插入。【set identity_insert表名 on】

l 主键的值不能重复,插入数据的时候注意单引号问题

l Insert into 表(列) select 列1,列2 union

l Insert into 表(列) select 列1,列2 from 表

•    INSERTINTO Class(className,studentNumber) VALUES('空间信息与数字技术一班',19)

•    INSERTINTO UserList(userName,userPwd,quanXian,errorTimes,localDateTime) VALUES('admin','202cb962ac59075b964b07152d234b70',1,0,'2015-01-29 15:42:00')

N前缀:N’字符串’,在服务器上执行的代码中(例如在存储过程和触发器中)显示的 Unicode 字符串常量必须以大写字母 N 为前缀。即使所引用的列已定义为 Unicode 类型,也应如此。如果不使用 N 前缀,字符串将转换为数据库的默认代码页。这可能导致不识别某些字符。

5、delete

删除表中全部数据:deletefromstudent。

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

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

truncate tablestudent 的作用与delete from student一样,都是删除student表中的全部数据,区别在于:

1.truncate语句非常高效。由于truncate操作采用按最小方式来记录日志,所以效率非常高。对于数百万条数据使用truncate删除只要几秒钟,而使用delete则可能耗费几小时。

2.truncate语句会把表中的自动编号重置为默认值。

3.truncate语句不触发delete触发器。

4.delete fromTbStudent where tSGender=0—删除性别为0的drop tabletstudent—表没了

5.使用delete from 表名与truancate table 表名,都能把表中的数据全部删除

6. 通过truncate语句删除表中的数据的时候,只能一次性都清空,不能根据条件来删除,而delete可以根据条件来删除。

6、update

•   向表中更新一列

•    •update表名set 列1=值1,列2=值2

•   更新一部分数据:

•   update 表名set 列1=值1,列2=值2  where列名=值

•   用where语句表示只更新列名是值的行

•   注意SQL中等于判断用单个=,而不是==。

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

updateStudentset sAge = sAge +—所有人的年龄加1

updateStudentset sAge=30 where sName='华佗'or sAge<25 ,or相当于C#中的||(或者)

--更新性别,没加条件

updateTbStudentset tSGender=0;

优先级:notand or

用小括号可以改变优先级.

updateTblStudentset tSAge=tSAge+1

Null代表不知道

UPDATETblStudentset tsname=tsname+'^-^' where tsage<20 and tsgender='男'

7、goto语句

语句的作用:

向 SQL Server 实用工具发出一批 Transact-SQL语句结束的信号。

将SQL语句分段执行。

不是Transact-SQL 语句;它是sqlcmd 和osql 实用工具以及SQL Server Management Studio 代码编辑器识别的命令。

实用工具将GO 解释为应该向SQL Server 实例发送当前批Transact-SQL 语句的信号。当前批语句由上一GO 命令后输入的所有语句组成,如果是第一条GO 命令,则由即席会话或脚本开始后输入的所有语句组成。

命令和Transact-SQL 语句不能在同一行中。但在GO 命令行中可包含注释。

用户必须遵照使用批处理的规则。例如,在批处理中的第一条语句后执行任何存储过程必须包含EXECUTE 关键字。局部(用户定义)变量的作用域限制在一个批处理中,不可在GO 命令后引用。

8、alert

手动增加约束

--手动删除一列(删除EmpAddress列)

altertable Employeesdrop column EmpAddress

--手动增加一列(增加一列EmpAddr varchar(1000))

altertable Employeesadd EmpAddr11 varchar(500),AA int ,bb varchar(10)

--手动修改一下EmpEmail的数据类型(varchar(200))

altertable Employeesalter column EmpAddr varchar(1000)

--为EmpId增加一个主键约束

altertable Employeesadd constraint PK_EmpId primary key(EmpId)

--非空约束,为EmpName增加一个非空约束

altertable Employeesalter column EmpName varchar(50) not  null

--为EmpName增加一个唯一约束

altertable Employeesadd constraint UQ_EmpName unique(EmpName)

--为性别增加一个默认约束,默认为'男'

altertable Employeesadd constraint DF_EmpGender default('男')for EmpGender

--为年龄增加一个检查约束:年龄必须在-120岁之间,含岁与岁。

altertable Employeesadd constraint CK_EmpAge check(EmpAge >=0 and EmpAge<=120)

--创建一个部门表,然后为Employee表增加一个DepId列。

altertable Employeesadd DeptId int

--增加外键约束

altertable Employeesadd constraint FK_DeptId_DepId foreignkey(DeptId) references Department(DepId)