SQL语句练习题(包含有多表查询)-答案

时间:2019-05-14 00:53:35下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《SQL语句练习题(包含有多表查询)-答案》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《SQL语句练习题(包含有多表查询)-答案》。

第一篇:SQL语句练习题(包含有多表查询)-答案

SQL语句练习题

1、请从表EMP中查找工种是职员CLERK或经理MANAGER的雇员姓名、工资。select ename,sal from emp where job='CLERK' or job='MANAGER';

2、请在EMP表中查找部门号在10-30之间的雇员的姓名、部门号、工资、工作。select ename,deptno,sal,job from emp where deptno between 10 and 30;

3、请从表EMP中查找姓名以J开头所有雇员的姓名、工资、职位。

select ename,sal,job from emp where ename like 'J%';

4、请从表EMP中查找工资低于2000的雇员的姓名、工作、工资,并按工资降序排列。select ename,job,sal from emp where sal<=2000 order by sal desc;

5、请从表中查询工作是CLERK的所有人的姓名、工资、部门号、部门名称以及部门地址的信息。

select ename,sal,emp.deptno,dname,loc from emp,dept where emp.deptno=dept.deptno andjob=’CLERK’;

6、查询表EMP中所有的工资大于等于2000的雇员姓名和他的经理的名字。select a.ename,b.ename from emp a,emp b where a.mgr=b.empno(+)and a.sal>=2000;

7、查询所有雇员的姓名、SAL与COMM之和。

select ename,sal+nvl(comm,0)“sal-and-comm” from emp;

8、查询所有81年7月1日以前来的员工姓名、工资、所属部门的名字

select ename,sal,dname from emp,dept where emp.deptno=dept.deptno hiredate<=to_date(‘1981-07-01’,’yyyy-mm-dd’);

9、查询列出来公司就职时间超过24年的员工名单

select ename from emp where hiredate<=add_months(sysdate,-288);

10、查询于81年来公司所有员工的总收入(SAL和COMM)

select sum(sal+nvl(comm,0))from emp where to_char(hiredate,’yyyy’)=’1981’;

11、查询显示每个雇员加入公司的准确时间,按××××年××月××日 时分秒显示。select ename,to_char(hiredate,'yyyy-mm-dd hh24:mi:ss')from emp;

12、查询列出各部门的部门名和部门经理名字

select dname,ename from emp,dept where emp.deptno=dept.deptno and job=’MANAGER’;

and

第二篇:SQL查询语句

SQL查询语句

第一次:查询(显示)、条件、排序、空记录

第二次:通配符、生成表、文件(记事本)、数组、临时表,数学函数、分组、嵌套查询

第三次:插入记录、删除记录、更新记录 第四次:超连接、新建(打开)数据库、表的建立、表的删除、第五次 表结构的修改,添加记录 显示同张芳同一天出生的学生的信息 格式:

1、查询(显示)记录

显示所有男学生的学号,姓名,性别 区分:字段、条件、表名

Select 字段名列表(*)from 表名; where 条件表达式;

into table(dbf)文件名;

into cursor 临时表名;

into array 数组名;

to file 文件名;

order by 字段名列表(asc desc);

group by 字段名 having 条件;

显示所有大于平均分的学生的学号、姓名 显示同E4挣同样工资的职工信息

Select * from 职工 where 工资=(select 工资 from 职工 where 职工号=”E4”)职工(仓库号C(10),职工号 C(10),工资 N(10,2))

显示所有工资大于1500的员工的仓库号、职工号及所在的城市

2、插入记录

Insert into 表名(字段名列表)values(记录值)

3、删除记录

Delete from 表名 where 条件

4、更新记录

Update 表名 set 字段名=记录值; Where 条件

5、表的删除

drop table 表名

6、表的建立

create table 表名(字段名 数据类型(宽度))

7、表结构的修改select * from 职工where 职工号!=“E4” AND 工资=(select 工资 from 职工 where 职工号=“E4”)

alter table 表名

1)增加字段

alter table student add 身份证号 c(10)

2)删除字段

alter table student drop colum 身份证号

3)修改字段名

