admin 管理员组

文章数量: 1086019


2024年4月17日发(作者:format和)

SQL:结构化查询语言,是国际化标准组织采纳的标准数据库语言

作用:数据库管理员可以用利用次语言操作数据库系统,即:SQL是一种能够被数据库系统

读懂的操作语言。

T—SQL是微软公司针对SQL Server这种关系数据库所定义的一种SQL语言,用户可以完成

Server数据库中的所有操作。

SQL的分类:

(1):数据定义语言,DDL

用来创建数据库和数据库中的各种对象

数据库中的对象包括:表、视图、索引、存储过程、触发器

DDL常用的命令包括:create、alter、drop

(2):数据操纵语言,DML

可以完成对数据库中数据的查询、更新、删除、插入的功能

DML常用的命令包括:select、update、delete、insert

(3)数据控制语言,DCL

DCL常用的命令包括:grant、revoke、deny

(4)数据类型

1、数字数据类型

a、整型数据类型:bigint、int、smallint、tinyint

b、浮点数据类型:float、real

c、固定精度数据类型:decimal、numeric

d、货币数据类型:money、smallmoney

将数据格式转换成字符串方法:STR(ID);---ID为数据类型,STR(ID)为字符串

2、字符数据类型:varchar、char、text、nchar、nvarchar、ntext

区别char和varchar数据类型:

char数据类型是存放固定长度的字符

Varchar数据类型是存放动态长度的字符

char(14),实际放入到数据库的字符长度为14个字符,如果实际存储的长度小于定义的

长度,那么数据库会在次字符串后面加上3个空格

1、insert 语句:

insert语句是属于SQL语言中的DML

作用:为表插入数据

你向一个表中插入一条新记录,但有一个字段没有提供数据。在这种情况下,有下面的

四种可能:

1、如果该字段有一个缺省值(默认值),该值会被使用。

2、如果该字段可以接受空值,而且没有缺省值,则会被插入空值。

3、如果该字段不能接受空值,而且没有缺省值,就会出现错误。你会收到错误信息:

The column in table mytable may not be null.

4、如果该字段是一个标识字段,那么它会自动产生一个新值。当你向一个有标识字段的表

中插入新记录时,只要忽略该字段,标识字段会给自己赋一个新值。

使用INSERT语句可向文本型字段中插入数据。但是,如果你需要输入很长的字符串,

你应该使用WRITETEXT语句。

语法:insert into 表名(列名1,列名2,…..) values(值1,值2,….)

注意:(列名1,列名2,…..)可以不写,这样的话,插入的values(值1,值2,….)中的值必

须包含表中的所有列,不然会报错。

把INSERT 语句与SELECT 语句结合起来,可以添加多个记录。像这样:

代码:INSERT mytable (first_column,second_column)

SELECT another_first,another_second

FROM anothertable WHERE another_first=’Copy Me!’

这个语句从anothertable拷贝记录到mytable.只有表anothertable中字段

another_first的值为’Copy Me!’的记录才被拷贝。

2、update 语句它也是属于SQL语句中的DML, 可以修改表的数据,使用WHERE子句来选

择更新特定的记录。

需要更新很长的字符串,应使用UPDATETEXT语句。如果你不提供WHERE子句,表中的

所有记录都将被更新。

语法:update 表名 set 列名1=值1,列名2=值2,……..[where 条件….]

update student set sage=20 where sno=’s014’----修改一列

update student set sage=20,set ssex=’女’ where sno=’s014’

----修改多列逗号隔开

3、delete语句也是属于SQL语句中的DML

作用:可删除表中的一行或多行,在SQL SELECT 语句中可以使用的任何条件都可以在DELECT

语句的WHERE子句 中使用。删除应该表中的所有记录,应使用TRUNCATE TABLE语句。

语法:delete from 表名[where 条件….]

delete from student----删除表student中所有数据

delete from student where sno = ‘s014’----删除表student中编号是014

的一行

delete from student where sno >= ‘s013’ --删除表student中编号大于等于

013的行

4、建立索引

Create INDEX index_name ON table_name (column_name)

说明:对某个表格建立索引后,数据库会对相应列进行自然排序,以增加查询时的速度。

4、基本查询技术:

数据库中提供一种可以将表中的数据查询出来的技术,称为select查询

