sql經典查詢
① sql語句實現子孫樹查詢經典實例
下面介紹的SQL語句非常經典,該SQL語句實現子孫樹查詢,該SQL語句可以直接在查詢分析器中執行,供您參考。
--生成表
create table MENU(id int,mname char(50),parent int)
--插入數據
insert into MENU
select 1,'新聞',Null union all
select 2,'房產',Null union all
select 3,'科技新聞',1 union all
select 4,'社會新聞',1 union all
select 5, 'IT新聞',3 union all
select 6, '航天新聞',3
--實現查詢新聞子孫樹
Declare @s varchar(1000)
select @s=','+cast(id as varchar(20))+'' from MENU where id=1 while @@rowCount>0
--charindex:返回字元串中指定表達式的起始位置
select @s=@s+','+cast(id as varchar) from MENU
where charindex(','+cast(id as varchar)+',',@s+',')=0
and charindex(','+cast(parent as varchar)+',',@s+',')>0
select * from MENU where charindex(','+cast(id as varchar)+',',@s+',')>0
--刪除表
drop table MENU
② 經典sql語句
、google是很好的學習搜索引擎,
推薦一下新手學習SQL的基礎技術,在搜索以下內容:
「一網打盡」通用SQL資料庫的查詢語句
實例講解SQL Server中"Update"的用法
三種資料庫利用SQL語句進行高效果分頁
深入講解SQL Server資料庫的嵌套子查詢
實現跨多個表格的數據進行組合的SQL語句
深入講解SQL Union和Union All的使用方法
還有一些基本的語法這里也簡單介紹一下,希望對你有用:
學習SQL應知道的動態SQL語句基本語法
1 、普通SQL語句可以用Exec執行
eg: Select * from tableName
Exec('select * from tableName')
Exec sp_executesql N'select * from tableName' -- 請注意字元串前一定要加N
2、欄位名,表名,資料庫名之類作為變數時,必須用動態SQL
eg:
declare @fname varchar(20)
set @fname = 'FiledName'
Select @fname from tableName -- 錯誤,不會提示錯誤,但結果為固定值FiledName,並非所要。
Exec('select ' + @fname + ' from tableName') -- 請注意 加號前後的 單引號的邊上加空格
當然將字元串改成變數的形式也可
declare @fname varchar(20)
set @fname = 'FiledName' --設置欄位名
declare @s varchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句會報錯
declare @s Nvarchar(1000) -- 注意此處改為nvarchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句正確
3、輸出參數
declare @num int,
@sqls nvarchar(4000)
set @sqls='select count(*) from tableName'
exec(@sqls)
--如何將exec執行結果放入變數中?
declare @num int,
@sqls nvarchar(4000)
set @sqls='select @a=count(*) from tableName '
exec sp_executesql @sqls,N'@a int output',@num output
select @num
此外,如果想要在SQL語句 字元串中使用 單引號 '' 可以 使用 ''''
③ sql經典50題
一、查詢課程編號為「01」的課程比「02」的課程成績高的所有學生的學號(重點)
一刷:
excel思路:
觀察原始表格數據,在excel中想得到01比02高,我們需要將原始表格拆分成兩個表,課程01表和課程02表,再進行vlookup得到c表,根據if條件判斷篩出最終數據。
重點是:1.拆表 2.匹配
轉成SQL語言:
1.拆表語言:
2.關聯加匹配語言 :
3.完整語言:
----到這里其實就可以結束了;
4.若想加student的信息,則需要以上所有結果再作為c表再關聯匹配:
若想讓欄位1和2為上下結果,即重復前面的信息,則語言如下:
二刷:
擴展一:查詢成績小於60分的學生的學號和姓名
1、先反向找出大於等於60分的學號 :
2、匹配:
擴展二:查詢平均成績小於60分的學生的學號、姓名和平均成績
第一種
1、先找出小於60分和空的作為c表:
2、匹配:
三、查詢所有學生的學號、姓名、選課數、總成績(不重要)
四、查詢姓「李」的老師的個數(不重要)
五、查詢沒學過「張三」老師課的學生的學號、姓名(重點)
六、查詢學過「張三」老師所教的所有課的同學的學號、姓名(重點)
七、查詢學過編號為「01」的課程並且也學過編號為「02」的課程的學生的學號、姓名(重點)
八、查詢課程編號為「02」的總成績(不重點)
九、查詢成績小於60分的學生的學號和姓名(同題目二)
十、查詢沒有學全所有課的學生的學號、姓名(重點)
十一、查詢至少有一門課與學號為「01」的學生所學課程相同的學生的學號和姓名(重點)
十二、查詢和「01」號同學所學課程完全相同的其他同學的學號(重點)
十五、查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績(重點)
十六、檢索"01"課程分數小於60,按分數降序排列的學生信息(和34題重復,不重點
十七、按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績(重重點與35一樣)
十八、查詢各科成績最高分、最低分和平均分:以如下形式顯示:課程ID,課程name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率
-- 及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=90 (超級重點)
十九、按各科成績進行排序,並顯示排名
二十、查詢學生的總成績並進行排名(不重點)
二十一、查詢不同老師所教不同課程平均分從高到低顯示(不重點)
二十二、查詢所有課程的成績第2名到第3名的學生信息及該課程成績(重要 25類似
二十三、 使用分段[100-85],[85-70],[70-60],[<60]來統計各科成績,分別統計各分數段人數:課程ID和課程名稱(重點和18題類似)
二十四、查詢學生平均成績及其名次(同19題,重點)
二十五、查詢各科成績前三名的記錄(不考慮成績並列情況)(重點 與22題類似)
二十六、查詢每門課程被選修的學生數(不重點)
二十七、查詢出只有兩門課程的全部學生的學號和姓名(不重點)
二十八、查詢男生、女生人數(不重點)
二十九、查詢名字中含有"風"字的學生信息(不重點)
三十一、 查詢1990年出生的學生名單(重點year)
三十二、查詢平均成績大於等於85的所有學生的學號、姓名和平均成績(不重要)
三十三、查詢每門課程的平均成績,結果按平均成績升序排序,平均成績相同時,按課程號降序排列(不重要)
三十四、查詢課程名稱為"數學",且分數低於60的學生姓名和分數(不重點)
三十五、查詢所有學生的課程及分數情況(重點)
三十六、 查詢任何一門課程成績在70分以上的姓名、課程名稱和分數(重點)
三十七、 查詢不及格的課程並按課程號從大到小排列(不重點)
三十八、 查詢課程編號為03且課程成績在80分以上的學生的學號和姓名(不重要)
三十九、求每門課程的學生人數(不重要)
四十、查詢選修「張三」老師所授課程的學生中成績最高的學生姓名及其成績(重要top)
四十一、查詢不同課程成績相同的學生的學生編號、課程編號、學生成績 (重點)
四十二、查詢每門功課成績最好的前兩名(同22和25題)
四十三、統計每門課程的學生選修人數(超過5人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列(不重要)
四十四、檢索至少選修兩門課程的學生學號(不重要)
四十五、查詢選修了全部課程的學生信息(重點劃紅線地方)
四十六、查詢各學生的年齡(精確到月份)
四十七、 查詢沒學過「張三」老師講授的任一門課程的學生姓名(還可以,自己寫的,答案中沒有)
四十八、 查詢兩門以上不及格課程的同學的學號及其平均成績
四十九、查詢本月過生日的學生(無法使用week、date(now())
五十、 查詢下月過生日的學生
④ 求一些sql資料庫數據查詢的一些經典語句
1、說明:創建資料庫CREATE DATABASE database-name 2、說明:刪除資料庫drop database dbname3、說明:備份sql server--- 創建 備份數據的 deviceUSE masterEXEC 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],..)
--建表、建約束、關系
create table tableok
(
col1 int, col2_notnull int not null,
col3_default nchar(1) not null default('男'),
--默認男
col4_default datetime not null default(getdate()),
--默認得到系統時間
col5_check int not null check(col5_check>=18 and col5_check<=55), --添加約束,數據值在18到55之間
col6_check nchar(9) not null check(col6_check like 'msd0902[0-9][^6-9]'),
--添加約束,數據值前7位必須是『msd0902』,倒數第兩位可以是0-9中任意一個數字,最後一位不是6-9之間的數字。
cola_primary nchar(5) not null primary key,
--建立主鍵
colb_unique int unique,
--唯一約束
col7_Identity int not null identity(100,1),
--自增長,從100開始,每列值增加1個
col8_identity numeric(5,0) not null identity(1,1)
--自增長,從1開始,每列值增加1個,最大值是5位的整數
col9_guid uniqueidentifier not null default(newid())
--使用newid()函數,隨機獲取列值
)
--alter
--主外鍵/引用/關系 約束
alter table 從表名 [with check]--啟用 with nocheck--禁用約束
add constraint FK_主表名_從表名
foreign key (從表中的欄位名) references 主表名 (主表中的欄位名)
--其它非主外鍵約束
alter table wf
add constraint 約束名 約束類型 具體的約束說明
alter table wf--修改聯合主鍵
add constraint Pk_cola_primary primary key(cola_primary,col1)
根據已有的表創建新表: A:create table tab_new like tab_old (使用舊表創建新表)B:create table tab_new as select col1,col2… from tab_old definition only5、說明:刪除新表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 viewname10、說明:幾個簡單的基本的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 table111、說明:幾個高級查詢運算詞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.cB: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'
二、提升
1、說明:復製表(只復制結構,源表名:a 新表名:b) (Access可用)法一:select * into b from a where 1<>1(僅用於SQlServer)法二:select top 0 * into b from a2、說明:拷貝表(拷貝數據,源表名: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 time2select 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.排序欄位具體實現:關於資料庫分頁:
declare @start int,@end int
@sql nvarchar(600)
set @sql=』select top』+str(@end-@start+1)+』+from T where rid not in(select top』+str(@str-1)+』Rid from T where Rid>-1)』
exec sp_executesql @sql
注意:在top後不能直接跟一個變數,所以在實際應用中只有這樣的進行特殊的處理。Rid為一個標識列,如果top後還有具體的欄位,這樣做是非常有好處的。因為這樣可以避免 top的欄位如果是邏輯索引的,查詢的結果後實際表中的不一致(邏輯索引中的數據有可能和數據表中的不一致,而查詢時如果處在索引則首先查詢索引)
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、說明:刪除重復記錄1),delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)2),select distinct * into temp from tablename delete from tablename insert into tablename select * from temp評價: 這種操作牽連大量的數據的移動,這種做法不適合大容量但數據操作3),例如:在一個外部表中導入數據,由於某些原因第一次只導入了一部分,但很難判斷具體位置,這樣只有在下一次全部導入,這樣也就產生好多重復的欄位,怎樣刪除重復欄位
alter table tablename--添加一個自增列add column_b int identity(1,1) delete from tablename where column_b not in(select max(column_b) from tablename group by column1,column2,...)alter table tablename drop column column_b
20、說明:列出資料庫里所有的表名select name from sysobjects where type='U' // 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
⑤ 經典SQL語句
經典SQL語句大全
1、創建資料庫: create database 資料庫名
如:create database student;
2、連接到一個已經存在的資料庫: use 資料庫名
如:use student;
3、刪除資料庫:drop database 資料庫名
如: drop database student;
4、創建表:create table 表名列名列的數據類型列的約束])
如:create table stuInfo(stuId int primary key,stuName var20) not null)
5、刪除表: 表名
如: stuInfo;
6、修改表:alter table
給表添加新列: alter table 表名 add 列名列的數據類型
添加多列,中間用逗號隔開
如:alter table stuInfo add stuGender var10)
修改某列的數據類型:alter table 表名 modify 列名新數據類型
如:alter table stuInfo modify stuGender int
修改列名:alter table 表名 change 老列名新列名數據類型
如:alter table stuInfo change stuName stuAddress var30)
刪除列:alter table 表名 drop 列名
如: alter table stuInfo drop stuGender
7、將創建的表的語句反向導出: show create table 表名
8、查詢表的所有內容:select * from 表名
查詢表的部分內容: select 列名列表 from 表名
9、查詢表結構:show columns from 表名
10、插入單行數據: into 表名列名列表) values(值列表)
11、插入多行數據:作用相當於將數據從一個表復制到另一個表
into 表名 (列名列表) select
如將stuInfo表中的所有的'學生姓名復制到students表中的stuName列中: into students(stuName) select stuName from stuInfo
12、刪除數據: from 表名 where過濾條件
如刪除stuID為4的人的數據: from stuInfo where stuId=4 ;
⑥ 找一些經典的SQL語句,請詳細說明功能
1、連接資料庫
(運行SQL*Plus,使用SCOTT/TIGER)
2、簡單查詢
SQL> select table_name
from user_tables;
運行結果如下:
TABLE_NAME
SALGRADE
BONUS
EMP
DEPT
SQL> select * from emp;
3、格式化用戶結果
SQL> select ename,sal
from emp
where ename like 'A%';
請嘗試一下,如果將上述語句中的'A%'替換為'a%',看看會出現什麼結果。
如果只是將select替換成SELECT,看看又會出現什麼效果。
SQL> column sal format $9,999.99
SQL> select ename,sal
from emp
where ename like 'A%';
請注意觀察結果和剛才有什麼不同。
如果將$符號替換為¥,看看會出現什麼結果。
SQL> describe user_objects
SQL> select object_type,object_name
from user_objects
order by object_type,object_name;
SQL> column object_name format a30
SQL> run
請注意觀察兩次運行的結果有何不同。
SQL> set pause on
SQL> select *
from emp;
SQL> set pause off
4、設置用戶頁面大小
SQL> set pagesize 10
SQL> select rownum,object_name
from all_objects
where rownum < 20;
請注意觀察每一批的記錄有幾條,考慮一下為什麼會出現這種情況?
SQL> show linesize
SQL> set linesize 200
SQL> select * from emp;
5、FEEDBACK(在查詢末尾輸出一行,用來指出查詢中返回的記錄數量)
SQL> show feedback
SQL> select empno,ename,job
from emp
where rownum < 7;
SQL> set feedback off
SQL> select empno,ename,job
from emp
where rownum < 7;
請注意觀察兩次運行的結果有何不同。
SQL> set feedback 3
SQL> select empno,ename,job
from emp
where rownum < 3;
SQL> select empno,ename,job
from emp
where rownum < 4;
再看看結果有何不同,仔細體會FEEDBACK的作用。
6、更換顯示輸出
SQL> create table t(x number);
SQL> insert into t values(1234567890);
SQL> insert into t values(12345678901);
SQL> insert into t values(12345678901234567890);
SQL> select x from t;
SQL> set numformat 99999999999999999999.9999999999
SQL> /
SQL> set numformat ""
SQL> /
7、描述表
SQL> desc dept
SQL> select deptno,dname,loc from dept;
請注意上述兩條語句的執行結果有何不同之處。
8、二元操作符
SQL> select empno,ename,sal,comm
from emp
where deptno = 30
and comm > 0;
SQL> select empno,ename,sal,comm
from emp
where sal >= 3000
or comm >= 500;
9、用WHERE子句聯接表
SQL> connect hr/hr@tb
SQL> select jobs.job_title,employees.last_name,salary
from jobs,employees
where jobs.job_id = employees.job_id
and employees.salary > 10000;
10、關於NULL
SQL> select *
from al;
SQL> select *
from al
where null = null;
SQL> select *
2 from al
3 where null <> null;
結論:在Oracle中,null = null或null <> null結果均為false。
11、ORDER和GROUP BY
SQL> select last_name,job_id,salary
from employees
where salary > 12000
order by job_id,salary;
SQL> select job_id,avg(salary),sum(salary),max(salary),count(*)
from employees
group by job_id;
SQL> select job_id,avg(salary) avg_salary
from employees
group by job_id
having avg(salary) >= 10000
order by avg(salary) desc;
11、ANSI聯接
自然連接(將一個表中的列與第二個表中具有相同名稱的列進行聯接)
SQL> select employee_id,last_name,department_name
from employees natural join departments
where department_name = 'Puchasing';
內聯接(在FROM子句中使用聯接條件,必須規定所要聯接的各個表的列)
SQL> select e.employee_id,e.last_name,d.department_name
from employees e inner join departments d
on e.department_id = d.department_id
where e.job_id = 'SA_MAN';
外聯接(返回所有滿足聯接條件的行,是對內聯接的擴展)
SQL> select e.employee_id,e.last_name,d.department_name
from employees e left outer join departments d
on e.department_id = d.department_id
where e.job_id = 'SA_MAN';
SQL> select e.employee_id,e.last_name,d.department_name
from employees e right outer join departments d
on e.department_id = d.department_id
where d.location_id = 1700
order by d.department_name,e.last_name
右外聯接將返回連接條件右邊的表中的所有行。
⑦ 求SQL2005經典查詢語句
你也得據個例子出來啊,經典?
很多嵌套查詢是不是可以被成為經典?
lz的例子很簡單,怎麼看也不像經典啊。
select * from biao where (select number from biao)
那我做個說明啊,像這種嵌套查詢,就是把一個表的查詢的結果,作為查詢另一個表的條件
沒有數據的話講起來會比較抽象一點
下面寫個嵌套:
select replace(姓名,'張','12') from biao 這就是把中的姓名列中的『張』替換為'12'所以,比如表中有個人名叫張三,現在名字就叫12三
如果叫張飛,那就改成12飛
這樣寫
select replace(replace(姓名,'張','12'),'三','12') from tongxuelu 首先,replace(姓名,'張','12')被作為一個已經得到的結果,被當成參數放在另外一個replace函數中,由於replace(姓名,'張','12')已經把張三改成 12三,所以在這個語句中,將12三中的三再改成12,所以就過最後就變成1212,張三同學好端端的名字就被我們改成不倫不類了~
SELECT LastName, FirstName FROM Person.Contact
WHERE ContactID IN (SELECT ContactID FROM HumanResources.Employee)
這是嵌套查詢的一種,結合了 in 進行查詢,其實某些時候也可以不用in,但是看具體情況和喜好了,代碼越規范越好,不要追求標新立異,標新立異應該著重體現在思路上而不是代碼的寫法
打這么多也累了,具體就講一個嵌套,多表聯查什麼的以後lz會學習到的
⑧ SQL的經典語句有哪些
SQL分類:
DDL—數據定義語言(CREATE,ALTER,DROP,DECLARE)
DML—數據操縱語言(SELECT,DELETE,UPDATE,INSERT)
DCL—數據控制語言(GRANT,REVOKE,COMMIT,ROLLBACK)
首先,簡要介紹基礎語句:
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 outer join:
全外連接:不僅包括符號連接表的匹配行,還包括兩個連接表中的所有記錄。
其次,大家來看一些不錯的sql語句
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
隨機選擇資料庫記錄的方法(使用Randomize函數,通過SQL語句實現)
對存儲在資料庫中的數據來說,隨機數特性能給出上面的效果,但它們可能太慢了些。你不能要求ASP「找個隨機數」然後列印出來。實際上常見的解決方案是建立如下所示的循環:
Randomize
RNumber = Int(Rnd*499) +1
While Not objRec.EOF
If objRec("ID") = RNumber THEN
... 這里是執行腳本 ...
end if
objRec.MoveNext
Wend
這很容易理解。首先,你取出1到500范圍之內的一個隨機數(假設500就是資料庫內記錄的總數)。然後,你遍歷每一記錄來測試ID 的值、檢查其是否匹配RNumber。滿足條件的話就執行由THEN 關鍵字開始的那一塊代碼。假如你的RNumber 等於495,那麼要循環一遍資料庫花的時間可就長了。雖然500這個數字看起來大了些,但相比更為穩固的企業解決方案這還是個小型資料庫了,後者通常在一個資料庫內就包含了成千上萬條記錄。這時候不就死定了?
採用SQL,你就可以很快地找出准確的記錄並且打開一個只包含該記錄的recordset,如下所示:
Randomize
RNumber = Int(Rnd*499) + 1
SQL = "SELECT * FROM Customers WHERE ID = " & RNumber
set objRec = ObjConn.Execute(SQL)
Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")
不必寫出RNumber 和ID,你只需要檢查匹配情況即可。只要你對以上代碼的工作滿意,你自可按需操作「隨機」記錄。Recordset沒有包含其他內容,因此你很快就能找到你需要的記錄這樣就大大降低了處理時間。
再談隨機數
現在你下定決心要榨乾Random 函數的最後一滴油,那麼你可能會一次取出多條隨機記錄或者想採用一定隨機范圍內的記錄。把上面的標准Random 示例擴展一下就可以用SQL應對上面兩種情況了。
為了取出幾條隨機選擇的記錄並存放在同一recordset內,你可以存儲三個隨機數,然後查詢資料庫獲得匹配這些數字的記錄:
SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3
假如你想選出10條記錄(也許是每次頁面裝載時的10條鏈接的列表),你可以用BETWEEN 或者數學等式選出第一條記錄和適當數量的遞增記錄。這一操作可以通過好幾種方式來完成,但是 SELECT 語句只顯示一種可能(這里的ID 是自動生成的號碼):
SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"
注意:以上代碼的執行目的不是檢查資料庫內是否有9條並發記錄。
隨機讀取若干條記錄,測試過
Access語法:SELECT top 10 * From 表名 ORDER BY Rnd(id)
Sql server:select top n * from 表名 order by newid()
mysql select * From 表名 Order By rand() Limit n
Access左連接語法(最近開發要用左連接,Access幫助什麼都沒有,網上沒有Access的SQL說明,只有自己測試, 現在記下以備後查)
語法 select table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...
使用SQL語句 用...代替過長的字元串顯示
語法:
SQL資料庫:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename
Access資料庫:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename;
Conn.Execute說明
Execute方法
該方法用於執行SQL語句。根據SQL語句執行後是否返回記錄集,該方法的使用格式分為以下兩種:
1.執行SQL查詢語句時,將返回查詢得到的記錄集。用法為:
Set 對象變數名=連接對象.Execute("SQL 查詢語言")
Execute方法調用後,會自動創建記錄集對象,並將查詢結果存儲在該記錄對象中,通過Set方法,將記錄集賦給指定的對象保存,以後對象變數就代表了該記錄集對象。
2.執行SQL的操作性語言時,沒有記錄集的返回。此時用法為:
連接對象.Execute "SQL 操作性語句" [, RecordAffected][, Option]
·RecordAffected 為可選項,此出可放置一個變數,SQL語句執行後,所生效的記錄數會自動保存到該變數中。通過訪問該變數,就可知道SQL語句隊多少條記錄進行了操作。
·Option 可選項,該參數的取值通常為adCMDText,它用於告訴ADO,應該將Execute方法之後的第一個字元解釋為命令文本。通過指定該參數,可使執行更高效。
·BeginTrans、RollbackTrans、CommitTrans方法
這三個方法是連接對象提供的用於事務處理的方法。BeginTrans用於開始一個事物;RollbackTrans用於回滾事務;CommitTrans用於提交所有的事務處理結果,即確認事務的處理。
事務處理可以將一組操作視為一個整體,只有全部語句都成功執行後,事務處理才算成功;若其中有一個語句執行失敗,則整個處理就算失敗,並恢復到處里前的狀態。
BeginTrans和CommitTrans用於標記事務的開始和結束,在這兩個之間的語句,就是作為事務處理的語句。判斷事務處理是否成功,可通過連接對象的Error集合來實現,若Error集合的成員個數不為0,則說明有錯誤發生,事務處理失敗。Error集合中的每一個Error對象,代表一個錯誤信息。
SQL語句大全精要
2006/10/26 13:46
DELETE語句
DELETE語句:用於創建一個刪除查詢,可從列在 FROM 子句之中的一個或多個表中刪除記錄,且該子句滿足 WHERE 子句中的條件,可以使用DELETE刪除多個記錄。
語法:DELETE [table.*] FROM table WHERE criteria
語法:DELETE * FROM table WHERE criteria='查詢的字'
說明:table參數用於指定從其中刪除記錄的表的名稱。
criteria參數為一個表達式,用於指定哪些記錄應該被刪除的表達式。
可以使用 Execute 方法與一個 DROP 語句從資料庫中放棄整個表。不過,若用這種方法刪除表,將會失去表的結構。不同的是當使用 DELETE,只有數據會被刪除;表的結構以及表的所有屬性仍然保留,例如欄位屬性及索引。
UPDATE
有關UPDATE,急!!!!!!!!!!!
在ORACLE資料庫中
表 A ( ID ,FIRSTNAME,LASTNAME )
表 B( ID,LASTNAME)
表 A 中原來ID,FIRSTNAME兩個欄位的數據是完整的
表 B中原來ID,LASTNAME兩個欄位的數據是完整的
現在要把表 B中的LASTNAME欄位的相應的數據填入到A表中LASTNAME相應的位置。兩個表中的ID欄位是相互關聯的。
先謝謝了!!!!
update a set a.lastname=(select b.lastname from b where a.id=b.id)
掌握SQL四條最基本的數據操作語句:Insert,Select,Update和Delete。
練掌握SQL是資料庫用戶的寶貴財 富。在本文中,我們將引導你掌握四條最基本的數據操作語句—SQL的核心功能—來依次介紹比較操作符、選擇斷言以及三值邏輯。當你完成這些學習後,顯然你已經開始算是精通SQL了。
在我們開始之前,先使用CREATE TABLE語句來創建一個表(如圖1所示)。DDL語句對資料庫對象如表、列和視進行定義。它們並不對表中的行進行處理,這是因為DDL語句並不處理資料庫中實際的數據。這些工作由另一類SQL語句—數據操作語言(DML)語句進行處理。
SQL中有四種基本的DML操作:INSERT,SELECT,UPDATE和DELETE。由於這是大多數SQL用戶經常用到的,我們有必要在此對它們進行一一說明。在圖1中我們給出了一個名為EMPLOYEES的表。其中的每一行對應一個特定的雇員記錄。請熟悉這張表,我們在後面的例子中將要用到它。