alter table student rename colum 出生日期 to 出生年月

4)增加字段有效性规则

alter table student alter 成绩 set check 成绩>=0 and 成绩<=100;

error “成绩输入错误,成绩应该在0-100之间”

5)删除字段有效性规则

alter table student alter 成绩 drop check 注意:

以上题目中用到的 SQL语句粘贴到计事本文件XY.TXT中(每行一条语句)。对两个表操作的方法:

1)同时打开两个表

select 仓库.仓库号,城市,职工号,工资 from 仓库,职工;

where 职工.仓库号=仓库.仓库号 and 工资=1250

2)超连接(内连接、左连接、右连接、全连

接)

内连接:只显示符合条件的记录

左连接:显示符合条件的记录及第一个表中不符合条件的记录

右连接:显示符合条件的记录及第二个表中不符合条件的记录

全连接:显示符合条件的记录及第一、二个表中不符合条件的记录

成绩表(score)

学号姓名课程名成绩 2001张三计算机10 2003张四英语20 2001张三语言30 2005张三数据40 2003张四计算机50

Select sum(成绩)from score group by 学号

Select sum(成绩)from score group by 课程名

select 字段名列表(*)from 表名;where 条件;

order by 字段名列表 asc|desc;

into table(dbf)表名;

into array 数组名;

to file 文件名;

into cursor 临时表名

题目练习

实现以下功能:在考生文件夹下,打开“陶的数据库”的数据库,并利用SQL语句在该数据库中新建一个表:gongzi(职工号 c(4),实发工资 n(7,0)),将zhigong表中基本工资大于1330(含1330)的记录存储在gongzi表中,其中实发工资为:基本工资+加班费(白天20,晚上30),最后将所有的SQL语句保存到考生目录下的sqlanswer.txt文件中(自行建立,一行一条语句)

open database 陶的数据库

create table gongzi(职工号 c(4),基本工资 n(7,2))

select 职工号,基本工资+白班*20+晚班*30 from zhigong;where 基本工资>1350 into array xy

insert into gongzi from array xy

第三篇:Sql语句查询

sql语句多表连接查询

在程序开发过程中,不仅可以对单一数据表进行查询,还可以进行多表查询,用户通过多表查询从多个表中提取出需要的数据。

多表查询可以分为内连接查询、外连接查询以及联合查询。

1.内连接查询

连接查询是指通过各个表之间共同列的关联性查询数据。连接查询分为内连接查询和外连接查询。内连接是将两个相互交叉的数据集合中重叠部分的数据行连接起来,返回表示两个数据集合之间匹配连接关系的数据行。

可以在FORM子句中使用INNER JOIN„ON„建立内连接,也可以在WHERE子句中指定连接条件建立内连接,例如:

select a.UserName,b.BookName,b.Datetm from UserInfo as a inner join SellSheet as b on a.UserID= b.UserID

也可以用下面的语句实现。

select a.UserName,b.BookName,b.Datetm from UserInfo as a,SellSheet as b where a.UserID=b.UserID

2.外连接查询

外连接是对内连接的扩充,除了将两个数据集合中重叠部分以内的数据行连接起来之外,还可以根据要求返回左侧或右侧数据集合中非匹配的数据,即左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。

l左外连接LEFT OUTER JOIN

左外连接LEFT OUTER JOIN逻辑运算符除了返回两个数据表中满足连接条件的行,它还返回任何在后一个数据表中没有匹配行的前一个数据表中的行。非匹配行的部分字段列作为空值返回。

l右外连接RIGHT OUTER JOIN

右外连接RIGHT OUTER JOIN是左外连接的反向连接。它除了返回两个数据表中满足连接条件的行,还返回任何在前一个数据表中没有匹配行的后一个数据表中的行。非匹配行的部分字段列作为空值返回。

3.使用UNION进行联合查询

使用UNION运算符可以进行联合查询。UNION运算符连接多个SELECT语句,将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中所有查询的全部行。使用UNION运算符遵循的规则如下:

(1)在使用UNION运算符组合的语句中,所有选择列表的表达式数目必须相同(列名、算术表达式、聚集函数等)。