select查询技术的基本语法格式

select [列名1,列名2,…..] | from 表名1,表名2

[where 条件]

[group by分组的列名]

[having聚合函数比较操作]

[order by 排序的列名]

(1) 查询语句中的“*”号代表将表中的列全部显示出来

select * from student

(2) 如果只想在查询中显示某一列用:

select sno sname sage from student

注意:“*”和列名只能够二选一,不能够同时出现

(3) 在查询的时候可以为表或者列定义别名

A:为列定义别名

select sno as 学号 ,sname as 姓名 from student

或:select ‘学号’=sno, ‘姓名’=sname from student

B:为表定义别名

select sno sname sage ssex from student a

好处:当出现多张表联系起来作查询的时候,如果多张表中含有相同的列名的时候,为

表定义别名使得查询比较方便

例如:想查询课程是由哪些老师就是讲授的。

从课程course表和老师teacher表中查找车tno列相同的数据

select cname, tname, from course a , teacher b

where =

(4)distinct 关键字

此关键字是为了去掉列中重复的值, 对于所有重复的数据行在SELECT返回的结果集合

中只保留一行。

select distinct sno from sc

(5)order by 排序(默认升序)

语法:order by 列名[desc | asc]

desc:代表降序排列

asc 代表升序排列

select *from student order by sname

如果不写排序关键字,默认的是升序

select *from student order by sname desc

(6)where关键字使用

Where作为查询筛选结果的一个过程(非常重要)

语法:where 条件1[or | and] [条件2]…

条件1可以包括以下内容:

Where 列名1 列名2 | 数值

(7)top n限制返回的行数

使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT

时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。

例如:

代码:SELECT TOP 2 * FROM `testtable`

代码:SELECT TOP 20 PERCENT * FROM `testtable`

条件表达式分类:

1、 比较条件:

(>:大于 <:小于 >=:大于等于 =<:小于等于 <>:不等于 =:登于)

例如:找学生年龄大于23岁的同学信息

select *from student where sage>23

2、 逻辑条件

(and:与运算 or:或运算 not:非)

逻辑操作的用法:

Where 条件1条件2

例如:查找课程编号大于’c002’的课程由哪些老师讲授

sSelect *from teacher ,course where = and >

‘c002’

例如:查找选修了课程’c002’,或者成绩大于70的学生有哪些

select sname , sage , cno ,score from student a , sc b

where = and (cno=’c002’ or score>70)

例如:not关键字的使用:

select *from sc where score not between 70 and 80

3、 in关键字

它是要求查询的结果在某几个值里面

select *from sc where score not in(70,90,80)

select *from course where cno in (‘c001’,’c002’,’c005’)

in还可以应用到子查询中

select *from sc where sno

in (select sno from student where sno >= ‘s002’)

4、 like关键字

like是作为SQL模糊查询比较常用的一个技术,在like关键字使用中提出两

个比较特殊的符号

%:0个或多个任意字符

_:任意一个字符

例如:a、查找学生表中姓“陈”的同学

select * from student where sname like ‘陈%’

b、查询学生表中名字是三个字的学生信息

select * from student where sname like ‘___’ ----‘内三下

杠’

思考题:如果一个列中的内容含有下划线,要去用like来查找含有下划

线的信息,该怎么做?

在SQL模糊查询中提供了一个escape(逃离、躲避、转移)关键字,它作

为转义符使用

select *from student where sname like ‘%$_%’ escape ‘$’

“$”是定义的转移符号,那么在$符号后面的下划线不再是like中的特殊符

号,而是一个普通字符

5、 all关键字

6、 any关键字

7、 between…and 关键字

5、聚合函数:只能对表中的数字类型进行计算,其他类型报错

max、min、count、avg、sum

max函数使用:select max(sage) from student----求学生表中最大的年龄

min函数使用:select min(sage) from student-----求学生表中最小的年龄

count函数使用:

select count (*)from student

select count (sno)from student

count(*):可以计算包含null列的记录数

count(列名):记录总记录数的时候,不去计算null值

avg函数的使用:select avg(sage) from student-----求学生表中的平均年龄

sum函数的使用:select sum(sage) from student-----求学生表中的年龄和

6、group by子句,它是一个分组函数,可以对某一列相同的值进行分组并求出相应的结

果。

语法:

