高飞随笔录

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

第一章 数据库基础

1.1 数据库体系结构

数据库领域公认的标准结构是三级模式结构,它包括外模式、概念模式、内模式,有效地组织、管理数据,提高了数据库的逻辑独立性和物理独立性。

1.1.1 用户级--> 外模式(反映了数据库系统的用户观)

外模式又称子模式或用户模式,对应于用户级。它是某个或某几个用户所看到的数据库的数据视图,是与某一应用有关的数据的逻辑表示。外模式是从模式导出的一个子集,包含模式中允许特定用户使用的那部分数据。用户可以通过外模式描述语言来描述、定义对应于用户的数据记录(外模式),也可以利用数据操纵语言(Data Manipulation Language,DML)对这些数据记录进行操作。

1.1.2 概念级--> 概念模式(反映了数据库系统的整体观)

概念模式又称模式或逻辑模式,对应于概念级。它是由数据库设计者综合所有用户的数据,按照统一的观点构造的全局逻辑结构,是对数据库中全部数据的逻辑结构和特征的总体描述,是所有用户的公共数据视图(全局视图)。它是由数据库管理系统提供的数据模式描述语言(Data Description Language,DDL)来描述、定义的。

1.1.3 物理级 --> 内模式(反映了数据库系统的存储观)

内模式又称存储模式,对应于物理级。它是数据库中全体数据的内部表示或底层描述,是数据库最低一级的逻辑描述,它描述了数据在存储介质上的存储方式和物理结构,对应着实际存储在外存储介质上的数据库。内模式由内模式描述语言来描述、定义的。

总结:

总之,数据按外模式的描述提供给用户;按内模式的描述存储在磁盘上;而概念模式提供了连接这两级模式的相对稳定的中间层,并使得两级中任意一级的改变都不受另一级的牵制。

 

 

1.2数据库的两级映射

数据库系统在三级模式之间提供了两级映像:模式/内模式的映像、外模式/模式的映像。

  • 模式/内模式的映像:实现概念模式到内模式之间的相互转换。
  • 外模式/模式的映像:实现外模式到概念模式之间的相互转换。
  •  

1.3 数据库组成

主要数据文件:mdf    次要数据文件:ndf   日志文件:ldf

 

1.4 命名规则

@开头表示局部变量或参数;#开头表示临时表;##表示全局临时对象。

 

1.5 数据库基本数据类型

1.5.1 常见数据类型

类型

大小

用途

TINYINT

1 字节

小整数值

INT或INTEGER

4 字节

大整数值

BIGINT

8 字节

极大整数值

DOUBLE

8 字节

双精度 double(5,2)表示最多5位,其中必须有2位小数,即最大值为(999.99)

1.5.2 字符串类型

类型

大小

用途

CHAR

0-255字节

定长字符串

VARCHAR

0-65535 字节

变长字符串

TEXT

0-65 535字节

长文本数据

BLOB

0-65 535字节

二进制形式的长文本数据

1.5.3 日期和时间类型

类型

大小

范围

格式

用途

DATE

3

1000-01-01/9999-12-31

YYYY-MM-DD

日期值

TIME

3

'-838:59:59'/'838:59:59'

HH:MM:SS

Time类型不仅可以用于表示一天的时间(必须小于24小时),还可能为某个过去的时间或两个事件的时间间隔(可以大于24小时,或者未负)

YEAR

1

1901/2155

YYYY

年份值

DATETIME

8

1000-01-01 00:00:00/9999-12-31 23:59:59

YYYY- MM-DD HH:MM:SS

混合日期和时间值

TIMESTAMP

4

1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07

YYYYMMDD HHMMSS

混合日期和时间值,时间戳

 

1.6 创建用户自定义数据类型

数据库—选择需要自定义的数据库—可编程性—类型。

 

1.7 数据库的数据完整性

实体完整性、域完整性和引用完整性三类。

1.7.1实体完整性

主键约束

主键约束强制要求被设置成主键的列取值不能为空,也不能重复。它通过PRIMARY KEY子句来实现主键的声明。可以在 CREATE TABLE 或 ALTER TABLE 语句中使用PRIMARY KEY子句,实现主键约束的创建、删除或修改。一个表中只能有一个主键,即只能设置一个主键约束对象。