(2)在使用UNION组合的结果集中的相应列必须具有相同数据类型,或者两种数据类型之间必须存在可能的隐性数据转换,或者提供了显式转换。例如,在datetime数据类型的列和binary数据类型的列之间不能使用UNION运算符,除非提供了显式转换,而在money数据类型的列和int数据类型的列之间可以使用UNION运算符,因为它们可以进行隐性转换。

(3)结果集中列的名字或者别名是由第一个SELECT语句的选择列表决定的。

注意:对数据表进行联合查询时,结果集中行的最大数量是各表行数之“和”,而对数据表进行连接查询时,结果集中行的最大数量是各表行数之“积”。

第四篇:SQL语句(百度查询)

创建数据库

创建之前判断该数据库是否存在

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

drop database databaseName

go

Create DATABASE database-name 删除数据库

drop database dbname 备份sql server

---创建备份数据的 device

USE master

EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'

---开始备份

BACKUP DATABASE pubs TO testBack 创建新表

create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

根据已有的表创建新表:

A:go

use 原数据库名

go

select * into 目的数据库名.dbo.目的表名 from 原表名(使用旧表创建新表)

B:create table tab_new as select col1,col2… from tab_old definition only 创建序列

create sequence SIMON_SEQUENCE

minvalue 1--最小值

maxvalue ***999999999999--最大值

start with 1--开始值

increment by 1--每次加几

cache 20;删除新表

drop table tabname 增加一个列

Alter table tabname add colname coltype 删除一个列

Alter table tabname drop column colname 添加主键

Alter table tabname add primary key(col)

说明:删除主键:Alter table tabname drop primary key(col)创建索引

create [unique] index idxname on tabname(col…。)删除索引:drop index idxname on tabname

注:索引是不可更改的,想更改必须删除重新建。创建视图

create view viewname as select statement

删除视图:drop view viewname 简单基本的sql语句

(1)数据记录筛选:

sql=“select * from 数据表 where 字段名=字段值 order by 字段名 [desc]”

sql=“select * from 数据表 where 字段名 like '%字段值%' order by 字段名 [desc]”

sql=“select top 10 * from 数据表 where 字段名 order by 字段名 [desc]”

sql=“select * from 数据表 where 字段名 in('值1','值2','值3')”

sql=“select * from 数据表 where 字段名 between 值1 and 值2”

(2)更新数据记录:

sql=“update 数据表 set 字段名=字段值 where 条件表达式”

sql=“update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式”

(3)删除数据记录:

sql=“delete from 数据表 where 条件表达式”

sql=“delete from 数据表”(将数据表所有记录删除)

(4)添加数据记录:

sql=“insert into 数据表(字段1,字段2,字段3 …)values(值1,值2,值3 …)”

sql=“insert into 目标数据表 select * from 源数据表”(把源数据表的记录添加到目标数据表)

(5)数据记录统计函数:

AVG(字段名)得出一个表格栏平均值

COUNT(*;字段名)对数据行数的统计或对某一栏有值的数据行数统计

MAX(字段名)取得一个表格栏最大的值

MIN(字段名)取得一个表格栏最小的值

SUM(字段名)把数据栏的值相加

引用以上函数的方法:

sql=“select sum(字段名)as 别名 from 数据表 where 条件表达式”

set rs=conn.excute(sql)

用 rs(“别名”)获取统计的值,其它函数运用同上。

查询去除重复值:select distinct * from table1

(5)数据表的建立和删除:

CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度)……)

几个高级查询运算词

