数据库笔记(一)

一、数据库概述

l   DBMSDataBase Management System,数据库管理系统)和数据库数据库Schema有两种含义,一种是概念上的Schema,指的是一组DDL语句集,该语句集完整地描述了数据库的结构。还有一种是物理上的Schema,指的是数据库中的一个名字空间,它包含一组表、视图和存储过程等命名对象MSSQLServerOracle等某种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   除了AccessSQLServerCESQLite等文件型数据库之外,大部分数据库都需要数据库服务器才能运行。学习、开发时是连接本机的数据库,上线运行时是数据库运行在单独的服务器。

二、主键

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

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

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

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)

) 

3select

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'%[_]%' 

4insert

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 前缀,字符串将转换为数据库的默认代码页。这可能导致不识别某些字符。

5delete

删除表中全部数据: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—删除性别为0drop tabletstudent—表没了

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

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

6update

   向表中更新一列

     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='男'

7goto语句

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 命令后引用。

8alert

手动增加约束

--手动删除一列(删除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 >=and EmpAge<=120)

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

alter table Employeesadd DeptId int

--增加外键约束

alter table Employeesadd constraint FK_DeptId_DepId foreignkey(DeptId) references Department(DepId)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值