Select 列名1 [,列名2….] from 表名 group by 列名1[,列名2…]

例如:求学生表中男女生的总数

Select ssex ,count(ssex) from student group by ssex

例如:求不同老师总共讲授的课程的总数

A. 两张表的查询teacher,course

B. 对不同的老师进行一个分组

C. 分组后求课程的总数

Select , tname , count(cno) from teacher t , course c

where = group by , tname

groyp by 执行原理、注意事项:

a. 先根据group by 后的列名进行分组

b. 然后根据count(列名)中的列名进行统计

c. group by子句经常和聚合函数一起使用

d. 在使用group by的时候,如果查询的列没有包含在聚合函数中,那么该列一定要出现

在group by子句后面

7、 having子句使用

having子句的作用非常重要,它是对聚合函数的值可以进行比较的操作。Having

必须放在group by 子句的后面。

例如:查询讲两门课以上的老师信息

Select , tname , count(cno) from teacher t , course c

Where = group by , having count(cno) >=2

创建表的语法

creat table 表名(

列名_1 数据类型 约束条件

列名_2 数据类型 约束条件

……………………

注意:如果定义的表中有多个列,那么需要以英文逗号”,”隔开;

表名和列名不能是SQL语言中的关键字

Numeric(p,n)

P代表数字类型的精度,插入数据的的最大长度。整数位多了会报错

n代表小数点后面的位数。小数后的位数长度超过n为会四舍五入

creat table A_2(

a_no numeric(5,2) //最大长度为5位,小数点后为两位,

)

insert into A_2 (a_no) values (789.298) //789.30

insert into A_2 (a_no) values (7890.28) //报错

插入日期类型

creat table A_3(

a_date datatime

)

insert into A_3 values (‘2011-04-02’)

查询表:

select *from 表名

select *from A_2

1、 SQL链接查询

含义:复杂的SQL查询是基于多张表以上的查询,就必须考虑多张表的连接查询

是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。

SQL链接查询的分类:

等值链接 外连接 交叉链接

等值链接:

两个SQL语句:

第一个:select tname , cname from teacher t , course c where =

第二个:select tname , cname from teacher t inner join course c on

=

查询学生所选的课程的分数,要求跟上学生的姓名:

select , sname , , cname , score from student a

sc b , course c where = and =

注意:第二个SQL语句是SQL 92/SQL 99的写法,这种写法叫做连接查询中的内连接形

外连接:包括:左外链接、右外连接、完全链接

外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接

时)或两个表(全外连接时)中所有符合搜索条件的数据行。

使用外连接需要一些关键字:

left outer join on (左外连接)

right outer join on (右外连接)

full outer join on (完全连接的写法)

例子:select *from 表1 left outer join 表2 on 表1.列名=表2.列名

creat table R( creat table S(

a varchar(5) c varchar(5)

b varchar(5) d varchar(5)

c varchar(5) )

)

left outer join的含义:除了满足查询条件的结果显示出来,还需将left outer join

左侧表中没有匹配的数据显示出来

外连接实战应用:

1、 查询所有同学的学号、姓名、选课数、总成绩

如果没有选课的学生信息,是否也要打印出来作为统计数据

select , sname , count(cno) , sum(score)

from student a left outer join sc c

on = group by , sname

2、查询不同老师所教不同课程的平均分

select , tname , , avg(score) from course c

left outer join sc on = group by , ,

tname

right outer join的含义:除了满足查询条件的结果显示出来,还需将right outer join

右侧表中没有匹配的数据显示出来

1、 查询所有同学的学号、姓名、选课数、总成绩

如果没有选课的学生信息,是否也要打印出来作为统计数据

select , sname , count(cno) , sum(score) from sc c

right outer join student a

on = group by , sname

2、查询不同老师所教不同课程的平均分

select , tname , , avg(score) from sc

right outer join course c on =

group by , , tname

full outer join的含义:就是左外连接和有外链接结果的和

select *from R full outer join on S on R.c = S.c

连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较

运算符、逻辑运算符等构成。

无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三

种列进行间接连接。例如:

代码:SELECT _id,_id,_info

FROM pub_info AS p1 INNER JOIN pub_info AS p2

ON DATALENGTH(_info)=DATALENGTH(_info)(一)内连接

内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。

SQL的子查询

1、 where子查询

