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等文件型数据库之外,大部分数据库都需要数据库服务器才能运行。学习、开发时是连接本机的数据库,上线运行时是数据库运行在单独的服务器。
二、主键
主键就是数据行的唯一标识。不会重复的列才能当主键。一个表可以没有主键,但是会非常难以处理,因此没有特殊理由表都要设定主键
主键有两种选用策略:业务主键和逻辑主键。业务主键是使用有业务意义的字段做主键,比如身份证号、银行账号等;逻辑主键是使用没有任何业务意义的字段做主键,完全给程序看的,业务人员不会看的数据。因为很难保证业务主键不会重复(身份证号重复)、不会变化(帐号升位),因此推荐用逻辑主键。
======================================================
1.主键的作用:唯一标识表中的一条记录。
2.选择多列同时作为一个主键→组合主键(复合主键).(一般不建议采用)
组合主键-复合主键(多列同时作为主键)—不推荐
1.唯一的。不能为空值
2.不经常变化的(稳定)比较稳定的列(不经常更新的,最好是建好以后再也不更新。)
3.大量字符串的列不适合作为主键
4.优先选择单列作为主键(避免使用组合主键)
5.优先使用逻辑主键(没有意义的),避免使用业务主键(身份证号、工号等。)
上图中编号跟商品编号适合做主键
三、外键
所谓外键就是在A表中引用B表中的主键,那么此时A表叫外键表,B表叫主键表,两表之间联系通过主键和外键联系。
数据冗余,占用空间多,但保证了数据的安全性。
1.存储空间的浪费
2.更新数据的时候需要将表中所有原数据都更新。
四、基本语句
1、建立数据库
--drop database StudentPerformanceSystem
CREATE DATABASE StudentPerformanceSystem--创建数据库
ON PRIMARY
(
NAME=StudentPerformanceSystem_data, -- mdf文件的名字
FILENAME='E:\DataBase\StudentPerformanceSystem.mdf',--绝对路径
SIZE=5MB,-- 初始大小
FILEGROWTH=1MB-- 自增长量
--MAXSIZE=100MB 最大容量
)
LOG ON—事物日志文件
(
NAME=StudentPerformanceSystem_log,-- ldf文件的名字
FILENAME='E:\DataBase\StudentPerformanceSystem.ldf',--绝对路径
SIZE=3MB,-- 初始大小
FILEGROWTH=10%-- 自增长量
--MAXSIZE=100MB 最大容量
)
2、建立表
CREATE TABLE UserList--管理员账户列表
(
autoId INT IDENTITY(1,1) PRIMARY KEY,--主键,自增长1
userName VARCHAR(18) NOT NULL,
userPwd VARCHAR(16) NOT NULL,
userNiCheng NVARCHAR(20),
quanXian INT NOT NULL,
errorTimes INT ,
localDateTime DATETIME
)
--drop table student
create table 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*FROM UserList
select * --表示选择要查询表中的哪些列(*表示全部)from 表--查询的数据来源于那个表
print '您好现在是北京时间'+convert(char(20),getdate());=========
select '您好现在是' as 问好,GETDATE() as 时间===============
SELECT*FROM UserList WHEREautoId=@cinID
where 条件--where部分表示要查询表中的哪些行(用来筛选哪些行需要显示)
Select * from Person 和select * From person 一样(不敏感)
查询 前10条数据 select top 10 * from Customers
查询前百分之十 select top 10 percent* from Customers
表达式要加括号 select top (10*2) percent * from Customers
select top 5 * from Products order by UnitPrice desc--默认是升序,这样表示降序
select top 5 * from Products order by UnitPrice asc--默认升序(可不写)
============================================================
select top 5 * from TblStudent order by tSAge—年龄最小的5个学生
select top 10 percent* from TblStudent order by tSAge desc—获得年纪最大的10%学生
===========================================================================
select distinct *from T1--关键字作用是已经查询后的结果再去除重复
Select distinct sname,sage,sgender from T1
=======================================================
Select top 5 sName,sAge from student
Select top 30 percentsName,sAge from student 非四舍五入,返回最大整数 如:2.1 返回3
select tSId,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 表
• INSERT INTO Class(className,studentNumber) VALUES('空间信息与数字技术一班',19)
• INSERT INTO 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
删除表中全部数据:delete fromstudent。
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、<、>、>=、<=、 <>(或!=)等
update Studentset sAge = sAge + 1—所有人的年龄加1
update Studentset sAge=30 where sName='华佗' or sAge<25 ,or相当于C#中的||(或者)
--更新性别,没加条件
update TbStudentset tSGender=0;
优先级:not and or
用小括号可以改变优先级.
update TblStudentset tSAge=tSAge+1
Null代表不知道
UPDATE TblStudentset tsname=tsname+'^-^' where tsage<20 and tsgender='男'
7、goto语句
go语句的作用:
向 SQL Server 实用工具发出一批 Transact-SQL语句结束的信号。
将SQL语句分段执行。
GO 不是Transact-SQL 语句;它是sqlcmd 和osql 实用工具以及SQL Server Management Studio 代码编辑器识别的命令。
SQL Server 实用工具将GO 解释为应该向SQL Server 实例发送当前批Transact-SQL 语句的信号。当前批语句由上一GO 命令后输入的所有语句组成,如果是第一条GO 命令,则由即席会话或脚本开始后输入的所有语句组成。
GO 命令和Transact-SQL 语句不能在同一行中。但在GO 命令行中可包含注释。
用户必须遵照使用批处理的规则。例如,在批处理中的第一条语句后执行任何存储过程必须包含EXECUTE 关键字。局部(用户定义)变量的作用域限制在一个批处理中,不可在GO 命令后引用。
8、alert
手动增加约束
--手动删除一列(删除EmpAddress列)
alter table Employeesdrop column EmpAddress
--手动增加一列(增加一列EmpAddr varchar(1000))
alter table Employeesadd EmpAddr11 varchar(500),AA int ,bb varchar(10)
--手动修改一下EmpEmail的数据类型(varchar(200))
alter table Employeesalter column EmpAddr varchar(1000)
--为EmpId增加一个主键约束
alter table Employeesadd constraint PK_EmpId primary key(EmpId)
--非空约束,为EmpName增加一个非空约束
alter table Employeesalter column EmpName varchar(50) not null
--为EmpName增加一个唯一约束
alter table Employeesadd constraint UQ_EmpName unique(EmpName)
--为性别增加一个默认约束,默认为'男'
alter table Employeesadd constraint DF_EmpGender default('男') for EmpGender
--为年龄增加一个检查约束:年龄必须在-120岁之间,含岁与岁。
alter table Employeesadd constraint CK_EmpAge check(EmpAge >=0 and EmpAge<=120)
--创建一个部门表,然后为Employee表增加一个DepId列。
alter table Employeesadd DeptId int
--增加外键约束
alter table Employeesadd constraint FK_DeptId_DepId foreignkey(DeptId) references Department(DepId)