/*------------------------------------创建时,设置单属性主键*/

        CREATE TABLE Student

        (

        StudentID NCHAR(10) PRIMARY KEY,

        Name NCHAR(6),

        Sex NCHAR(2)

        )      

/*------------------------------------创建时,设置联合主键*/

        CREATE TABLE Student

        (

        StudentID NCHAR(10),

        Name NCHAR(6),

        Sex NCHAR(2),

        CONSTRAINT PK_Name2 PRIMARY KEY(StudentID, Name) /*声明联合主键*/

        )

        /* PS:联合主键是由多个属性组成一个主键。主键只有一个,并不是多个 */

        /* PK_name 是主键约束对象的名字 */    

/*------------------------------------修改时,设置单属性主键*/

        ALTER TABLE Student

            ADD myname NCHAR(4) PRIMARY KEY,

                mysex NCHAR(2)              

/*------------------------------------修改时,设置联合主键*/

        ALTER TABLE Student

            ADD myname NCHAR(4),

                mystid NCHAR(4),

                mysex NCHAR(5),

                CONSTRAINT PK_name PRIMARY KEY(myname, mystid)

唯一性约束

  主键约束一个表只能有一个,但很多时候我们需要除了主键列以外的列没有重复值。这就用到了唯一性约束。唯一性约束与主键约束的效果基本相同,但一个表可以由多个唯一性约束。它通过 UNIQUE子句来实现唯一性约束的声明,可以在 CREATE TABLE 或 ALTER TABLE 语句中使用UNIQUE子句,实现主唯一性约束的创建、删除或修改。

 

  唯一性约束可以允许值为 NULL,单不允许值重复,包括重复的NULL。

/*------------------------------------创建时,设置唯一性约束*/

        CREATE TABLE Student

        (

        StudentID NCHAR(10) PRIMARY KEY,

        Name NCHAR(6) UNIQUE,

        Sex NCHAR(2),

        SchoolID NCHAR(2) UNIQUE,

        --这种创建方法,唯一性约束以多个键对象的形式存在--

        )

/*------------------------------------创建时,设置唯一性约束*/

        CREATE TABLE Student

        (

        StudentID NCHAR(10) PRIMARY KEY,

        Name NCHAR(6),

        Sex NCHAR(2),

        SchoolID NCHAR(2),

        CONSTRAINT ue_name UNIQUE(Name, SchoolID)

        --唯一性约束以一个键对象的形式存在--

        )

/*------------------------------------修改时,设置唯一性约束*/

        ALTER TABLE Student

            ADD myname NCHAR(4) UNIQUE,

                mysex NCHAR(4),     

/*------------------------------------修改时,设置唯一性约束*/

        ALTER TABLE Student

            ADD myname NCHAR(4),

                myscid NCHAR(2),

                mysex NCHAR(4),

                CONSTRAINT UN_name UNIQUE(myname, myscid)

1.7.2 域完整性

空值约束、默认约束、检查约束

空值约束

即设置列是否可以为空值,通过 NULL或NOT NULL来声明列是否可以为空值,可以在CREATE TABLE 或 ALTER TABLE 语句中使用NULL或NOT NULL子句,实现空值约束的创建、删除或修改。

/*------------------------------------创建时,设置空值约束*/

        CREATE TABLE Student

        (

        StudentID NCHAR(10) PRIMARY KEY,

        Name NCHAR(4) NOT NULL, --设置不能为空--

        Age INT NULL --设置可以为空--

        )

/*------------------------------------修改时,设置空值约束*/

        ALTER TABLE Student

            ADD Sex NCHAR(4) NULL

主键约束会自动要求不能为NULL,相当于自动设置了 NOT NULL

默认约束

即为列设置默认值。通过DEFAULT子句来为列设置默认值,可以在CREATE TABLE 或 ALTER TABLE 语句中使用DEFAULT子句,实现默认约束的创建、删除或修改。