select cno , score from sc where score > (select avg (score) from

sc)

where子查询后面的条件允许写select语句,那么这个限制条件(“>”符号)

后的查询称为子查询。

2、 from子查询

结构:select *from 表名1 , (select *from 表名2)

例如:查询每个学生的课程、成绩、总平均分

select cno , score , from sc,(select avg(score) as cc from sc)

b

where sc.

虚表命名为b,查询出来的平均分命名为cc

在from关键字后面出现的查询句子,我们可以让他单独的作为一张虚表。

3、 in子查询

它是要求查询的结果在某几个值里面

select *from sc where score not in(70,90,80)

select *from course where cno in (‘c001’,’c002’,’c005’)

in还可以应用到子查询中

select *from sc where sno

in (select sno from student where sno >= ‘s002’)

4、 any子查询

>any:大于最小的

=any:就是关键字in的作用

select * | 列名1 , 列名 , 列名2….from 表名 where 列名 >any 比较条件(子查询)

select * | 列名1 , 列名 , 列名2….from 表名 where 列名

select * | 列名1 , 列名 , 列名2….from 表名 where 列名 =any 比较条件(子查询)

例如:查询学生成绩大于70,且出去里面最小的学号

select distinct , sname from student a , sc b

where = and >70

and > any (select sno from sc where score > 70)

5、 all子查询

语法格式:

select * | 列名1 , 列名 , 列名2….from 表名 where 列名 >all 比较条件(子查询)

select * | 列名1 , 列名 , 列名2….from 表名 where 列名

select * | 列名1 , 列名 , 列名2….from 表名 where 列名 =all 比较条件(子查询)

>all:大于子查询结果中最大的数据

=all:没有任何数据

Select * from student where sno > all(select sno from sc where

score >70)

6、 嵌套子查询

7、 exists子查询

允许查找特定条件的行,exists后面总是跟一个子查询,只要只查询返回了行,exists

的值就为true。

例:查询返回在任何一次考试中分数低于40分得学生studentID和姓名

select studentID , name from student s where exists

(select studentID from studentExam e Where mark<40 and tID = tID);

这里的基础是一个相关子查询返回分数低于40分得学生的studentID:

select studentID from studentExam e Where mark<40

对student表中的每一行只执行一次

and tID = tID

修改表:

修改表的时候一般有如下操作:

1、 修改表中的数据类型

2、 为表添加列

3、 删除表中的列

4、 为表添加约束

5、 删除表的约束

第一种:为表添加列

alter table 表名 add 列名 数据类型 约束

alter table emp add e_address varchar(20) default’成都’ //声明后面插入

的数据的地址默认为成都,即约束为成都

insert into emp (empno,ename,depno)

values (1004,’李明’,2)

select * from emp //查询emp表格中的数据

第二种:删除表中的列

Alter table 表名 drop column 列名

alter table emp drop column e_address

注意:

1、 如果在删除表中列的时候,一定要注意此列是否含有约束对象。如果有约束对

象,应先删除约束对象,再删除表中所对应的列。

2、 删除表中的约束:

alter table 表名 drop constraint 约束名

alter table emp drop constraint DF_emp_e_address_00200768

3、 删除约束的时候,约束名不要用单引号修饰。

第三种:修改表中列的数据类型

比如:增加varchar的长度

alter table 表名 alter column e_name varchar(25)

第四种:为表添加约束

作用:为了更好地保护数据库中数据的完整性,存储数据的一致性和正确性的一套机制。

alter table 表名 add constraint 约束名 约束类型[约束表达式]

约束的分类:

在SQL Server2005中有6种约束:

主键约束(primary key constraint)

第1种主键约束定义:在创建表的时候定义主键约束:

Creat table A_1(

a_no int primary key,--此定义方式,系统会默认生成一个主键约束名称

a_name varchar(10)

)

--主键到底有什么用:

--1、一个列被定义成主键后,此列中的数据不能为NULL

--2、被定义成主键的列,其数据必须是唯一的

insert into A_1 values (1,’张三’)---第一个数字不能为null

insert into A_1 values (2,’李四’)---第一个数字不能和1重复

第2种主键约束的定义

creat table A_2(

a_no int ,

a_name varchar(10),

constraint PK_A_2 primary key (a_no)

)

第3种主键约束的定义