A:UNION 运算符 UNION 运算符通过组合其他两个结果表(例如TABLE1 和TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随UNION 一起使用时(即UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自TABLE1 就是来自TABLE2。

B: EXCEPT 运算符

EXCEPT 运算符通过包括所有在TABLE1 中但不在TABLE2 中的行并消除所有重复行而派生出一个结果表。当ALL 随EXCEPT 一起使用时(EXCEPT ALL),不消除重复行。

C:INTERSECT 运算符

INTERSECT 运算符通过只包括TABLE1 和TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当ALL 随INTERSECT 一起使用时(INTERSECT ALL),不消除重复行。

注:使用运算词的几个查询结果行必须是一致的。使用外连接

A、left outer join:

左外连接(左连接):结果集既包括连接表的匹配行,也包括左连接表的所有行。

SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

B:right outer join:

右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。

C:full outer join:

全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。编辑本段判断对象是否存在 判断数据库是否存在

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

dropdatabase[数据库名] 判断表是否存在

if not exists(select * from sysobjects where [name] = '表名' and xtype='U')

begin

--这里创建表

end 判断存储过程是否存在

if exists(select* from sysobjects whereid = object_id(N'[存储过程名]')and OBJECTPROPERTY(id, N'IsProcedure')= 1)

dropprocedure[存储过程名] 判断临时表是否存在

if object_id('tempdb..#临时表名')isnot null

droptable#临时表名 判断视图是否存在

--SQL Server 2000

IF EXISTS(SELECT* FROM sysviews WHEREobject_id = '[dbo].[视图名]'

--SQL Server 2005 IF EXISTS(SELECT* FROM sys.views WHEREobject_id = '[dbo].[视图名]' 判断函数是否存在

if exists(select* from dbo.sysobjects whereid = object_id(N'[dbo].[函数名]')and xtype in(N'FN', N'IF', N'TF'))

dropfunction[dbo].[函数名] 获取创建信息

SELECT[name],[id],crdate FROM sysobjects where xtype='U'

/*

xtype 的表示参数类型,通常包括如下这些 C = CHECK约束 D = 默认值或DEFAULT约束 F = FOREIGNKEY约束 L = 日志 FN = 标量函数 IF = 内嵌表函数 P = 存储过程 PK = PRIMARYKEY约束(类型是K)RF = 复制筛选存储过程 S = 系统表 TF = 表函数 TR = 触发器U = 用户表 UQ = UNIQUE约束(类型是K)V = 视图 X = 扩展存储过程 */ 判断列是否存在

if exists(select* from syscolumns whereid=object_id('表名')and name='列名')

altertable表名dropcolumn列名 判断列是否自增列

if columnproperty(object_id('table'),'col','IsIdentity')=1

print '自增列'

else

print '不是自增列'

SELECT* FROM sys.columns WHEREobject_id=OBJECT_ID('表名')

AND is_identity=1 判断表中是否存在索引

if exists(select* from sysindexes whereid=object_id('表名')and name='索引名')

print '存在'

else

print '不存在 查看数据库中对象

SELECT* FROM sysobjects WHEREname='对象名'

select * from table(所要查询的表名)where coloum(条件)编辑本段提升 复制表

(只复制结构,源表名:a 新表名:b)(Access可用)

法一:select * into b from a where 1<>1

法二:select top 0 * into b from a 拷贝表

(拷贝数据,源表名:a 目标表名:b)(Access可用)

insert into b(x, y, z)select d,e,f from a;跨数据库之间表的拷贝

(具体数据使用绝对路径)(Access可用)insert into b(x, y, z)select d,e,f from a in ‘具体数据库’ where 条件

例子:。.from b in '“&Server.MapPath(”.“&”data.mdb“ &”' where..子查询

(表名1:a 表名2:b)

select a,b,c from a where a IN(select d from b 或者: select a,b,c from a where a IN(1,2,3)显示文章最后时间

select a.title,a.username,b.adddate from table a,(select max(adddate)adddate from table where table.title=a.title)b 外连接查询

(表名1:a 表名2:b)

select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c 在线视图查询

(表名1:a

select * from(Select a,b,c FROM a)T where t.a > 1;between的用法

between限制查询数据范围时包括了边界值,not between不包括

select * from table1 where time between time1 and time2

select a,b,c, from table1 where a not between 数值1 and 数值2 in 的使用方法

select * from table1 where a [not] in(‘值1’,’值2’,’值4’,’值6’)

删除主表没有的信息

两张关联表delete from table1 where not exists(select * from table2 where table1.field1=table2.field1 四表联查问题

select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where.....日程安排提前五分钟

SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 一条sql 搞定数据库页

select top 10 b.* from(select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc)a,表名 b where b.主键字段= a.主键字段 order by a.排序字段

前10条记录

select top 10 * from table1 where 范围 选择排名

选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等。)

select a,b,c from tablename ta where a=(select max(a)from tablename tb where tb.b=ta.b)

包括所有在TableA 中但不在TableB和TableC 中的行并消除所有重复行而派生出一个结果表

(select a from tableA except(select a from tableB)except(select a from tableC)随机取出10条数据

select top 10 * from tablename order by newid()随机选择记录

select newid()删除重复记录

Delete from tablename where id not in(select max(id)from tablename group by col1,col2,...)列出数据库里的表名

select name from sysobjects where type='U' 列出表里的所有的

select name from syscolumns where id=object_id('TableName')列示排列

列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。

select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end)FROM tablename group by type

显示结果:

type vender pcs

电脑A 1

电脑A 1

光盘B 2

光盘A 2

手机B 3

手机C 3 初始化表table1

TRUNCATE TABLE table1 选择从10到15的记录

select top 5 * from(select top 5 * from(select top 15 * from table order by id asc)table_别名 order by id desc)table_2 order by id

数据类型转换

declare @numid int

declare @id varchar(50)

set @numid=2005

set @id=convert(varchar,@numid)

通过上述语句完成数据类型Int转换成varchar,其他转换类似,可参看convert函数

编辑本段技巧 1=1,1=2的使用 在SQL语句组合时用的较多

‚where 1=1‛是表示选择全部 ‚where 1=2‛全部不选,如:

if @strWhere!='

begin

set @strSQL = 'select count(*)as Total from [' + @tblName + '] where ' + @strWhere

end

else

begin

set @strSQL = 'select count(*)as Total from [' + @tblName + ']'

end

我们可以直接写成

set @strSQL = 'select count(*)as Total from [' + @tblName + '] where 1=1 and '+ @strWhere 收缩数据库

--重建索引

DBCC REINDEX

DBCC INDEXDEFRAG

--收缩数据和日志

DBCC SHRINKDB

DBCC SHRINKFILE 压缩数据库

dbcc shrinkdatabase(dbname)

转移数据库给新用户以已存在用户权限

exec sp_change_users_login 'update_one','newname','oldname'

go 检查备份集

RESTORE VERIFYONLY from disk='E:dvbbs.bak' 修复数据库

Alter DATABASE [dvbbs] SET SINGLE_USER

GO

DBCC CHECKDB('dvbbs',repair_allow_data_loss)WITH TABLOCK

GO

Alter DATABASE [dvbbs] SET MULTI_USER

GO 日志清除

SET NOCOUNT ON

DECLARE @LogicalFileName sysname,@MaxMinutes INT,@NewSize INT

USE tablename--要操作的数据库名

Select @LogicalFileName = 'tablename_log',--日志文件名

@MaxMinutes = 10,--Limit on time allowed to wrap log.@NewSize = 1--你想设定的日志文件的大小(M)

--Setup / initialize

DECLARE @OriginalSize int

Select @OriginalSize = size

FROM sysfiles

Where name = @LogicalFileName

Select 'Original Size of ' + db_name()+ ' LOG is ' +

CONVERT(VARCHAR(30),@OriginalSize)+ ' 8K pages or ' +

CONVERT(VARCHAR(30),(@OriginalSize*8/1024))+ 'MB'

FROM sysfiles

Where name = @LogicalFileName

Create TABLE DummyTrans

(DummyColumn char(8000)not null)

DECLARE @Counter INT,@StartTime DATETIME,@TruncLog VARCHAR(255)

Select @StartTime = GETDATE(),@TruncLog = 'BACKUP LOG ' + db_name()+ ' WITH TRUNCATE_ONLY'

DBCC SHRINKFILE(@LogicalFileName, @NewSize)

EXEC(@TruncLog)

--Wrap the log if necessary.WHILE @MaxMinutes > DATEDIFF(mi, @StartTime, GETDATE())--time has not expired

AND @OriginalSize =(Select size FROM sysfiles Where name = @LogicalFileName)

AND(@OriginalSize * 8 /1024)> @NewSize

BEGIN--Outer loop.Select @Counter = 0

WHILE((@Counter < @OriginalSize / 16)AND(@Counter < 50000))

BEGIN--update

Insert DummyTrans VALUES('Fill Log')

Delete DummyTrans

Select @Counter = @Counter + 1

END

EXEC(@TruncLog)

END

Select 'Final Size of ' + db_name()+ ' LOG is ' +

CONVERT(VARCHAR(30),size)+ ' 8K pages or ' +

CONVERT(VARCHAR(30),(size*8/1024))+ 'MB'

FROM sysfiles

Where name = @LogicalFileName

Drop TABLE DummyTrans

SET NOCOUNT OFF 更改某个表 exec sp_changeobjectowner 'tablename','dbo' 存储更改全部表

Create PROCEDURE dbo.User_ChangeObjectOwnerBatch

@OldOwner as NVARCHAR(128),@NewOwner as NVARCHAR(128)

AS

DECLARE @Name as NVARCHAR(128)

DECLARE @Owner as NVARCHAR(128)

DECLARE @OwnerName as NVARCHAR(128)

DECLARE curObject CURSOR FOR

select 'Name' = name,'Owner' = user_name(uid)

from sysobjects

where user_name(uid)=@OldOwner

order by name

OPEN curObject

FETCH NEXT FROM curObject INTO @Name, @Owner

WHILE(@@FETCH_STATUS=0)

BEGIN

if @Owner=@OldOwner

begin

set @OwnerName = @OldOwner + '.' + rtrim(@Name)

exec sp_changeobjectowner @OwnerName, @NewOwner

end

--select @name,@NewOwner,@OldOwner

FETCH NEXT FROM curObject INTO @Name, @Owner

END

close curObject

deallocate curObject

GO SERVER中循环写入数据

declare @i int

set @i=1

while @i<30

begin

insert into test(userid)values(@i)

set @i=@i+1

end 在SQL Server中有5种约束:

主键约束(primary key constraint)唯一性约束(unique constraint)检查约束(check constraint)缺省约束(default constraint)

外部键约束(foreign key constraint)SQL SERVER中,(1)对于基本表的约束分为列约束和表约束

约束是限制用户输入到表中的数据的值的范围,一般分为列级约束与表级约束。

列级约束有六种:主键Primary key、外键foreign key、唯一 unique、检查 checck、默认default、非空/空值 not null/ null

表级约束有四种:主键、外键、唯

一、检查

列约束是对某一个特定列的约束,包含在列定义中,直接跟在该列的其他定义之后,用空格分隔,不必指定列名;

表约束与列定义相互独立,不包括在列定义中,通常用于对多个列一起进行约束,与列定义用’,’分隔,定义表约束时必须指出要约束的那些列的名称。完整性约束的基本语法格式为:

[ CONSTRAINT <约束名> ] <约束类型> 约束名:约束不指定名称时,系统会给定一个名称。(2)列级约束与表级约束的区别

如果完整性约束涉及到该表的多个属性列,必须定义在表级上,否则既可以定义在列级也可以定义在表级。简而言之:

列级约束:列级约束是行定义的一部分,只能应用于一列上。

表级约束:表级约束是独立于列的定义,可以应用在一个表中的多列上。(3)列级约束与表级约束在SQL中的用法(即如何在SQL中定义约束)在创建表时定义约束:

CREATE TABLE table_name

({-------列级约束定义

|column_name AS computed_column_expression-------计算列定义

|------表级约束定义

}[,….n])一个约束定义为列级约束还是表级约束???

根据实际需要和设计者思路确定。如primary key,当只涉及到一列时,定义为列级约束;当涉及到多列时,则定义为表级约束。

Prinmary key定义为列级约束时,相应SQL语句: Stu_id上建立的主键pk_1为列级约束 CREATE TABLE student(Stu_id int constraint pk_1 primary key,Stu_name varchar(8), ….)当定义为表级约束时,相应SQL语句: CREATE TABLE student(Stu_id int NOT NULL, Stu_id上建立的主键pk_1为的表级约束 Stu_name varchar(8), Constraint pk_1 primary key(Stu_id),….)各约束具体说明: 主键约束

PRIMARY KEY约束 PRIMARY KEY约束用于定义基本表的主键,起唯一标识作用,其值不能为NULL,也不能重复,以此来保证实体的完整性。PRIMARY KEY与UNIQUE约束类似,通过建立唯一索引来保证基本表在主键列取值的唯一性,但它们之间存在着很大的区别:

①在一个基本表中只能定义一个PRIMARY KEY约束,但可定义多个UNIQUE约束; ②对于指定为PRIMARY KEY的一个列或多个列的组合,其中任何一个列都不能出现空值,而对于UNIQUE所约束的唯一键,则允许为空。

注意:不能为同一个列或一组列既定义UNIQUE约束,又定义PRIMARY KEY约束。PRIMARY KEY既可用于列约束,也可用于表约束。PRIMARY KEY用于定义列约束时,其语法格式如下:

CONSTRAINT <约束名> PRIMARY KEY PRIMARY KEY用于定义表约束时,即将某些列的组合定义为主键,其语法格式如下:

[CONSTRAINT <约束名>]S PRIMARY KEY(<列名>[{<列名>}])2.唯一性(UNIQUE)约束

UNIQUE约束用于指明基本表在某一列或多个列的组合上的取值必须唯一。

定义了UNIQUE约束的那些列称为唯一键,系统自动为唯一键建立唯一索引,从而保证了唯一键的唯一性。

唯一键允许为空,但系统为保证其唯一性,最多只可以出现一个NULL值。UNIQUE既可用于列约束,也可用于表约束。UNIQUE用于定义列约束时,其语法格式如下:

[CONSTRAINT <约束名>] UNIQUE 唯一性约束用于指定一个或者多个列的组合的值具有唯一性,以防止在列中输入重复的值。当使用唯一性约束时,需要考虑以下几个因素: ①使用唯一性约束的字段允许为空值。②一个表中可以允许有多个唯一性约束。③可以把唯一性约束定义在多个字段上。

④唯一性约束用于强制在指定字段上创建一个唯一性索引。⑤缺省情况下,创建的索引类型为非聚簇索引。

unique约束是用来确保不受主键约束列上的数据的唯一性.unique与primary key的区别在于:(1)unique约束主要用于非主键的一列或多列上要求数据唯一.(2)unique约束允许该列上存在NULL值,而主键决不允许出现.(3)可以在一个表创建多个unique约束,而在一个表上只能够设置一个主键 3.检查约束

CHECK约束用来检查字段值所允许的范围,如,一个字段只能输入整数,而且限定在0-100的整数,以此来保证域的完整性。

CHECK既可用于列约束,也可用于表约束,其语法格式为:

[CONSTRAINT <约束名>] CHECK(<条件>)一个列级检查约束只能与限制的字段有关;一个表级检查约束只能与限制的表中字段有关。一个表中可以定义多个检查约束。

每个CREATE TABLE语句中每个字段只能定义一个检查约束。

当执行INSERT语句或者UPDATE语句时,检查约束将验证数据。检查约束中不能包含子查询。4.缺省约束

使用缺省约束时,应该注意以下几点: 每个字段只能定义一个缺省约束。

如果定义的缺省值长于其对应字段的允许长度,那么输入到表中的缺省值将被截断。不能加入到带有IDENTITY属性或者数据类型为timestamp的字段上。如果字段定义为用户定义的数据类型,而且有一个缺省绑定到这个数据类型上,则不允许该字段有缺省约束。5.外部键约束

外部键约束用于强制参照完整性,提供单个字段或者多个字段的参照完整性。FOREIGN KEY约束指定某一个列或一组列作为外部键,其中,包含外部键的表称为从表(参照表),包含外部键所引用的主键或唯一键的表称主表(被参照表)。

系统保证从表在外部键上的取值要么是主表中某一个主键值或唯一键值,要么取空值。以此保证两个表之间的连接,确保了实体的参照完整性。FOREIGN KEY既可用于列约束,也可用于表约束,其语法格式为:

CONSTRAINT <约束名>] FOREIGN KEY

REFERENCES <主表名>(<列名>[{<列名>}])当使用外部键约束时,应该考虑以下几个因素: ①外部键约束提供了字段参照完整性。

②外部键从句中的字段数目和每个字段指定的数据类型必须和REFERENCES从句中的字段相匹配。

③外部键约束不能自动创建索引,需要用户手动创建。

④用户想要修改外部键约束的数据,必须有对外部键约束所参考表的SELECT权限或者REFERENCES权限。

⑤参考同一表中的字段时,必须只使用REFERENCES子句,不能使用外部键子句。⑥一个表中最多可以有31个外部键约束。⑦在临时表中,不能使用外部键约束。⑧主键和外部键的数据类型必须严格匹配。6.NULL 约束

(1)NULL/NOT NULL 是否允许该字段的值为NULL。NULL值不是0也不是空白,更不是填入字符串‚NULL‛,而是表示‚不知道‛、‚不确定‛或‚没有数据‛的意思。

当某一字段的值一定要输入才有意义的时候,则可以设置为NOT NULL。如主键列就不允许出现空值,否则就失去了唯一标识一条记录的作用 只能用于定义列约束,其语法格式如下:

[constraint <约束名> ][null|not null]

第五篇:SQL结构化查询语句

SQL结构化查询语句

一、数据定义功能

创建表:Createtable 表名(字段名……)修改表:Altertable表名

删除表:Droptable表名

二、数据操纵功能

数据插入:Insertinto 表名values(…,…,)数据更新:Update表名Set表达式 Where 条件 数据删除:DeleteFrom 表名Where 条件

三、查询功能

SELECT*FROM表名

WHERE条件

ORDERBY 字段排序

GROUPBY 字段分组

函数:SUM()AVG()COUNT()MAX()MIN()去向:

INTOTABLE表

INTOCURSOR临时表

INTOARRAY数组

下载SQL语句练习题(包含有多表查询)-答案word格式文档
下载SQL语句练习题(包含有多表查询)-答案.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    sql查询练习题含答案

    --(1) 查询20号部门的所有员工信息。 select * from emp e where e.deptno=20; --(2) 查询奖金(COMM)高于工资(SAL)的员工信息。 select * from emp where comm>sal; --(3) 查询奖金......

    Oracle基础练习题及答案(多表查询1)(共5篇)

    利用scott用户自带的四张表完成如下作业: 1. 列出至少有一个员工的所有部门 select b.deptno,b.dname from emp a,dept b where a.deptno=b.deptno group by b.deptno,b.dna......

    无忧SQL语句(除查询)

    【64一1】用命令新建一个名为“外汇”的数据库,并将该命令存储于one.txt中; CREATE DATABASE 外汇 【22一3】使用SQL语句创建一个名为"分组情况表"的自由表,"分组情况表"有两个......

    SQL Server查询语句学习心得

    SQL Server查询语句学习心得 李臻敏 摘要:数据库技术已经广泛地渗透到各个领域,数据库应用技术也已经成为计算机必修课程,SQL Server2005是Microsoft 公司推出的数据库服务产品......

    SQL查询语句学习笔记

    问题描述: 为管理岗位业务培训信息,建立3个表: S (SID,SNAME,SDEPT,SEX,AGE) SID,SNAME,SDEPT,SEX,AGE 分别代表学号、学员姓名、所属部门、学员性别、学员年龄 C (CID,CNAME......

    sql语句练习题(小编整理)

    SQL语句测试题1、现在有一创建好的Student的表,表中有三个字段:姓名,性别,年龄。请用SQL语句实现以下要求。 在Student表中查找性别为女的记录的全部字段 在Student表中查......

    sql常用语句

    //创建临时表空间create temporary tablespace test_temp tempfile 'E:oracleproduct10.2.0oradatatestservertest_temp01.dbf'size 32m autoextend on next 32m maxs......

    SQL语句大全

    SQL练习一、 设有如下的关系模式, 试用SQL语句完成以下操作: 学生(学号,姓名,性别,年龄,所在系) 课程(课程号,课程名,学分,学期,学时) 选课(学号,课程号,成绩) 1. 求选修了课程号为“C2”......