/*------------------------------------创建时,设置默认约束*/

        CREATE TABLE Student

        (

        StudentID NCHAR(10) PRIMARY KEY,

        Name NCHAR(6) DEFAULT('阿珍'),

        Sex NCHAR(2) DEFAULT('女'),

        )

/*------------------------------------创建时,设置默认约束*/

        CREATE TABLE Student

        (

        StudentID NCHAR(10) PRIMARY KEY,

        Name NCHAR(6),

        Sex NCHAR(2),

        CONSTRAINT Fe_name DEFAULT '女' FOR Sex

        )

/*------------------------------------修改时,设置默认约束*/

        ALTER TABLE Student

            ADD Hobby NCHAR(4) DEFAULT('吃')  

/*------------------------------------修改时,设置默认约束*/

        ALTER TABLE Student

            ADD Hobby1 NCHAR(4),

                Hobby2 nchar(2),

                CONSTRAINT DF_name DEFAULT '玩' for Hobby1

检查约束

检查约束就是为列设置取值范围,规定数据的值域。可以在CREATE TABLE 或 ALTER TABLE 语句中使用DEFAULT子句来实现检查约束的创建。

/*------------------------------------创建时,设置检查约束*/

        CREATE TABLE myinto

        (

        Name NCHAR(4),

        Sex NCHAR(1) CHECK(Sex='男' or Sex='女'),--括号内可以是一个表达式--

        Hobby NCHAR(10) NULL,

        )

/*------------------------------------创建时,设置检查约束*/

        CREATE TABLE myinto

        (

        Name NCHAR(4),

        Sex NCHAR(1),

        Hobby NCHAR(10) NULL,

        CONSTRAINT CK_name CHECK(Sex='男' or Sex='女')

        --一个约束对象只能检查一个列--

        )

/*------------------------------------修改时,设置默认约束*/

        ALTER TABLE myinto

        ADD Lover NCHAR(2) CHECK(Lover='阿珍' or Lover='阿强')

/*------------------------------------修改时,设置默认约束*/

        ALTER TABLE myinto

        ADD Lover NCHAR(2),

            Lover_name NCHAR(1),

            CONSTRAINT CK_name CHECK(Lover='阿珍' or Lover='阿强')

1.7.3 引用完整性

 

第二章 T-SQL概述

2.1 T-SQL语言的组成

数据定义语言(DLL):用于在数据库系统中对数据库,表,视图,索引等数据库对象进行创建和管理。

数据控制语言(DCL):用于实现对数据库中数据的完整性,安全性等的控制。

数据操纵语言(DML):用于插入,修改,删除和查询数据库中的数据。

2.1.1 定义语言

 

2.1.2 控制语言

 

2.1.3 操纵语言

 

2.2 语句结构

SELECT  子句

[INTO 子句]

FROM 子句

[WHERE 子句]

[GROUP  BY 子句]

[HAVING  子句]

[ORDER BY 子句]

 

2.3 变量

2.3.1 声明局部变量

Declare @name char(10);

2.3.2 为局部变量赋值

一种是select  一种是set

Declare @name char(10);

Select @name=xc

Declare @name char(10);

set @name=xc

2.4 流程控制

2.4.1.IF…ELSE语句

declare @a int,@b varchar(100)

set @a=(select count(titles_id) from titles);

set @b=convert(varchar(100),@a);

if @a<14

     select @a+1 as a

else

     begin

          select @b+'2' as b

          select 900

     end

2.4.2.BEGIN…END语句

declare @r int ,@s int ,@t int

select @r=2,@s=3

 print @r

while @r <5

 begin

     select @t=100*@r+@s

     print @t

     select @r=@r+2

    Select @s=1

end

2.4.3. WHILE…CONTINUE…BREAK语句

declare @r int ,@s int ,@t int

select @r=2,@s=3

 print @r

while @r <5

 begin

     select @t=100*@r+@s

     print @t

     select @r=@r+2

    Select @s=1

end

2.4.4. WAITFOR语句

WAITFOR time '11:45:00'

 Select * from  YGB

2.4.5. RETURN语句

2.4.6. CASE用法

select

(case when 1=2 or 'a' like '%b%' then 'a'

when 1=4 or 'b' in ('b','bb') then 'b'

else 'c'

end)as testField