create table A_3(

a_no int,

a_name varchar(10)

)

---如果创建的表中某一列想定义为一个主键,

---必须满足一个前提条件,即该列不能为空

---如下:声明表A_3的a_no列不为空

alter table A_3 alter column a_no int not null

---如下:修改表A_3的a_no列为主键约束

alter table A_3 add constraint PK_A_3 primary key(a_no)

唯一性约束(unique constraint)

检查约束(check constraint)

如果要为表中的某一列定义一个规则,可以使用check约束。

例如:为表A的a_sex定义只能存放“男”或“女”

creat table A(

a_name varchar(10),

a_sex varchar(2) constraint ck_sex check(a_sex=’男’ or

a_sex=’女’)

)

insert into A (a_name,a_sex)

values (‘李四’,’女’)----true

values (‘李四’,’你’)---false

列约束实例:

creat table 会员(

No smallint not null constraint memberNoChk-----列约束是直接跟在后

check(No between 1 and 10000),

name varchar(20) not null,

address varchar(60) not null

)

表约束实例:

creat table 我的会员(

No smallint not null,

name varchar(20) not null,

address varchar(60) not null,

constraint ChkmemberNo-----表约束是表的列写完后添加约束

check(No between 1 and 10000)

)

列约束与表约束的区别:列约束是直接跟在后面,而表约束则是表列项写完后添加约束

外部键约束(foreign key constraint)

外键是指用于建立实体与实体之间关系,当添加、修改、删除数据的时候,他可以保持

两张表的数据一致性。外键就是针对表与表的关系确立而设置的。

作用:

1、当插入数据的时候,如果数据在父表中找不到,我们的外键就阻止你进行一个插入

操作。

2、保持两张表的数据一致性

外键的创建方式:

-------如何建立外键,即外键到底建立在哪张表中才是正确的

-------1、确立表之间的子父关系

-------2、外键一定是建在子表中的,且该外键是父表中的主键的那一列。

-------3、在创建表的时候就可以添加外键:将子表某列和父表主键关联起来

alter table 子表 add constraint FK_C foreign key (子表某列) references 父表

(父表主键)

方法1,创建表的时候就定义

例如:A和B表是一对多的关系,那么A表称为父表,B表称为子表。为了体现子父关

系,可以使用外键。

---emp,员工表

---dep,部门表

---员工表 VS 部门表===> n:1

Create table emp(---部门信息(子表)

empno int primary key,----员工编号

ename varchar(10),-----员工姓名

depno int foreign key references dep (depno)

)

create table dep(----部门信息(父表)

depno int primary key,----部门编号

dname varchar(10)---部门的名称

)

方法2,创建表的时候,自定义外键的名称

create table B(

b_no int primary key,

b_name varchar(10)

)

---B VS C 1:n

create table C(

c_no int primary key,

c_name varchar(10),

b_no int,

constraint FK_C foreign key (b_no) references B (b_no)

)

方法3,创建外键约束的方法

create table B(

b_no int primary key,

b_name varchar(10)

)

create table C(

c_no int primary key,

c_name varchar(10),

b_no int,

)

alter table C add constraint FK_C foreign key (b_no) references B (b_no)

默认约束:dafault

Default可以为表在插入数据的时候,指定一个默认的值

creat table people(

p_id int primary key,

p_name varchar(20),

p_sex varchar(2) default ‘男’

constraint ck_people check (p_sex=’男’or 9_sex = ‘女’)-----检查

约束

)

insert into people(p_id,p_name) values (1,’张三’)

空值(NULL)约束

1、 完整性约束,包括:primary key、unique

完整性约束的基本语法格式:

[CONSTRAINT constraint_name(约束名)]<约束类型>,约束不指定名称时,系统会

给定一个名称

2、 参照性约束,包括:foreign key

3、 用户自定义约束,包括:check default

第五种:删除表中的约束

alter table 表名 drop constraint 约束名

alter table emp drop constraint DF_emp_e_address_00200768

删除表:

删除表的操作可使用:drop table 表名

在使用drop table 的时候,注意一点:如果有字符关系的表,且用了foreign key

进行约束,那么删除父表的时候,数据库会提示无法删除。

drop table people

日期函数:

A、 获取当前系统时间

select getdate()

B、 在当前系统时间上增加两天

第一种:select getdate()+2

