第一篇:数据库语句大全
一、基础
1、说明:创建数据库
Create DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
---创建备份数据的 device
USE master
EXEC sp_addumpdevice „disk„, „testBack„, „c:mssql7backupMyNwind_1.dat„
---开始备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old(使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、说明:删除新表
drop table tabname
6、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
8、说明:创建索引:create [unique] index idxname on tabname(col….)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
10、说明:几个简单的基本的sql语句
选择:select * from table1 where 范围
插入:insert into table1(field1,field2)values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ‟%value1%‟---like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1)as sumvalue from table1
平均:select avg(field1)as avgvalue from table1
最大:select max(field1)as maxvalue from table1
最小:select min(field1)as minvalue from table1
11、说明:几个高级查询运算词
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),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接
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:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
二、提升
1、说明:复制表(只复制结构,源表名:a 新表名:b)(Access可用)
法一:select * into b from a where 1<>1
法二:select top 0 * into b from a
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b)(Access可用)
insert into b(a, b, c)select d,e,f from b;
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径)(Access可用)
insert into b(a, b, c)select d,e,f from b in „具体数据库‟ where 条件
例子:..from b in „“&Server.MapPath(”.“&”data.mdb“ &”„ where..4、说明:子查询(表名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)
5、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select max(adddate)adddate from table where table.title=a.title)b
6、说明:外连接查询(表名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
7、说明:在线视图查询(表名1:a
select * from(Select a,b,c FROM a)T where t.a > 1;
8、说明: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
9、说明:in 的使用方法
select * from table1 where a [not] in(„值1‟,‟值2‟,‟值4‟,‟值6‟)
10、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists(select * from table2 where table1.field1=table2.field1
11、说明:四表联查问题:
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.....12、说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff(„minute„,f开始时间,getdate())>5
13、说明:一条sql 语句搞定数据库分页
select top 10 b.* from(select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc)a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
14、说明:前10条记录
select top 10 * form table1 where 范围
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
select a,b,c from tablename ta where a=(select max(a)from tablename tb where tb.b=ta.b)
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA except(select a from tableB)except(select a from tableC)
17、说明:随机取出10条数据
select top 10 * from tablename order by newid()
18、说明:随机选择记录
select newid()
19、说明:删除重复记录
Delete from tablename where id not in(select max(id)from tablename group by col1,col2,...)
20、说明:列出数据库里所有的表名
select name from sysobjects where type=„U„
21、说明:列出表里的所有的
select name from syscolumns where id=object_id(„TableName„)
22、说明:列示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
23、说明:初始化表table1
TRUNCATE TABLE table1
24、说明:选择从10到15的记录
select top 5 * from(select top 15 * from table order by id asc)table_别名 order by id desc
三、技巧 1、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 安定 „+ @strWhere
2、收缩数据库
--重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
--收缩数据和日志
DBCC SHRINKDB
DBCC SHRINKFILE
3、压缩数据库
dbcc shrinkdatabase(dbname)
4、转移数据库给新用户以已存在用户权限
exec sp_change_users_login „update_one„,„newname„,„oldname„
go
5、检查备份集
RESTORE VERIFYONLY from disk=„E:dvbbs.bak„
6、修复数据库
Alter DATABASE [dvbbs] SET SINGLE_USER GO DBCC CHECKDB(„dvbbs„,repair_allow_data_loss)WITH TABLOCK GO Alter DATABASE [dvbbs] SET MULTI_USER GO
7、日志清除 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
8、说明:更改某个表
exec sp_changeobjectowner „tablename„,„dbo„
9、存储更改全部表
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
10、SQL SERVER中直接循环写入数据 declare @i int set @i=1 while @i<30 begin insert into test(userid)values(@i)set @i=@i+1 end
第二篇:数据库语句
sp_helpdb----------查本服务器中所有数据库 可跟库名 例:sp_helpdb 库名
------------------------------sp_databases-------------查看本服务器中可用的数据库------sp_helpfile-------------------查看当前工作着的数据库----------------------------sp_helpfilegroup---------------查看当前工作着的组的信息。可加参数,跟组名 例:sp_helpdb 库名
--sp_renamedb-----------改数据库名 例:sp_renamedb 旧库名,新库名
--select groupname from sysfilegroups where status=24---------查看文件组 =8是查只读文件组 =16是查默认文件组 =24是查即只读又默认-------------sp_dboption----------修改数据库选项值 例:sp_dboption 库名 选项 值
值决定真假 一般用:true/faule 或off/on表示
选项一般常用为:use only(数据库拥有者)single user(单一用户)read only(只读)------------dbcc shrinkdatabase---------收缩数据库 例:dbcc shrinkdatabase(库名,10)收缩库,剩余空间保留10%,后面如果不加notruncate,则释放空间操作系统,加truncateonly,归还空间给操作系统,但忽略所给的百分比数值。--------dbcc shrinkfile---------收缩文件 用法与ddcc shrinkdatabase相同。
--------alter database---------------修改数据库
用法:这是起始句,告诉要做的是修改数据库,然后再接要做什么工作。每次只做一项工作 alter database 库名
add file 文件名....to filegroup 文件组名
----------------增加库文件,格式与建库时括号里指定大小时的格式一样 add log file 文件名-------------增加日志文件 remove file 文件名---------删除库内的文件
add filegroup 文件组名-----------增加一个文件组 modify file 文件名-------------修改文件属性
modify filegroup 组名------------修改文件组属性-------------drop database--------------删除数据库
例:drop database 库名1,库名2---------可同时删除两个库----------create table 表名(列名 类型, 列名 类型)-------------------建立表
------select * from 表名---------查询表结构
------select @@dbts----------查询最后一次操作------insert into 表名(列名,列名)values(变量,变量.....)------------向表中插入数据
如省略列名,则必须把每列的变量填全,不可缺少。可以省略 into------sp_addtype 自定义类型名 系统类型名-------用户自定义类型------sp_droptype 自定义类型名-----------删除自定义类型 如有数据库正在使用该自定义类型,则不能删除------alter table---------修改表结构 用法: alter table 表名
alter column 列名 类型---------修改列的类型 drop column 列名--------删除列
add(column)列名--------增加列,实际用时不加 column---sp_help-------------查看数据库中对象信息 用法: sp_help 表名---------------查表的信息 或 sp_help 库名--------------查库信息
后面可以跟库名或者表名,是查数据库或者表的信息---sp_spaceused--------查看对象占用的空间信息 用法: sp_spaceused----------查当前库占用空间信息 或 sp_spaceused 表名----------查指定表占用空间信息
后面可以加表名查看表占空间信息。如不加,则查看当前数据库。----sp_depends------------查看对象的相关性 用法: sp_depends 表名-----------后面加表名----sp_rename---------------重新命名
用法: sp_rename 旧表名,新表名---------改表名
或 sp_rename '表名.旧列名','新列名' 'column'-------修改列名------create index--------------创建索引
用法: create index 索引名 on 表名(列名)------创建索引 或: create unique clustered index 索引名 on 表名(列名)------创建簇集唯一索引 unique是建唯一索引 clustered是建簇集索引---非簇集索引用:nonclustered--------select top---------查表中前几行
用法: select top 3 * from 表名-------查表中前三行
或: select top 10 percent * from 表名-------显示表中前10%数据------------加入percent是百分比的意思。只以大于的最小整数,无小数--------select 列名,列名,列名 from 表名-------显示表中特定的列--------select *,列名 from 表名----------查询表中所有,后面再加一列--------select distinct----------查询不重复数据 distinct用于去掉重复数据 用法: select distinct * from 表名---------查表中不重复数据
或: select distinct * into 新表名 from 旧表名------查旧表中不重复数据同时生成新表-----------------------select 列名+列名 from 表名-------允许有计算式出现,显示无列名的计算结果 如想加列名,则: select 列名+列名 as 新列名 from 表名-----------select 年龄,联系电话,cast(年龄 as varchar(2))+联系电话 from 表名--------把整型数据年龄转化为字符型与字符型数据联系电话相加--------------ctrl+o(字母O)--------清空数据。空值与别的数据运算结果为空--------------select 原始列名 别名 from 表名 select 原始列名 as 别名 from 表名 select 别名=原始列名 from 表名
--------指定别名的三种方法。非法符号可''或[]引起来,不得直接使用。--------------select * from 表名
where 年龄 between 20 and 30---------显示年龄在20到30之间的人-------between是从条件一到条件二之间的限制---------select * from 表名
where 年龄 in(20,21,22)---------显示年龄为20、21、22的人--------in是限制在这些条件内的,是显示一个取值范围---------select * from 表名
where 联系电话 like '[1-3]%'--------查电话是1-3开头的人--------like是像这些条件的语句,能用通配符:%、_、[]、[^]--------意思分别代表:所有字符、一个字符、一位上可取值、一位上不可取值--------select * from 表名 where 姓名 like '[e[]%' or 姓名 like '%e]' escape 'e'------------显示以‘[’开头或以‘]’结尾的所有数据,中间有不显示----------escape ''是指定通配符
---------------order by---------给数据排序 用法: select * from 表名
order by 年龄-----------排序显示年龄。默认为升序(asc)要降序必须加desc----------select distinct top 3 from 表名
order by 年龄 desc--------显示最大的三种年龄-----------select * from 表名
where 年龄 in(select distinct top 3 年龄 from 表名 order by 年龄)order by 年龄-----------显示年龄最小的所有人,并排序-----------select 姓名, case when MCSE成绩 >=80 and MCSE成绩<=100 then '考的不错' when MCSE成绩 >=60 and MCSE成绩<80 then '考的一般' when MCSE成绩 >=0 and MCSE成绩<60 then '不及格' when MCSE成绩 is null then '这小子没考试' else '异常数据' end MCSE成绩 from 表名
-----------判断语句 null是空值的意思,不能用等号连接,只能用is-----------case到end为一列里的判断,case在这里是取值,结果用于输出,不显示原值---------------select 列名1, case 列名2 when 1 then '男生' when 0 then '女生' else '未知' end from 表名
--------这里case取列名,是用于这一列每项取值比较,在这里列名2用的是bit型数据-----------select * into 库1.表1 from 库2.表2-----------把库2中表2移到库1中
----------数据维护三个命令: insert---------向表中插入数据 update---------修改表中的数据 delete---------删除表中的数据
----------insert into 表名-----------(into可有可无)(列1,列2,列3,列4)-----------表的原始列,用括号括起来 values----------有这条命令只能插入一条数据(数1,数2,数3,数4)----------插入的数值
---------可以省略原始列清单,但必须把所有列都赋值----------insert into 表1(列1,列2,列3,列4)select * from 表2 where sex=1----------将表2中sex列等于1的数据信息插入表1中-----------update 表名 set 姓名='丁一' where 姓名='李一'----------把表中姓名叫李一的改为丁一。------------where后面跟定位的列与值
-----------update 表名 set 学号=14, 姓名=陈强
where 学号=1------------把学号为1的同学改为学号14,姓名陈强---------update 表名
set 学号=年龄+7, 姓名='陈一强', 年龄=29 where 学号=14
-------把学号为14的同学资料改为年龄加七赋给学号姓名改为陈一强,年龄改为29-------如果没用where定位,则修改全部值
----------delete 表名
where 学号>30---------把学号大于30的资料删除
--------如不指定条件,则删表内所有数据。这是记录日志文件的操作--truncate table 表名
-------清空表。不记录日志文件的操作。
------create view 图名-------------新建视图 用法: create view 图名 as select 列名 from 表名----------------syscomments------------这个表存着视图代码的信息----------------alter view 图名 with encryption as
select 列名 from 表名-----------用with encyption语句给视图原代码加密-------------不可恢复,除非保留源代码
----------------sp_helptext 图名-----------查看视图源代码
---------------select text from syscomments where id =(select id from sysobjects where name ='图名')---------查视图的代码
---------------create view 图名 as select * from 源图名------------基于源图创建新视图---------------create view 图名 as select 列1 as 新列1,列2 新列2,列3=新列3---------起别名的三种方法 from 表名-----------在新视图中为列起别名,则所见的是新起的别名---------------sp_depends 表名-----------查该表的相关性,有多少表、图与之相关。-----------------create view 图名 select * from 表名 where 年龄<20 with check option---------强制插入数据符合年龄小于20的条件,加在where后面-----------是约束insert和update语句的
-----------------select 男公民.姓名,女公民.姓名 from 男公民,女公民 where 男公民.配偶编号=女公民.编号
------------查结婚男女。较原始的语法,后被下列语法取代 或: select 男公民.姓名,女公民.姓名
from 男公民 join 女公民 on 男公民.配偶编号=女公民.编号-------新的形式,在join之前省略了inner语句。
--可用左连接(*=或left outer join)右连接(=*或right outer join)全连接(full outer)----where不能做全连接,但可以做连接的约束 select * from 男公民
where 配偶编号 in(select 编号 from 女公民)--------嵌套查询,查配偶编号在女公民表中编号列中出现过的-----------------select distinct 客户表.*
from(select * from 订单表 where 订单年份=2004)as d,客户表 where d.客户号=客户表.客户号
-----子查询放在from身后,也可以放在where身后--------------select(select 子查询语句)from 表名
-------这种格式要求子查询查出的必须是唯一的数据--------------select a.员工编号,a.员工姓名,b.员工姓名 as 领导姓名 from 员工表 as a,员工表 as b where a.部门领导编号=b.员工编号
select a.员工编号,a.员工姓名,b.员工姓名 as 领导姓名
from 员工表 as a join 员工表 as b on a.部门领导编号=b.员工编号
select a.员工编号,a.员工姓名,(select 员工姓名 from 员工表 as b where a.部门领导编号=b.员工编号)as 领导姓名 from 员工表 as a---------三种查询员工领导的方法
------如果里面总经理领导编号是这空的,这种查询方法不显示空值。如要显示,则用左连接---------------sp_tables-----------查当前数据库中的所有表
----------------select * from 男公民
union------------联合。自动升序排序,并去掉重复语句 select * from 女公民
-----查询结果是男公民和女公民表的总集。如果不去掉重复的,则用 union all-----如果要降序排,则要在最后一个select语句后面加上order by 列名 desc-----用union查询时,结果集内列数必须相同,并且数据类型必须相互兼容-----多表联合查询加order by时,后面必须跟第一个结果集的列名----------------select top 2 成绩 from 表
order by 成绩 desc---------查前两种最好成绩
-----------------select top 2 with ties 成绩 from 表
order by 成绩 desc---------查前两种最好成绩所有人的信息-----------------select top 1 a.成绩
from(select distinct top 3 成绩 from 表 order by 成绩 desc)as a order by 成绩---------嵌套查询,查考成绩第三名的值-----------------select max(SQL成绩),min(MCSE成绩)from 表-----查SQL最高分和MCSE最低分
-----常用的函数:max(最大),min(最小),sum(总和),avg(平均值)-----count(*)统计表内数据的行数。count(列名)统计表内列里非空值的行数-----------------select count(*)from 表名--------查表内有多少行数据-----------------select count(列名)from 表名------------查表内列中有多少行非空数据-----------------select min(成绩),max(成绩),sum(成绩),avg(成绩),count(*),count(成绩)from 表名--------返回显示数据只有一行。中间不能加列名,如想加,可以在后面加列。-----------------group by---------分组统计,后面跟的是列名
---------上面select检索多少原始列,后面group by就要跟多少原始列 例: select 性别,avg(年龄)from 表名
group by 性别-------统计性别的平均年龄
-----------------select 年龄,avg(年龄)from 表名 where 年龄<23 group by 年龄-------查年龄小于23岁的各年龄段平均年龄-------或也可用如下方法:
select 年龄,avg(年龄)from 表名 group by 年龄
having<23-------having是统计之后的条件,where是统计之前的条件--------having是做为group by的子句出现的,不能单独使用----------------select 年龄,avg(年龄)from 表名 where 年龄<23 group by all 年龄-------显示所有年龄,但只统计年龄小于23的,大于23的显示空值----------------select 品牌,颜色,sum(价格),avg(价格)from 汽车表 group by 品牌,颜色
with cube-------多维统计,按不同品牌不同颜色统计,也是group by的子句--------其结果出现把各品牌统计一下,最后再统计所有品牌、所有颜色的总统计----------------select 品牌,颜色,sum(价格),avg(价格)from 汽车表 group by 品牌,颜色
with rollup------只按第一列统计,也是group by的子句---------即统计品牌各颜色和所有品牌所有颜色的总统计----------------select 品牌,颜色,价格 from 汽车表
compute sum(价格),avg(价格)----------出现两个结果集------------查原始列,另外统计所有的总和与平均值
-----------------select 品牌,sum(价格),avg(价格)from 汽车表
group by 品牌------只对汽车品牌进行统计。进行分组的列不一定用来统计----------------select 品牌,颜色,价格 from 汽车表 order by 品牌
compute sum(价格),avg(价格)by 品牌
--------按品牌分组统计。分别显示品牌各款,然后再显示函数计算值----------------exists--------存在。相当于一个判断开关。说对了执行,说错了放弃 用法: select * form 表名
where exists(select * from 表名 where 性别='男')------如果存在性别为男的,执行查询。如果不存在,则不执行命令。---------------数据完整性:1.实体完整性----用unique(唯一)或主键控制,数据不能重复
2.值域完整性----用check控制。控制的是列中不能有非法数据
3.引用完整性----一列的取值完全依赖于前一列时,用这个。
4.用户自定义完整性
----------------create table 表名
(列1 int primary key,--------设置列级主键,紧跟在设置列的后面。列2 int)-----------------create table 表名(列1 int, 列2 int, primary key(列1))--------设置表级主键,放在建表语句的最后面。-----------------create table 表名
(列1 int constraint pk_表 primary key, 列2 int)
--------把列1设为主键,并且起名叫:pk_表。constraint是命名的命令
第三篇:数据库SQL语句十题
作业十题
1.查询所有学生的基本信息,并按学号降序排列
SELECT * FROM STUDENT
ORDER BY sno DESC;
2.查询系别代码为“02”的女同学信息
SELECT * FROM STUDENT
WHERE ssex=’女’ and sdept=‘02’;
3.查询学生的总人数
SELECT COUNT(*)AS 学生总人数
FROM STUDENT;
4.所有选修课学生的姓名,课程名及成绩
SELECT sname,cname,grade
FROM STUDENT,COURSE,SC
WHERE STUDENT.sno=SC.sno and COURSE.cno=SC.cno;
5.不及格学生姓名(合并重复项)
SELECT distinct sname
FROM SC,STUDENT
WHERE grade<=60 and STUDENT.sno=SC.sno;
6.查询学号为“011110”的学生的哪些课程的成绩比他数据库的成绩要高 SELECT cno
FROM COURSE
WHERE sno=’011110’ and grade>(SELECT grade FROM COURSE,SC
WHERE cname=’数据库’ and sno=‘011110’ and
COURSE.cno=SC.cno);
7.查询选修课在3门以上(包括3门)的学生学号及选课门数 SELECT sno,COUNT(*)AS 选修门数
FROM SC
GROUP BY sno HAVING COUNT(*)>=3;
8.查询学号为“011110”的学生的平均成绩,并以平均成绩命名 SELECT AVG(grade)AS average grade
FROM SC
WHERE sno=’011110’;
9.查询计算机系或英语系的所有学生的个人信息
SELECT*FROM STUDENT
WHERE sdeptIN(SELECT sdept FROM DEPT
WHERE sdname=’计算机系’OR sdname=’英语系’);
10.查询与“罗宇波”同一个系的学生情况
SELECT * FROM STUDENT
WHERE sdept=(SELECT sdept FROM STUDENT
WHERE sname=’罗宇波’);
第四篇:数据库查询语句关键字总结
看过牛腩视频后,前17集讲后台代码的编写,尤其讲到查询语句的时候,顿时感觉原来学习过的查询语句中用到的关键字烟消云散了,啥都不记得了,通过看视频,帮着回忆了一部分,在这里总结一下,查询语句中用到的关键字的含义及使用。
一、select语句(单个表)
1.最简单的查询:
select * from [where ] select column1,column2....from [where] 这里需要注意的是where子句中条件过滤使用到的关键字,比如用到逻辑运算符like 中的’%‘(匹配一个或多个字符)和’_‘(仅匹配一个)等。这个在新闻发布系统中也有用到。
例如:按标题搜索:
view sourceprint?
1.Select top 10 n.id,n.title,n.createtime,c.[name] 2.from news n inner join category c on c.caid=c.id 3.where n.title like '%' + @title + '%'
当然还有很多,例如between,not,in等关键字的使用也很重要。
2.DISTINCT关键字
这个关键字,主要用来取出列中唯一的值,比如:记录中的一个字段值(city)如果有重复(廊坊,北京,廊坊,北京),那么利用DISTINCT关键字取出唯一值,即任何重复的值只计数一次,结果为为:(廊坊,北京)。
view sourceprint?
1.select DISTINCT city from [table] 3.使用别名
利用别名可以显示我们想要的名字,方便阅读。select city as 城市 from...4.group by 和having子句
group by 用来对查询到的结果集进行分组,必须位于select语句中的from子句或where子句之后。
having子句类似于where子句,紧跟在group by子后,作为一个查询条件。与where子句的区别:where子句作用于一条记录中的查询条件,而having子句则作用于一列的查询条件
例如:
view sourceprint?
1.select location from citytable where city='北京'--查询城市名为‘北京’的城市的位置
2.select city group by city having count(memberId)>=3--查询城市成员总数大于等于3的城市,同时按城市名分组
二、多表查询
1、inner join 要求,查询的多张表中必须具有相同的匹配项。其中on表示作用的表的条件,n,c 为别名
view sourceprint?
1.Select *
2.From news n
3.Inner join category c 4.on c.caid=c.id
要执行的查询结果必须是在两张表中同时含有相同的类别号的记录才会被查询出来。例如:以牛腩视频中例子为例:
category表中id表示新闻类别的id,而news表中的caid则表示该新闻属于具体哪个类别
那么执行上面查询语句后的结果: inner join表
可以看到结果为类别号在两张表中均存在的项。inner join还包括等值联合和不等值,这主要由on后面的条件决定
2.left join 左外连接:连接时,on条件左边表所有项均查询出来,而右边表中若无匹配项,则以null代替
上面两张表,执行
view sourceprint?
1.select * from category c left join news n on c.id=n.caid
结果为:
3.right join 顾名思义,右外连接结果与left join相反,将右边表所有项查询出来,而左边表中无匹配项的则以null代替。
4.full join 无论左边还是右边所有项均返回结果。无对应项以null代替。
三、其它
除了以上涉及到的查询关键字外,还涉及到了嵌套查询,in关键字的使用,对sql记录进行编号排序后按顺序查询等。利用
view sourceprint?
1.SELECT ROW_NUMBER()OVER(ORDER BY id desc)AS Row--Row为别名
以上只是涉及到了一部分的查询关键字的总结,也是经常用到的,逐渐学习,才发现原来的知识还是应该不断的回忆和应用才能发现它更深一层应用的含义。更多关于数据库的知识有待进一步实践总结。
第五篇:数据库语句总结
实验四
1、建立数据库
createdatabaseTSJY on(name=TSJY, filename='E:TSJY.mdf', size=10MB, maxsize=100MB, filegrowth=1MB)logon(name='TSJY_log', filename='E:TSJYT.ldf', size=5MB, maxsize=50MB, filegrowth=1MB);
2、建表
useS_T createtableStudent(Snochar(11)notnullprimarykey, Snamechar(8)notnull, Ssexchar(2)notnull, SageTinyintnotnull, Sdeptchar(10)notnull check(Ccredit >=1 and Ccredit <=6)(学分取1-6的整数)check(Grade >=1 and Grade <=100)(成绩在0-100之间));
3、将course表的cpno的长度改为3 altertableCoursealtercolumncpnochar(3)
4、给student表中的ssex列的增加默认约束,默认值为“男”
altertableStudentaddconstraintdf_Student_Ssex default'男'forSsex;
5、为course表增加一列teacher,char(8)altertableCourseaddteacherchar(8);
6、删除course表的teacher列
altertableCoursedropcolumnteacher;
7、插入数据
insertintoS(SNO,SNAME,STATUS,CITY)values('S1','精益','20','天津'),('S2','盛锡','10','北京'),('S3','东方红','30','北京'),('S4','丰泰盛','20','天津'),('S5','为民','50','上海');
8、为S表设一个主键
altertableSaddprimarykey(SNO);
9、为S表增加一个唯一索引s_sno createuniqueindexs_snoonS(SNO);为SPJ表增加索引spj_sno_pno_jno,要求索引列sno用降序,pno、jno用升序
createindexspj_sno_pno_jnoonSPJ(SNOdesc,pno,jno);为HISD的Doctor表按医生ID(dID)升序建立唯一索引
createuniqueindex Dindex on Doctor(dID)
为HISD的Doctor表按医生ID(dID)降序建立唯一索引
createuniqueindex Dindex on Doctor(dID desc)
10、为SPJ表加外键约束(若建表时已经建立外键,可以先删除某个已有外键,重新建立
altertableSPJaddconstraintFK_SNOforeignkey(SNO)referencesS(SNO);altertableSPJaddconstraintFK_PNOforeignkey(PNO)referencesP(PNO);altertableSPJaddconstraintFK_JNOforeignkey(JNO)referencesJ(JNO);
11、为SPJ表增加列qty的检查约束,要求qty>0 altertableSPJaddconstraintCK_SPJ_qtycheck(qty>0);
12、删除SPJ表的检查约束CK_SPJ_qty altertableSPJdropconstraintCK_SPJ_qty
13、查询全体学生的学号与姓名
select Sno,Sname FROM Student
14、查询全体学生的基本信息
select * FROM Student
15、查询全体学生的姓名、出生年份及所在系
uses_t SELECTSname,year(getdate())-sagebirthyear,sdept FROMstudent
16、查询选修了课程的学生学号。(掌握distinct的用法)
SELECTdistinctSnoFROMSC
17、查询年龄在18-20岁间的06级的学生姓名及学号
SELECTSname,SnoFROMstudentWHERESageBETWEEN 18 AND 20 ANDSNOlike'2006%'
18、查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别
SELECT Sname,Ssex
FROM Student WHERE Sdept IN('IS','MA','CS');
19、查找所有姓李的学生的信息
SELECT*FROMstudentwhereSnamelike'李%' 20、查找所有已选修但没有成绩的学生学号。
selectSno fromSC whereGradeisnull
21、对所有已选课的学生按学号进行升序排列,同时要求每个学生按成绩降序排列。(掌握order by的用法)
selectSno,Grade fromSC orderbySno,Gradedesc
22、统计每门课程的选课人数。(掌握group by用法)
selectcourse.Cname,COUNT(sc.Cno)as人数
fromcourse,SC wherecourse.Cno=SC.Cno groupbyCname
23、统计重名的学生姓名及人数。
selectSname,COUNT(*)as人数 fromstudent groupbySname havingCOUNT(*)>1
24、统计男生与女生的人数。
selectssex,COUNT(sno)cnt fromstudent groupbyssex
25、查询“计算机系”年龄最大的学生的基本信息。
select* fromstudenta whereSage=(selectMAX(Sage)fromstudentb whereSdept='计算机系')
实验五
26、打出所有供应商的姓名和所在城市。
useSPJ selectSNAME,CITY froms
27、找出所有零件的名称及重量。
useSPJ selectPNAME,WEIGHT fromp
28、统计每个供应商供应的各种零件数量。
selectPNAME,COUNT(PNAME)cnt fromP,SPJ whereP.PNO=SPJ.PNO groupbyPNAME
29、求供应工程J1零件的供应商号码SNO。
useSPJ selectdistinctsno fromspj wherejno='j1' 30、求供应工程J1零件P1的的供应商号码SNO。
useSPJ selectdistinctsno fromspj wherejno='j1'andpno='p1' 实验六
31、求所在的城市为直辖市的供应商的名称。
selectSnamefromswherecityin('北京','天津','重庆','上海')
32、求供应红色零件的供应商号,零件号和数量。
selectSNO,PNO,QTYFROMSPJ wherePnoIN(SELECTpnoFROMp whereColor='红')
33、没有使用天津供应商生产的红色零件的工程号JNO。
selectdistinctJNOfromSPJwhereJNOnotin(selectJNOfromSPJ,P,SwhereSPJ.PNO=P.PNO
andSPJ.SNO=S.SNOandP.COLOR='红'andS.CITY='天津')
34、求供应数量超过300的供应信息,包括供应商名,零件名,项目名和供应数量。
selectSNAME,PNAME,JNAME,QTYfromSPJ,S,P,J whereS.SNO=SPJ.SNOandP.PNO=SPJ.PNO
andJ.JNO=SPJ.JNOandQTY>300
35、至少使用了供应商S1所供应的全部零件的工程号JNO。
selectPNOfromSPJwhereSNO='S1';selectJNOfromSPJwhere(PNO='P1'andSNO='S1')intersectselectJNOfromSPJwhere(PNO='P2'andSNO='S1')
36、找出使用供应商S1所提供零件的工程号码。
selectdistinctJNOfromSPJwhereSNO='S1'
37、找出工程项目J2使用的各种零件的名称及其重量。
selectPNAME,WEIGHTfromP,SPJ whereSPJ.PNO=P.PNOandJNO='J2'
38、找出上海厂商供应的所有零件号码。
selectPNOfromS,SPJwhereS.SNO=SPJ.SNO andS.CITY='上海'groupbyPNO
39、找出使用上海产的零件的工程名称。
selectJNOfromS,SPJ whereS.SNO=SPJ.SNOandS.CITY='上海' groupbyJNO
40、找出没有使用天津产的零件的工程号码。
selectJNOfromSPJwhereSPJ.JNOnotin(selectJNOfromS,SPJwhereS.SNO=SPJ.SNOands.CITY='天津')
41、查询‘IS’系学生的学号、所选课程名称及该门课程的成绩。
selectSC.Sno,Cname,GradefromSC,Course,student wherestudent.Sno=SC.SnoandCourse.Cno=SC.CnoandSdept='数学系'
42、查询‘CS’系成绩不及格的学生姓名。
selectdistinctSnamefromStudent,SC wherestudent.Sno=SC.SnoandGrade<60 andSdept='计算机系'
43、查询每一门的课程的间接先修课程。
selectfirst.Cno,second.Cpno fromCoursefirst,Coursesecond wherefirst.Cpno=second.Cno
44、查询所有的学生的选课情况,要求没有选课的情况也能在结果显示出来。
selectStudent.*,sc.CnoFROMStudentLEFTJoinSCon SC.Sno=Student.Sno
45、查询每个学生超过他选修课程平均成绩的课程号,课程名称及成绩。
selectx.Cno,Cname,Grade
fromSCx,Coursewherex.Cno=Course.CnoandGrade>(selectAVG(Grade)fromSCywherex.Sno=y.Sno)
46、查询‘IS’系的学生以及‘数据库系统原理’成绩在70~80之间的学生。
selectSnamefromStudent,Course,SC
whereStudent.Sno=SC.SnoandCourse.Cno=SC.Cno andCourse.Cname='数据库系统原理'andGradebetween'70'and'80' andSdept='数学系'
47、用两种方法实现:选修了001课程和002课程的学生学号。
方法一:selectSnofromSCwhereCno='1'intersect selectSnofromSCwhereCno='2' 方法二:selectSnofromSCwhereCno='2'andSnoin(selectSnofromSCwhereCno='1')
48、查询至少选修了学生001课程和002课程的学生学号。
selectdistinctSnofromSCAwherenotexists(select*fromSCBwhere(Cno='1'orCno='2')andnotexists(select*fromSCCwhereC.Sno=A.Sno andC.Sno=B.Sno))实验七
49、建一新表,并将所有学生的学生的学号、平均成绩增加到其中。
createtableavgrade(snochar(11)primarykeynotnull, avgranumeric(3,1))insertintoavgrade(sno,avgra)selectsno,avg(Grade)fromSCgroupbySno 50、假设所有的学生都选了‘008‘课程,如何将记录插入选修表中。
insertintoSC(sno,cno)selectsno,'008' fromstudent
51、将所有CS系的成绩不及格学生的成绩加5分。
updateSC setgrade=grade+5 where'计算机系'=(selectsdept fromstudent,sc
wherestudent.Sno=sc.Snoandgrade<60)
52、删除选了‘数据库’数据库的学生的选课记录。
delete fromSC wherecno=(selectcnofromcoursewhereCname='数据库')
53、删除所有的学生记录。
delete
fromstudent
54、把全部红色零件的颜色改成蓝色。
updatep setcolor='蓝' wherecolor='红'
55、由S5供给J4的零件P6改为由S3供应。
updatespj setsno='s3' wheresno='s5'andjno='j4'andpno='p6'
56、从供应商关系中删除供应商号是S2的记录,并从供应情况关系中删除相应的记录。
deletefroms wheresno='s2' deletefromSPJ wheresno='s2'
57、请将(S2,J6,P4,200)插入供应情况关系。
insertintospj(sno,pno,jno,qty)values('s2','j6','p4','200')
实验八
58、为“图书”的“分类号”建立一个索引ts_flh。
createindexts_flhontushu(fenleihao)
59、为“借阅”表建立一唯一索引jycx,要求按“借书证号”升序,“借书日期”降序。
createindexjycxonjieyue(cardID,jdatedesc)
60、为“管理员”表建立一检查约束,要求“基本工资”在(100,10000)之间。
altertableadministratoraddconstraintCK_administrator_gongzi
check(gongzibetween 100 and 10000)
61、建立“借阅”与“图书”及“读者”表之间的参照关系。(增加借阅表的外键约束)
altertablejieyueaddconstraintFK_IDforeign key(ID)referencestushu(ID)altertablejieyueaddconstraintFK_cardIDforeign key(cardID)referencesduzhe(cardID)
62、查询出“图书”数据库中作者姓“刘”的所有图书。SELECT*FROMtushuwherewriterlike'刘%'
63、查询出“图书”数据库中高等教育出版社出版的、单价低于25元的所有种类的图书。
select*fromtushuwhereaddress='高等教育出版社'andprice<25 64、求出“读者”数据库中的总人数。
selectCOUNT(*)fromduzhe 65、求出“图书”数据库中的所有图书的最高价、最低价和平均价。
selectMAX(price)as最高价,MIN(price)as最低价,AVG(price)as平均价fromtushu 66、求出“借阅”库中借书证号为“112”的所借图书的册数。
selectcardID,COUNT(*)as册数fromjieyuewherecardID='112'groupbycardID 67、按分类号降序显示“图书”库中各种图书的分类号、书名合作者。
selectfenleihao,bookname,writerfromtushuorderbyfenleihaodesc 68、按单价升序显示“图书”库中的高等教育出版社出版的所有图书。
select*fromtushuwhereaddress='高等教育出版社'orderbyprice
69、按单价升序显示出“图书”库中由清华大学出版社和电子工业出版社出版的所有图书。
select*fromtushuwhere(address='高等教育出版社'oraddress='电子工业出版社')orderbyprice 70、按书名和作者分组统计出“图书”库中每种图书的数量。
selectbookname,writer,COUNT(*)as数量fromtushugroupbybookname,writer 71、统计出“图书”数据库中15至25元之间的图书数量。
selectcount(*)as数量fromtushuwherepricebetween 15 and 25 72、查询出“图书”数据库中书名中含有“应用基础”字串的所有图书。
select*fromtushuwherebooknamelike'应用基础%' 73、分组统计出“借阅”数据库中每一种借书证号所借图书的册数。
selectcardID,COUNT(*)as册数fromjieyuegroupbycardID 74、按单位分组统计出“读者”数据库中每个单位的人数。
selectdanwei,COUNT(*)as人数fromduzhegroupbydanwei
75、分组统计出1997年底以前借阅不低于2本图书的借书证号和数量。
selectcardID,COUNT(*)as人数fromjieyuewherejdate<'1997-12-31' groupbycardIDhavingcount(*)>=2 76、联接查询“借阅”库和“图书”,得到借阅每一本书的信息。
select*fromtushu,jieyuewheretushu.ID=jieyue.ID
77、联接查询“借阅”库和“读者”库,得到每一个以借阅者的借书证号、姓名、单位。
selectduzhe.cardID,name,danweifromduzhe,jieyuewhereduzhe0..cardID=jieyue.cardID
78、联接查询“借阅”、“读者”、“图书”三个库,得到每一本所借图书的读者的借书证号、姓名、单位、书名。
selectduzhe.cardID,name,danwei,booknamefromduzhe,jieyue,tushu
whereduzhe.cardID=jieyue.cardIDandtushu.ID=jieyue.ID 79、从“图书”数据库中(通过对“借阅”库的嵌套)查询出所有被借图书的信息。
select*fromtushuwhereIDin(selectIDfromjieyue)80、按单位分组统计出被借图书的数量。
selectdanwei,COUNT(*)as数量fromduzhe,jieyuewhereduzhe.cardID=jieyue.cardIDgroupbydanwei 81、按单位分组统计出借阅图书的人数。
selectdanwei,COUNT(*)as人数fromduzhewherecardIDin(selectdistinctcardIDfromjieyue)groupbydanwei 82、从读者库中查询出每个借阅图书的读者的情况。
select*fromduzhewherecardIDin(selectdistinctcardIDfromjieyue)83、查询‘管理员’表中职称为教授或副教授,并且在1950年(含该年)以后出生的所有职工记录。
select*fromadministratorwherezhicheng='教授'orzhicheng='副教授'andbirth<=1950 84、查询‘管理员’表中基本工资在250到380元之间的职工记录。
select*fromadministratorwheregongzibetween 250 and 380 85、将基本工资小于500的管理员,工资加上100元。
updateadministratorsetgongzi=gongzi+100 wheregongzi<500
86、列出藏书在十本以上的图书(书名、作者、出版社)。
selectbookname,writer,addressfromtushuwherecangshuliang>10
87、“数据库系统原理教程,王珊编,清华大学出版社,1998年出版”还有几本?
selectkucunfromtushuwherebookname='数据库系统'andwriter='王瑞'andaddress='清华大学出版社' 实验九
88、请为三建工程项目建立一个供应情况的视图,包括供应商代码(SNO)、零件代码(PNO)、供应数量(QTY)。针对该视图完成下列查询:
CREATEVIEWVSPASSELECTSNO,PNO,QTYFROMSPJ,JWHERESPJ.JNO=J.JNOANDJ.JNAME='三建'
89、找出三建工程项目使用的各种零件代码及其数量。
SELECTPNO,sum(QTY)FROMVSPgroupbyPNO 90、找出供应商S1的供应情况。
SELECTdistinct*FROMVSPWHERESNO='S1' 91、建立信息系学生的视图(用with check option子句),并向该视图中插入类似以下的语句:
insert into is_student1(sno,sname,sage)values(‘20051100101’,‘王一’,20)
是否合理?如何更改?
createviewIS_student as selectsno,sname,sagefromstudent wheresdept='IS' withcheckoption 不合理(sno,sname,sage)不用
92、建立信息系选修了001号课程的学生的视图。
createviewIS_S1 as selectstudent.sno,sname,gradefromstudent,sc wheresdept='IS'andstudent.sno=sc.snoandcno='1' 93、在第(2)题创建的视图的基础上建立信息系选修了1号课程且成绩在90分以上的学生的视图。
createviewIS_S2 as
selectstudent.sno,sname,gradefromstudent,sc wheresdept='IS'andstudent.sno=sc.snoandcno='2'andGrade>=90 94、试图删除“选修”表(SC表),看看第(2)题与第(3)题建立的视图是否存在。
deletefromSC 不存在