① sql sever 查询30到50条数据
id也许不是连续的,那就说明这个表是用id来排序,知道这个前提就很容易了,使用两次top再加上排序就可以实现。
selecttop20*from
(selecttop50*fromtable)tb1
orderbyiddesc
这个查询就能得到30到50条的记录,不过现在出来是50-30的记录,需要顺序再按照id排个序就出来了
② 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_admpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' --- 开始 备份 BACKUP DATABASE pubs TO testBack
创建新表
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
删除新表
drop table tabname
增加一个列
Alter table tabname add column col type 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
添加主键
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语句
选择: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%’ (所有包含‘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[separator]
几个高级查询运算词
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: 全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
[编辑本段]提升
复制表
(只复制结构,源表名:a 新表名:b) (Access可用) 法一:select * into b from a where 1<>1 法二:select top 0 * into b from a
拷贝表
(拷贝数据,源表名:a 目标表名:b) (Access可用) insert into b(a, b, c) select d,e,f from b;
跨数据库之间表的拷贝
(具体数据使用绝对路径) (Access可用) insert into b(a, b, c) select d,e,f from b 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 * form 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 15 * from table order by id asc) table_别名 order by id desc
数据类型转换
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 安定 '+ @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
SQL SERVER中直接循环写入数据
declare @i int set @i=1 while @i<30 begin insert into test (userid) values(@i) set @i=@i+1 end
③ 50分求条sql语句。
select item_no,max(item_date) from table where item_no=24234
group by item_no
如果不确认,那么把where item_no=24234 去掉就可以了
select item_no,max(item_date) from table
group by item_no
④ 50分求一条SQL语句
select * from table1 a,table2 b where a,userid=b.userid and a.userid=传进参数1 and actid =传进参数2 and (a.endtime>现在的时间 or b.endtime >现在的时间)
估计是这个意思吧?
⑤ 查询前五十条记录的SQL语句,并分析
SELECT TOP 50 s.SNO,s.SNAME,c.CON,c.CNAME,t.TNO,t.TNAME
FROM S s,SC sc,C c,T t
WHERE s.SNO = sc.SNO AND sc.CNO = c.CNO AND c.TNO=t.TNO
遇到这种关系到多个表的查询,一般最好是用多表连接
⑥ SQL如何删除50条以后的数据
方法有很多了,不管哪种,主要在排序上
建议建一个自动编号列,或者时间记录列(时间使用getdate()获取)
1,建一个触发器,插入一条,删除一条,对应就好了
2,如果不用实时删除,保留排序后的50行就可以了
⑦ 求比较完整的SQL语句``高手进`
掌握SQL四条最基本的数据操作语句:Insert,Select,Update和Delete。
练掌握SQL是数据库用户的宝贵财 富。在本文中,我们将引导你掌握四条最基本的数据操作语句—SQL的核心功能—来依次介绍比较操作符、选择断言以及三值逻辑。当你完成这些学习后,显然你已经开始算是精通SQL了。
在我们开始之前,先使用CREATE TABLE语句来创建一个表(如图1所示)。DDL语句对数据库对象如表、列和视进行定义。它们并不对表中的行进行处理,这是因为DDL语句并不处理数据库中实际的数据。这些工作由另一类SQL语句—数据操作语言(DML)语句进行处理。
SQL中有四种基本的DML操作:INSERT,SELECT,UPDATE和DELETE。由于这是大多数SQL用户经常用到的,我们有必要在此对它们进行一一说明。在图1中我们给出了一个名为EMPLOYEES的表。其中的每一行对应一个特定的雇员记录。请熟悉这张表,我们在后面的例子中将要用到它。
INSERT语句
用户可以用INSERT语句将一行记录插入到指定的一个表中。例如,要将雇员John Smith的记录插入到本例的表中,可以使用如下语句:
INSERT INTO EMPLOYEES VALUES
('Smith','John','1980-06-10',
'Los Angles',16,45000);
通过这样的INSERT语句,系统将试着将这些值填入到相应的列中。这些列按照我们创建表时定义的顺序排列。在本例中,第一个值“Smith”将填到第一个列LAST_NAME中;第二个值“John”将填到第二列FIRST_NAME中……以此类推。
我们说过系统会“试着”将值填入,除了执行规则之外它还要进行类型检查。如果类型不符(如将一个字符串填入到类型为数字的列中),系统将拒绝这一次操作并返回一个错误信息。
如果SQL拒绝了你所填入的一列值,语句中其他各列的值也不会填入。这是因为SQL提供对事务的支持。一次事务将数据库从一种一致性转移到另一种一致性。如果事务的某一部分失败,则整个事务都会失败,系统将会被恢复(或称之为回退)到此事务之前的状态。
回到原来的INSERT的例子,请注意所有的整形十进制数都不需要用单引号引起来,而字符串和日期类型的值都要用单引号来区别。为了增加可读性而在数字间插入逗号将会引起错误。记住,在SQL中逗号是元素的分隔符。
同样要注意输入文字值时要使用单引号。双引号用来封装限界标识符。
对于日期类型,我们必须使用SQL标准日期格式(yyyy-mm-dd),但是在系统中可以进行定义,以接受其他的格式。当然,2000年临近,请你最好还是使用四位来表示年份。
既然你已经理解了INSERT语句是怎样工作的了,让我们转到EMPLOYEES表中的其他部分:
INSERT INTO EMPLOYEES VALUES
('Bunyan','Paul','1970-07-04',
'Boston',12,70000);
INSERT INTO EMPLOYEES VALUES
('John','Adams','1992-01-21',
'Boston',20,100000);
INSERT INTO EMPLOYEES VALUES
('Smith','Pocahontas','1976-04-06',
'Los Angles',12,100000);
INSERT INTO EMPLOYEES VALUES
('Smith','Bessie','1940-05-02',
'Boston',5,200000);
INSERT INTO EMPLOYEES VALUES
('Jones','Davy','1970-10-10',
'Boston',8,45000);
INSERT INTO EMPLOYEES VALUES
('Jones','Indiana','1992-02-01',
'Chicago',NULL,NULL);
在最后一项中,我们不知道Jones先生的工薪级别和年薪,所以我们输入NULL(不要引号)。NULL是SQL中的一种特殊情况,我们以后将进行详细的讨论。现在我们只需认为NULL表示一种未知的值。
有时,像我们刚才所讨论的情况,我们可能希望对某一些而不是全部的列进行赋值。除了对要省略的列输入NULL外,还可以采用另外一种INSERT语句,如下:
INSERT INTO EMPLOYEES(
FIRST_NAME, LAST_NAME,
HIRE_DATE, BRANCH_OFFICE)
VALUE(
'Indiana','Jones',
'1992-02-01','Indianapolis');
这样,我们先在表名之后列出一系列列名。未列出的列中将自动填入缺省值,如果没有设置缺省值则填入NULL。请注意我们改变了列的顺序,而值的顺序要对应新的列的顺序。如果该语句中省略了FIRST_NAME和LAST_NAME项(这两项规定不能为空),SQL操作将失败。
让我们来看一看上述INSERT语句的语法图:
INSERT INTO table
[(column { ,column})]
VALUES
(columnvalue [{,columnvalue}]);
和前一篇文章中一样,我们用方括号来表示可选项,大括号表示可以重复任意次数的项(不能在实际的SQL语句中使用这些特殊字符)。VALUE子句和可选的列名列表中必须使用圆括号。
SELECT语句
SELECT语句可以从一个或多个表中选取特定的行和列。因为查询和检索数据是数据库管理中最重要的功能,所以SELECT语句在SQL中是工作量最大的部分。实际上,仅仅是访问数据库来分析数据并生成报表的人可以对其他SQL语句一窍不通。
SELECT语句的结果通常是生成另外一个表。在执行过程中系统根据用户的标准从数据库中选出匹配的行和列,并将结果放到临时的表中。在直接SQL(direct SQL)中,它将结果显示在终端的显示屏上,或者将结果送到打印机或文件中。也可以结合其他SQL语句来将结果放到一个已知名称的表中。
SELECT语句功能强大。虽然表面上看来它只用来完成本文第一部分中提到的关系代数运算“选择”(或称“限制”),但实际上它也可以完成其他两种关系运算—“投影”和“连接”,SELECT语句还可以完成聚合计算并对数据进行排序。
SELECT语句最简单的语法如下:
SELECT columns FROM tables;
当我们以这种形式执行一条SELECT语句时,系统返回由所选择的列以及用户选择的表中所有指定的行组成的一个结果表。这就是实现关系投影运算的一个形式。
让我们看一下使用图1中EMPLOYEES表的一些例子(这个表是我们以后所有SELECT语句实例都要使用的。而我们在图2和图3中给出了查询的实际结果。我们将在其他的例子中使用这些结果)。
假设你想查看雇员工作部门的列表。那下面就是你所需要编写的SQL查询:
SELECT BRANCH_OFFICE FROM EMPLOYEES;
以上SELECT语句的执行将产生如图2中表2所示的结果。
由于我们在SELECT语句中只指定了一个列,所以我们的结果表中也只有一个列。注意结果表中具有重复的行,这是因为有多个雇员在同一部门工作(记住SQL从所选的所有行中将值返回)。要消除结果中的重复行,只要在SELECT语句中加上DISTINCT子句:
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES;
这次查询的结果如表3所示。
现在已经消除了重复的行,但结果并不是按照顺序排列的。如果你希望以字母表顺序将结果列出又该怎么做呢?只要使用ORDER BY子句就可以按照升序或降序来排列结果:
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES
ORDER BY BRANCH_OFFICE ASC;
这一查询的结果如表4所示。请注意在ORDER BY之后是如何放置列名BRANCH _OFFICE的,这就是我们想要对其进行排序的列。为什么即使是结果表中只有一个列时我们也必须指出列名呢?这是因为我们还能够按照表中其他列进行排序,即使它们并不显示出来。列名BRANCH_ OFFICE之后的关键字ASC表示按照升序排列。如果你希望以降序排列,那么可以用关键字DESC。
同样我们应该指出ORDER BY子句只将临时表中的结果进行排序;并不影响原来的表。
假设我们希望得到按部门排序并从工资最高的雇员到工资最低的雇员排列的列表。除了工资括号中的内容,我们还希望看到按照聘用时间从最近聘用的雇员开始列出的列表。以下是你将要用到的语句:
SELECT BRANCH_OFFICE,FIRST_NAME,
LAST_NAME,SALARY,HIRE_DATE
FROM EMPLOYEES
ORDER BY SALARY DESC,
HIRE_DATE DESC;
这里我们进行了多列的选择和排序。排序的优先级由语句中的列名顺序所决定。SQL将先对列出的第一个列进行排序。如果在第一个列中出现了重复的行时,这些行将被按照第二列进行排序,如果在第二列中又出现了重复的行时,这些行又将被按照第三列进行排序……如此类推。这次查询的结果如表5所示。
将一个很长的表中的所有列名写出来是一件相当麻烦的事,所以SQL允许在选择表中所有的列时使用*号:
SELECT * FROM EMPLOYEES;
这次查询返回整个EMPLOYEES表,如表1所示。
下面我们对开始时给出的SELECT语句的语法进行一下更新(竖直线表示一个可选项,允许在其中选择一项。):
SELECT [DISTINCT]
(column [{, columns}])| *
FROM table [ {, table}]
[ORDER BY column [ASC] | DESC
[ {, column [ASC] | DESC }]];
定义选择标准
在我们目前所介绍的SELECT语句中,我们对结果表中的列作出了选择但返回的是表中所有的行。让我们看一下如何对SELECT语句进行限制使得它只返回希望得到的行:
SELECT columns FROM tables [WHERE predicates];
WHERE子句对条件进行了设置,只有满足条件的行才被包括到结果表中。这些条件由断言(predicate)进行指定(断言指出了关于某件事情的一种可能的事实)。如果该断言对于某个给定的行成立,该行将被包括到结果表中,否则该行被忽略。在SQL语句中断言通常通过比较来表示。例如,假如你需要查询所有姓为Jones的职员,则可以使用以下SELECT语句:
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones';
LAST_NAME = 'Jones'部分就是断言。在执行该语句时,SQL将每一行的LAST_NAME列与“Jones”进行比较。如果某一职员的姓为“Jones”,即断言成立,该职员的信息将被包括到结果表中(见表6)。
使用最多的六种比较
我们上例中的断言包括一种基于“等值”的比较(LAST_NAME = 'Jones'),但是SQL断言还可以包含其他几种类型的比较。其中最常用的为:
等于 =
不等于 <>
小于 <
大于 >
小于或等于 <=
大于或等于 >=
下面给出了不是基于等值比较的一个例子:
SELECT * FROM EMPLOYEES
WHERE SALARY > 50000;
这一查询将返回年薪高于$50,000.00的职员(参见表7)。
逻辑连接符
有时我们需要定义一条不止一种断言的SELECT语句。举例来说,如果你仅仅想查看Davy Jones的信息的话,表6中的结果将是不正确的。为了进一步定义一个WHERE子句,用户可以使用逻辑连接符AND,OR和NOT。为了只得到职员Davy Jones的记录,用户可以输入如下语句:
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones' AND FIRST_NAME = 'Davy';
在本例中,我们通过逻辑连接符AND将两个断言连接起来。只有两个断言都满足时整个表达式才会满足。如果用户需要定义一个SELECT语句来使得当其中任何一项成立就满足条件时,可以使用OR连接符:
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones' OR LAST_NAME = 'Smith';
有时定义一个断言的最好方法是通过相反的描述来说明。如果你想要查看除了Boston办事处的职员以外的其他所有职员的信息时,你可以进行如下的查询:
SELECT * FROM EMPLOYEES
WHERE NOT(BRANCH_OFFICE = 'Boston');
关键字NOT后面跟着用圆括号括起来的比较表达式。其结果是对结果取否定。如果某一职员所在部门的办事处在Boston,括号内的表达式返回true,但是NOT操作符将该值取反,所以该行将不被选中。
断言可以与其他的断言嵌套使用。为了保证它们以正确的顺序进行求值,可以用括号将它们括起来:
SELECT * FROM EMPLOYEES
WHERE (LAST_NAME = 'Jones'
AND FIRST_NAME = 'Indiana')
OR (LAST_NAME = 'Smith'
AND FIRST_NAME = 'Bessie');
SQL沿用数学上标准的表达式求值的约定—圆括号内的表达式将最先进行求值,其他表达式将从左到右进行求值。
以上对逻辑连接符进行了说明,在对下面的内容进行说明之前,我们再一次对SELECT语句的语法进行更新:
SELECT [DISTINCT]
(column [{, column } ] )| *
FROM table [ { , table} ]
[ORDER BY column [ASC] | [DESC
[{ , column [ASC] | [DESC } ] ]
WHERE predicate [ { logical-connector predicate } ];
NULL和三值逻辑
在SQL中NULL是一个复杂的话题,关于NULL的详细描述更适合于在SQL的高级教程而不是现在的入门教程中进行介绍。但由于NULL需要进行特殊处理,并且你也很可能会遇到它,所以我们还是简略地进行一下说明。
首先,在断言中进行NULL判断时需要特殊的语法。例如,如果用户需要显示所有年薪未知的职员的全部信息,用户可以使用如下SELECT语句:
SELECT * FROM EMPLOYEES
WHERE SALARY IS NULL;
相反,如果用户需要所有已知年薪数据的职员的信息,你可以使用以下语句:
SELECT * FROM EMPLOYEES
WHERE SALARY IS NOT NULL;
请注意我们在列名之后使用了关键字IS NULL或IS NOT NULL,而不是标准的比较形式:COLUMN = NULL、COLUMN <> NULL或是逻辑操作符NOT(NULL)。
这种形式相当简单。但当你不明确地测试NULL(而它们确实存在)时,事情会变得很混乱。
例如,回过头来看我们图1中的EM-PLOYEES表,可以看到Indiana Jones的工薪等级或年薪值都是未知的。这两个列都包含NULL。可以想象运行如下的查询:
SELECT * FROM EMPLOYEES
WHERE GRADE <= SALARY;
此时,Indiana Jones应该出现在结果表中。因为NULL都是相等的,所以可以想象它们是能够通过GRADE小于等于SALARY的检查的。这其实是一个毫无疑义的查询,但是并没有关系。SQL允许进行这样的比较,只要两个列都是数字类型的。然而,Indiana Jones并没有出现在查询的结果中,为什么?
正如我们早先提到过的,NULL表示未知的值(而不是象某些人所想象的那样表示一个为NULL的值)。对于SQL来说意味着这个值是未知的,而只要这个值为未知,就不能将其与其他值比较(即使其他值也是NULL)。所以SQL允许除了在true 和false之外还有第三种类型的真值,称之为“非确定”(unknown)值。
如果比较的两边都是NULL,整个断言就被认为是非确定的。将一个非确定断言取反或使用AND或OR与其他断言进行合并之后,其结果仍是非确定的。由于结果表中只包括断言值为“真”的行,所以NULL不可能满足该检查。从而需要使用特殊的操作符IS NULL和IS NOT NULL。
UPDATE语句
UPDATE语句允许用户在已知的表中对现有的行进行修改。
例如,我们刚刚发现Indiana Jones的等级为16,工资为$40,000.00,我们可以通过下面的SQL语句对数据库进行更新(并清除那些烦人的NULL)。
UPDATE EMPLOYEES
SET GRADE = 16, SALARY = 40000
WHERE FIRST_NAME = 'Indiana'
AND LAST_NAME = 'Jones';
上面的例子说明了一个单行更新,但是UPDATE语句可以对多行进行操作。满足WHERE条件的所有行都将被更新。如果,你想让Boston办事处中的所有职员搬到New York,你可以使用如下语句:
UPDATE EMPLOYEES
SET BRANCH_OFFICE = 'New York'
WHERE BRANCH_OFFICE = 'Boston';
如果忽略WHERE子句,表中所有行中的部门值都将被更新为'New York'。
UPDATE语句的语法流图如下面所示:
UPDATE table
SET column = value [{, column = value}]
[ WHERE predicate [ { logical-connector predicate}]];
DELETE语句
DELETE语句用来删除已知表中的行。如同UPDATE语句中一样,所有满足WHERE子句中条件的行都将被删除。由于SQL中没有UNDO语句或是“你确认删除吗?”之类的警告,在执行这条语句时千万要小心。如果决定取消Los Angeles办事处并解雇办事处的所有职员,这一卑鄙的工作可以由以下这条语句来实现:
DELETE FROM EMPLOYEES
WHERE BRANCH_OFFICE = 'Los Angeles';
如同UPDATE语句中一样,省略WHERE子句将使得操作施加到表中所有的行。
DELETE语句的语法流图如下面所示:
DELETE FROM table
[WHERE predicate [ { logical-connector predicate} ] ];
现在我们完成了数据操作语言(DML)的主要语句的介绍。我们并没有对SQL能完成的所有功能进行说明。SQL还提供了许多的功能,如求平均值、求和以及其他对表中数据的计算,此外SQL还能完成从多个表中进行查询(多表查询,或称之为连接)的工作。这种语言还允许你使用GRANT和REVOKE命令控制使用者的数据访问权限。
⑧ sql 语句大全
1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_admpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_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/cross (outer) join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
12、分组:Group by:
一张表,一旦分组 完成后,查询后只能得到组相关的信息。
组相关的信息:(统计信息) count,sum,max,min,avg 分组的标准)
在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据
在selecte统计函数中的字段,不能和普通的字段放在一起;
13、对数据库进行操作:
分离数据库: sp_detach_db;附加数据库:sp_attach_db 后接表明,附加需要完整的路径名
14.如何修改数据库的名称:
sp_renamedb 'old_name', 'new_name'
⑨ 一个SQL菜鸟,想学习前辈的经典一点的SQL语句,高分回报!50+50
/*student(学号#,姓名,性别,年龄)
course(课程号#,课程名,教师号#)
score(学号#,课程号#,成绩)
teacher(教师号#,教师名)*/
--1.查询“001”课程比“002”课程成绩高的所有学生的学号
select a.stuNo from score a,score b
where a.cNo='c001' and b.cNo='c002' and a.stuNo=b.stuNo and a.score>b.score
--2.查询平均成绩大于60分的同学的学号和平均成绩
select stuNo,avg(score)from score
group by stuNo
having avg(score)>60
--3.查询所有同学的学号、姓名、选课数、总成绩
select a.stuNo,a.stuName,count(cNo),sum(score) from student a,score b
where a.stuNo=b.stuNo
group by a.stuNo,a.stuName
--4.查询姓“赵”的老师的个数
select count(tName),tName from teacher
where tName like '赵%'
group by tName
--5.查询没学过“某某”老师课的同学的学号、姓名
select stuNo,stuName from student
where stuNo not in
(select a.stuNo from student a,score b where a.stuNo=b.stuNo and cNo in
(select d.cNo from teacher c,course d where c.tNo=d.tNo and c.tName='钱市保'))
--6.查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
select a.stuNo,a.stuName from student a,score b,score c
where a.stuNo=b.stuNo and b.stuNo=c.stuNo and b.cNo='c001' and c.cNo='c002'
--7.查询学过“某某”老师所教的所有课的同学的学号、姓名
select stuNo,stuName from student
where stuNo in (select stuNo from score a,course b,teacher c
where a.cNo=b.cNo and b.tNo=c.tNo and c.tName='钱市保'
group by stuNo
having count(a.cNo)>=(select count(cNo) from course d,teacher e
where d.tNo=e.tNo and e.tName='钱市保'))
--老师所教课程为一门课
select stuNo,stuName from student
where stuNo in (select a.stuNo from student a,score b where a.stuNo=b.stuNo and b.cNo in
(select cNo from teacher c,course d where c.tNo=d.tNo and c.tName='钱市保'))
--8.查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名
select stuNo,stuName from student
where stuNo in
(select a.stuNo from score a,score b
where a.cNo='c001' and b.cNo='c002' and a.stuNo=b.stuNo and a.score>b.score)
--9.查询所有课程成绩小于60分的同学的学号、姓名
select stuNo,stuName from student
where stuNo in (select stuNo from score
where score<60
group by stuNo
having count(cNo)=(select count(cNo) from course))
--10.查询没有学全所有课的同学的学号、姓名
select b.stuNo,a.stuName,count(b.cNo) from student a,score b
where a.stuNo=b.stuNo
group by b.stuNo,a.stuName
having count(b.cNo)<(select count(cNo) from course)
--11.查询至少有一门课与学号为“1”的同学所学相同的同学的学号和姓名
select distinct a.stuNo,stuName from student a,score b
where a.stuNo=b.stuNo and cNo in (select cNo from score
where stuNo='001')
--12.查询至少学过学号为“001”同学一门课的其他同学学号和姓名
&&& select distinct a.stuNo,stuName from student a,score b
where a.stuNo=b.stuNo and cNo all join (select cNo from score
where stuNo='001')
--13.把“SC”表中“某某”老师教的课的成绩都更改为此课程的平均成绩
update score set score=savg
from score d,(select avg(score) as savg,a.cNo from score a,course b,teacher c
where a.cNo=b.cNo and b.tNo=c.tNo and tName='钱市保'
group by a.cNo) e
where d.cNo=e.cNo
--老师所教课程为一门课
update score
set score=(select avg(score) from score
group by cNo
having cNo=(select a.cNo from course a,teacher b where a.tNo=b.tNo and b.tName='钱市保'))
where cNo=(select a.cNo from course a,teacher b where a.tNo=b.tNo and b.tName='钱市保')
select * from score
--14.查询和“001”号的同学学习的课程完全相同的其他同学学号和姓名
select stuNo from score
where cNo in (select cNo from score where stuNo='005')
group by stuNo
having count(cNo)=(select count(*) from score where stuNo='005')
--15.删除学习“某某”老师课的SC表记录
delete from score where cNo=(select cNo from course a,teacher b where a.tNo=b.tNo and b.tName='钱市保')
select * from score
--16.向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、2号课的平均成绩
--17.按平均成绩从高到低显示所有学生的“C语言”、“sql”、“java”三门的课程成绩
--按如下形式显示: 学生ID,C语言,sql,JAVA,有效课程数,有效平均分
--18.查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
select cNo,max(score) as 最高分,min(score) as 最低分 from score
group by cNo
--19.按各科平均成绩从低到高和及格率的百分数从高到低顺序
select avg(c.score),count(a.score)/count(b.score) from score c,(select a.cNo,count(a.score) from score a
where a.score<60
group by a.cNo) d,(select b.cNo,count(b.score) from score b
group by b.cNo) e
where d.cNo=e.cNo
group by c.cNo
order by avg(c.score) desc
(select a.cNo,count(a.score) from score a
where a.score<60
group by a.cNo) d
(select b.cNo,count(b.score) from score b
group by b.cNo) e
--20.查询如下课程平均成绩和及格率的百分数(用"1行"显示): C语言(001),数据结构(002),JAVA(003),离散数学(004)
--21.查询不同老师所教不同课程平均分从高到低显示
select tNo,a.cNo,avg(score) from course a,score b
where a.cNo=b.cNo
group by tNo,a.cNo
order by avg(score) desc
--22.查询如下课程成绩第 3 名到第 6 名的学生成绩单:C语言(001),数据结构(002),JAVA(003),离散数学(004)
-- [学生ID],[学生姓名],C语言,数据结构,JAVA,离散数学,平均成绩
--23.统计打印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]
select distinct e.cNo,count(a.stuNo) as '100-85',count(b.stuNo) as '85-70',count(c.stuNo) as '70-60',count(d.stuNo) as '<60' from score a,score b,score c,score d,score e
where a.cNo in (select cNo from course) and a.score between 85 and 100 and b.cNo in (select cNo from course) and b.score between 71 and 84 and c.cNo in (select cNo from course) and c.score between 60 and 70 and d.cNo in (select cNo from course) and d.score<60
group by e.cNo,a.stuNo,b.stuNo,c.stuNo,d.stuNo
having a.stuNo<>b.stuNo and a.stuNo<>c.stuNo and a.stuNo<>d.stuNo and b.stuNo<>c.stuNo and b.stuNo<>d.stuNo and c.stuNo<>d.stuNo
select cNo,count(stuNo) from score
where score between 70 and 100 and cNo='c001'
group by cNo
--24.查询学生平均成绩及其名次
select stuNo,avg(score) from score
group by stuNo
order by avg(score) desc
--25.查询各科成绩前三名的记录:(不考虑成绩并列情况)
select a.stuNo,a.cNo,a.score
from score a
where a.score in (select top 3 score from score b
where a.cNo=b.cNo
order by score)
order by a.cNo
--26.查询每门课程被选修的学生数
select b.cNo ,count(stuNo) from score a right join course b
on a.cNo=b.cNo
group by b.cNo
--27.查询出只选修了一门课程的全部学生的学号和姓名
select b.stuNo,a.stuName from student a,score b
where a.stuNo=b.stuNo
group by b.stuNo,a.stuName
having count(b.cNo)=1
--28.查询男生、女生人数
select stuSex,count(stuSex) from student
group by stuSex
--29.查询姓‘zhao’的学生名单
select * from student
where stuName like '赵%'
--30.查询同名同性学生名单,并统计同名人数
select a.stuNo,a.stuName,count(a.stuNo) from student a,student b
where a.stuName=b.stuName and a.stuSex=b.stuSex and a.stuNo<>b.stuNo
group by a.stuNo,a.stuName
--31.1981年出生的学生名单(注:Student表中Sage列的类型是datetime
--32.、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列
select cNo,avg(score) from score
group by cNo
order by avg(score) asc,cNo
--33.查询平均成绩大于70的所有学生的学号、姓名和平均成绩
select b.stuNo,a.stuName,avg(score) from student a,score b
where a.stuNo=b.stuNo
group by b.stuNo,a.stuName
having avg(score)>70
--34.查询课程名称为“java”,且分数低于70的学生姓名和分数
select a.stuName,b.score from student a,score b
where a.stuNo=b.stuNo and score<70 and b.cNo=(select cNo from course where cName='java')
--35.查询所有学生的选课情况
select a.stuNo,c.cNo from student a,score b,course c
where a.stuNo=b.stuNo and b.cNo=c.cNo
order by a.stuNo
select a.stuNo,cNo from student a left join (select a.stuNo,c.cNo from student a,score b,course c
where a.stuNo=b.stuNo and b.cNo=c.cNo) d
on a.stuNo=d.stuNo
order by a.stuNo
--36.查询任何一门课程成绩在70分以上的姓名、课程名称和分数
select a.stuName,b.cNo,score from student a,score b
where score>70 and a.stuNo=b.stuNo
--37.查询不及格的课程,并按课程号从大到小排列
select cNo,score from score
where score<60
order by cNo
--38.查询课程编号为003且课程成绩在60分以上的学生的学号和姓名
select b.stuNo,a.stuName from student a,score b
where b.cNo='c003' and score>60 and a.stuNo=b.stuNo
--39.求选了课程的学生人数
select count(a.stuNo) from (select distinct stuNo from score) a
--40.查询选修“赵”老师所授课程的学生中,成绩最高的学生姓名及其成绩
select b.stuNo,a.stuName,max(score) from student a,score b
where a.stuNo=b.stuNo and b.cNo in (select a.cNo from course a,teacher b where a.tNo=b.tNo and b.tName='钱市保')
group by b.stuNo,a.stuName,b.cNo
having b.cNo in (select a.cNo from course a,teacher b where a.tNo=b.tNo and b.tName='钱市保')
--41.查询各个课程及相应的选修人数
select cNo,count(stuNo) from score
group by cNo
select b.cNo ,count(stuNo) from score a right join course b
on a.cNo=b.cNo
group by b.cNo
--42.查询不同课程成绩相同的学生的学号、课程号、学生成绩
select a.stuNo,a.cNo,a.score from score a,score b
where a.stuNo=b.stuNo and a.score=b.score and a.cNo<>b.cNo
--43. 查询每门功成绩最好的前两名
select a.stuNo,a.cNo,a.score
from score a
where score in(select top 2 score from score b
where a.cNo=b.cNo
order by score desc)
order by a.cNo
--44.统计每门课程的学生选修人数(超过2人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
select cNo,count(stuNo) 课程数 from score
group by cNo
having count(stuNo)>2
order by count(stuNo) desc,cNo
--45.检索至少选修两门课程的学生学号
select stuNo from score
group by stuNo
having count(cNo)>=2
--46.查询全部学生都选修的课程的课程号和课程名
select a.cNo,b.cName from score a,course b
where a.cNo=b.cNo
group by a.cNo,b.cName
having count(a.stuNo)=(select count(stuNo) from student)
select a.cNo,b.cName from score a,course b
group by a.cNo,b.cName,b.cNo
having a.cNo=b.cNo and count(a.stuNo)=(select count(stuNo) from student)
--47.查询没学过“钱”老师讲授的任一门课程的学生姓名
select stuNo,stuName from student
where stuNo not in (select stuNo from score a,course b,teacher c
where a.cNo=b.cNo and b.tNo=c.tNo and c.tName='钱市保'
group by stuNo
having count(a.cNo)<=(select count(cNo) from course d,teacher e
where d.tNo=e.tNo and e.tName='钱市保'))
select stuNo,stuName from student
where stuNo not in
(select stuNo from score where cNo in
(select cNo from teacher c,course d where c.tNo=d.tNo and c.tName='钱市保'))
--48.查询两门以上不及格课程的同学的学号及其平均成绩
select stuNo,avg(score) from score
where score<60
group by stuNo
having count(cNo)>2
--49.检索“004”课程分数小于60,按分数降序排列的同学学号
select stuNo from score
where score<60 and cNo='c004'
order by score desc
--50.删除“2”同学的“001”课程的成绩
delete from score where stuNo='002' and cNo='c001'