第二种:使用dateadd()函数:它可以在向指定日期加上一段时间的基础上,返回

新的datetime值

语法结构:dateadd(datepart , number , date)

select dateadd(DD , 2 , getdate())----当前时间加两天;

其中:

datepart:对日期做怎样的增加,DD:天MM:月;YYYY:年;HH:小时

number:增加的量

date:日期类型的数据

C、 对两个时间进行差值比较

datediff()函数

语法:datediff(datepart , start , end)

datepart:代表做差值的单位:年、月、日、时、分、秒

start:日期类型数据

end: 日期类型数据

select datediff (DD , getdate() , getdate()+5)

D、 datepart:返回表示指定日期的某一部分

语法结构:datepart(datepart , date)

例如:返回当前系统的时间年份

select datepart(yyyy , getdate())----返回年份

除了datepart可以返回指定日期的某一部分,还可以用convert函数完成相应功

能效果

convert()函数是把日期转换为新数据类型的通用函数

语法:convert(数据类型,要转换的数据,转换的格式)====》

convert (datatype,data,style)

例子1:当前日期格式转化为dd/mm/yy

select convert (varchar (10) , getdate() , 103)

例子2:当前日期格式转化为yyyy-mm-dd hh:mi:ss(24h)

select convert ( varchar (30) , getdate() , 120)

字符函数

1、 len:求字符串长度

语法:len(字符串)

例子1、查询学生表中姓名的长度

select len(sname) , sname from student

例子2:查询学生姓名是3个字的信息

select *from student where len(sname) = 3

2、 replace:字符串替换函数

语法:replace (‘String1’ , ‘String2’ , ‘String3’)

String1:要搜索的字符串表达式;String1可以是字符数据或二进制数据

String2:要查找的字符串表达式;String2可以是字符数据或二进制数据

String3:用于替换的字符串表达式;String3可以是字符数据或二进制数据

select replace(‘abcdefg’,’abc’,’$$$$$$$$’)----- $$$$$$$$defg