from dual

 

select sum(case when gjname = '中国'  then 1

else 0

 end),

sum(case when gjname = '美国'  then 1

else 0

 end)

 from tablename

2.4.7. GOTO用法

DECLARE @X INT

SELECT @X=1

loving:

PRINT @X

SELECT @X=@X+1

WHILE @X<=3 GOTO loving

 

第三章 SQL数据语言操作

3.1 数据库操作

3.1.1数据库创建

use master --打开master数据库,一般的创建语句都在master中执行.

go

if exists (select * from sysdatabases where name='数据库名')

  drop database 数据库名  --检查有没有这个数据库,如果有就删除它。

go

create database 数据库名

on

(

name=主数据文件名,  ←------------ 养成好习惯,数据文件加_data

filename='主数据文件物理路径名',  ←------------ 一定要是.mdf的文件,代表主数据文件

size=默认数据库大小,

maxsize=最大容量,

filegrowth=增长量

)

log on

(

name=日志文件名,   ←------------ 养成好习惯,日志文件加_log

filename='日志文件物理路径名',  ←------------ 一定要是.ldf的文件,代表日志文件

size=默认数据库大小,

maxsize=最大容量,

filegrowth=增长量

)

 

use master --打开master数据库,一般的创建语句都在master中执行

go

if exists (select * from sysdatabases where name='students')

  drop database students

go

CREATE DATABASE students /*创建数据库students*/

ON PRIMARY

(

    name="students_data", /*主数据文件的逻辑名*/

    filename="D:\test\students_data.mdf", /*主数据文件储存位置*/

    size=3mb,  /*主数据文件的初始大小*/

    maxsize=100mb,  /*主数据文件的最大大小,不写就是没有限制*/

    filegrowth=1mb /*增量为1MB*/

)

log on

(   /***日志文件****/

    name="students_log",

    filename="D:\test\students_log.ldf", /*日志文件储存位置*/

    size=1mb,  /*日志文件的初始大小*/

    filegrowth=10%  /*增长率为10%*/

)

3.1.2 修改数据库名

EXEC sp_renamedb 'students' , 'stu'

3.1.3 查看数据库

sp_helpdb:查看服务器中所有数据库信息

sp_helpdb 'students' :指定的数据库信息

3.1.4 删除数据库

删除数据库(DROP DATABASE  数据库名)

DROP DATABASE students

3.2 数据表操作

3.2.1创建表

create table student  ( Sno char(5) not null unique,

Sname char(20) unique,

Ssex char(1),

Sage int,

Sdept char(15));

3.2.2 修改表非空约束

ALTER TABLE table_name alter column column_name column_type null

3.2.3 增加、删除、修改列

增加字段

alter table table_name add sex char(2)

修改列数据类型

alter table table_name alter column sex char(50)

删除表中列

alter table table_name drop column sex

3.2.4 删除表

drop table table_name

 

3.3 数据操作

SELECT 列名称 FROM 表名称

SELECT * FROM 表名称

SELECT DISTINCT 列名称 FROM 表名称

SELECT 列名称 FROM 表名称 WHERE 列 运算符 值

INSERT INTO 表名称 VALUES (值1, 值2,....)

INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)

UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

DELETE FROM 表名称 WHERE 列名称 = 值

DELETE FROM table_name 不删除表删除所有行

 

3.4.视图操作

创建视图

create view view_name as select * from table_name

重命名视图

sp_rename 'view1';'view_1'

删除视图

drop view view1,view2

向视图中添加数据

insert into view_name values('','','')

修改视图中数据

update view_name set sex='男' where NAME=''

 

3.5 SQL查询

3.5.1 into子句

select name ,age into newtable from oldtable

3.5.2 BETWEEN   AND

between  rangA and rangB  大于等于rangA小于rangB 

3.5.3 with 用法

--相当于建了个e临时表  

with e as (select * from scott.emp e where e.empno=7499)  

select * from e;     

--相当于建了e、d临时表  

with  

     e as (select * from scott.emp),  

     d as (select * from scott.dept)  

select * from e, d where e.deptno = d.deptno;

3.5.4 where子句