select sname replace(sname,sname,’###’) from student where

len(sname)=3;

3、 substring:求字符串子串函数

语法:substring(expression , start , length)

expression:是字符串、二进制字符串、文本、图像、列和包含列的表达式,不要

使用包含数据函数的表达式

start:指定字符串开始位置的整数,start可以为bigint类型

length:一个正整数,指定要返回的expression的字符数或字节数,如果length

为负。则会返回错误,length可以是bigint类型

例子1:返回从学生学号第2个字符到最后字符的信息

Select sno , substring(sno , 2 , len(sno)) from student

4、 upper:将字符串转换为大写

语法:upper(字符串)

例子:select upper(‘abcdef’)---- ABCDEF

5、 lower:将字符串转换为小写

语法:lower(字符串)

例子:select lower(‘ABCDEF’)----abcdef

6、 rtrim: 去掉字符串右边的空格

语法:rtrim(字符串)

例子:select rtrim(‘abcdef ’)+’d’--------abcdefd

7、ltrim: 去掉字符串左边的空格

语法:ltrim(字符串)

例子:select ’d’ + ltrim(‘ abcdef’) --------dabcdef

7、 charindex:求字符串中某个字符在整个字符串中的位置

语法:charindex(expression1 , expression2 [,start_location])

参数解释:

expression1:代表要查找的子串

expression2:代表原串

Start_location:查找的起始位置

例子1:求’abc’中’a’在整个字符串中的位置

select charindex(‘a’ , ‘abc’)

例子2:从第2位开始查找,’a’在’abcabc’中出现的位置

select charindex(‘a’ , ‘abc’ , 2)

视图的创建方法

1、 可视化创建方法(即在对象管理器中创建)

2、 通过create view命令来创建视图

create view的语法格式:

create view<视图名> [(<视图属性列表(列名)>)]

[with encryption] as <子查询>[with check option]

with encryption: SQL Server对包含create view语句的文本进行加密

with check option:强制视图上执行的所有数据更新语句都必须符合子查询中where子

句的条件

例子:创建能够查看每个老师所教的课程的视图

create view t_view as select cno , cname , , tname

from course s , teacher t where =

视图是基于多张表导出的一张表

select * from t_view

基本视图的修改:

如果要让视图进行一个插入操作,有时会影响基本的数据,但需要注意一下几点内容:

1、 基于一张表的视图,可以对试图进行修改、更新、删除数据,则插入的数据会影响

到基表

create view t_student as select sno,sname,ssex from student where

sno>’s005’

对视图插入数据

insert into t_student values (‘s014’,’李晓波’,’男’)----会影响基

修改视图中的数据

update t_student set ssex=’女’ where sno = ‘s014’ ----会影响

基表

2、 如果生成的视图包含聚合函数、其它函数、distinct、group by、order by、into;

不能插入、更新、删除数据

create view t_student as select sno , ssex , count(ssex) coun

from student group by sno , ssex

3、 如果生成的视图是由两张表以上的查询生成,不能进行插入。更新、删除数据。

Create view t_student as select , sname , , cname

From student a, course b , sc c where = and =

4、 如果生成的视图,含有with check option ,一定要满足查询条件(where的条件)

才能进行插入、更新、删除数据。

create view t_student as select sno , sname , sex

from student where sno<’s005’ with check option

insert into t_student values (‘s015’,’刘洋’,’女’)------报错sno

需小于s005才行

修改视图:

通过alter view 进行

例如:创建视图:

create view v_t4 as select *from teacher Where tno > ‘t004’ with check option

查看已建视图创建脚本的命令

sp_helptext t_t4

会显示创建脚本:create view v_t4 as select *from teacher Where tno > ‘t004’ with

check option

修改上面的视图v_t4脚本为下:把with check option去掉

alter view v_t4 as select *from teacher where tno > ‘t004’

FROM子句

FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定

256个表或视图,它们之间用逗号分隔。在FROM子句同时指定多个表或视图时,如果选择

列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和

citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以

限定:

代码:SELECT username, FROM usertable , citytable

WHERE =

在FROM子句中可用以下两种格式为表或视图指定别名:

代码:表名 as 别名

表名 别名例如上面语句可用表的别名格式表示为:

代码:SELECT ‘username’, FROM usertable a,citytable b

WHERE =SELECT

不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。

例如:

代码:SELECT _fname+_lname FROM authors a,titleauthor ta

(SELECT ‘title_id’,’title’ FROM ‘titles’

WHERE ‘ ytd_sales’>10000) AS t

WHERE _id=_id AND _id=_id

此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。

UNION联合查询

UNION运算符可以将两个或两个以上的SELECT语句的查询结果集合合并成一个结果集

合显示,即执行联合查询。

UNION的语法格式为:

代码:select_statement UNION [ALL] selectstatement

[UNION [ALL] selectstatement][…n]其中selectstatement为待联合的SELECT查询语句。

ALL选项表示将所有行合并到结果集合中,不考虑重复元素。不指定该项时,被联合查询结

果集合中的重复行将只保留一行。

联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须

在第一个查询语句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、

列标题或者列序号。

在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,

并且每个查询选择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类

型。在自动转换时,对于数值类型,系统将低精度的数据类型转换为高精度的数据类型。

在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。

例如:查询1 UNION (查询2 UNION 查询3)

在集合中,两集合联合后将包含每个集合的数据成员,但每个数据成员只记录一次

{1,2,3,4}intersect{3,4,5,6} ==={1,2,3,4,5,6}

交集:intersect返回交集

{1,2,3,4}intersect{3,4,5,6} ==={3,4}

差分:except返回不包含共同元素的集合

{1,2,3,4}except{3,4,5,6} ======{1,2,5,6}

二、数据类型:

smallint

16位元的整数。

interger

32位元的整数。

decimal(p,s)

p精确值和s大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数

点後有几位数。如果没有特别指定,则系统会设为p=5; s=0

float

32位元的实数。

double

64位元的实数。

char(n)

n长度的字串,n不能超过254。

varchar(n)

长度不固定且其最大长度为n的字串,n不能超过4000。

graphic(n)

和char(n)一样,不过其单位是两个字元double-bytes,n不能超过127。这个形态是为

了支援两个字元长度的字体,例如中文字。

vargraphic(n)

可变长度且其最大长度为n的双字元字串,n不能超过 2000。

date

包含了年份、月份、日期。

time

包含了小时、分钟、秒。

timestamp

包含了年、月、日、时、分、秒、千分之一秒。


本文标签: 查询 数据 约束 表中 语句