1.下面的比较操作符可在 WHERE 子句中使用:

---------------------------------------

 操作符  描述

 ---------------------------------------

 =  等于

 <>  不等于

 >  大于

 <  小于

 >=  大于等于

 <=  小于等于

 ---------------------------------------

   注释:在某些版本的 SQL 中,操作符 <> 可以写为 !=。

 2.在 WHERE 子句中使用的逻辑操作符 :

--------------------------------------------------------------------------

 操作符   描述

 --------------------------------------------------------------------------

 BETWEEN 值1 AND 值2 在两个值之间

 NOT BETWEEN 值1 AND 值2 不在两个值之间

 IN <值列表>  在特定的集合里(枚举)

 NOT IN <值列表>  不在特定的集合里(枚举)

 LIKE   匹配于一个模式

 NOT LIKE   不匹配于一个模式

 IS NULL   字段为空的

 IS NOT NULL  字段不为空的

 --------------------------------------------------------------------------

        注释:操作符 LIKE 利用通配符把一个值与类似的值进行比较,通配符有两个:

         百分号(%)代表任意长度的字符串;

         下划线(_)代表任意单个字符。

         例如,'A_Z' 表示所有以'A' 起头,另一个任何值的字符,且以'Z' 为结尾的字符串。'ABZ' 和'A2Z' 都符合这一个模式,而'AKKZ' 并不符合(因为在A和Z之间有两个字符,而不是一个字符)。

        'ABC%' 表示所有以'ABC' 起头的字符串。举例来说,'ABCD' 和'ABCABC' 都符合这个模式。

        '%XYZ' 表示所有以'XYZ' 结尾的字符串。举例来说,'WXYZ' 和'ZZXYZ' 都符合这个模式。

        '%AN%' 表示所有含有'AN' 这个模式的字符串。举例来说,'LOS ANGELES' 和'SANFRANCISCO' 都符合这个模式。

3.5.5 like用法

1、% 包含零个或多个字符的任意字符串: 1、LIKE'Mc%' 将搜索以字母 Mc 开头的所有字符串(如 McBadden)。

2、LIKE'%inger' 将搜索以字母 inger 结尾的所有字符串(如 Ringer、Stringer)。

3、LIKE'%en%' 将搜索在任何位置包含字母 en 的所有字符串(如 Bennet、Green、McBadden)。

4、_(下划线) 任何单个字符:LIKE'_heryl' 将搜索以字母 heryl 结尾的所有六个字母的名称(如 Cheryl、Sheryl)。

5、[ ] 指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符: 1,LIKE'[CK]ars[eo]n' 将搜索下列字符串:Carsen、Karsen、Carson 和 Karson(如 Carson)。

6、LIKE'[M-Z]inger' 将搜索以字符串 inger 结尾、以从 M 到 Z 的任何单个字母开头的所有名称(如 Ringer)。

7、[^] 不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符:LIKE'M[^c]%' 将搜索以字母 M 开头,并且第二个字母不是 c 的所有名称(如MacFeather)。

8、* 它同于DOS命令中的通配符,代表多个字符:c*c代表cc,cBc,cbc,cabdfec等多个字符。

9、?同于DOS命令中的?通配符,代表单个字符 :b?b代表brb,bFb等

10、# 大致同上,不同的是代只能代表单个数字。k#k代表k1k,k8k,k0k 。

11、[!] 排除 它只代表单个字符

3.5.6 in 和 exists 用法

 

3.5.7 group by 和 order by 用法

1、order用法

select * from s

order by sno desc,  sage asc

2、group by 用法

SELECT cno,count(sno) from sc group by cno

3、having 用法

select sno , count(cno)

from sc

where grade > 60 

group by sno having count(cno) > 3

3.5.8 UNION 操作符

UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

SQL UNION 语法

SELECT column_name(s) FROM table_name1

UNION

SELECT column_name(s) FROM table_name2

注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

 

SQL UNION ALL 语法

SELECT column_name(s) FROM table_name1

UNION ALL

SELECT column_name(s) FROM table_name2

另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

 

posted on 2020-06-18 11:00  城郊牧笛  阅读(195)  评论(0编辑  收藏  举报