第一篇:SQL學習總結
上個星期,自主學習了SQL Server,基本了解了SQL Server的語法知識和結構,對SQL 有了一定的認識,現在我就對我這一星期對SQl的 學習做一個總結:
為了永久性的集中存放數據,并且還能體現數據與數據之間聯系.此時需要用到數據庫來保存數據.由于之前也接觸過一兩種數據庫,向Oracle,MySQL,再就是SQL Server,這三種都是關系型數據庫,都是用于存儲大量的數據信息,是一種存儲數據的倉庫。不過,不管是哪一種數據庫,他們之間的聯系我覺得都是相通的,對于數據庫的常見操作,無非就是“三建四句“。
所謂的“三建四句“就是說,三建:建庫,建表,建約束;四句:增,刪,改,查。
SQL 語言,也稱為結構化查詢語言,是用于訪問關系型數據庫的專用語言,同樣也是數據庫的核心語言,總體上可以分為三類:數據操縱語言(DML), 數據定義語言(DDL)、數據控制語言(DCL)。
數據操縱語言(DML)主要有四種形式:
插入:insert
更新:update
刪除:delete
查詢:select,涉及到數據的完整性——簡單查詢、子查詢、多表連接查詢
數據定義語言(DDL)主要用于創建數據庫中的各種對象——
數據庫
數據表
視圖:是一種觀察數據的途徑
索引:用于查詢數據,提高效率
同義詞
Create,Drop,Alert,Truncate(截斷)
數據控制語言(DCL):是用于授予和回收訪問數據庫的某種權限,并對數據庫進行監控。
Grant(授予),Revoke(回收),Denny(拒絕),Rollback
SQL 中的運算符:算術運算符、位運算符、比較運算符、邏輯運算符、通配運算符、字符串連接符、賦值運算符
上面這些只是SQL Server數據的基本操作,而它真正強大的地方并不止這些,還有程序設計,SQL Server中的編程語言就是T-SQL語言,是一種非過程化的語言。
觸發器:觸發器是一種特殊類型的存儲過程,主要是通過實踐進行觸發而被執行。它的主要作用就是能夠實現由主鍵和外鍵所不能保證的復雜的參照完整性和數據的一致性。
存儲過程:(stored procedure)類似c語言中的函數,是一組為了完成特定功能的SQL語句集,經編譯后存儲在數據庫中。用戶通過指定存儲過程的名字并給出參數來執行它。
游標:游標是一種能從包含多條數據記錄的結果集中每次提取一條記錄的機制。將批操作變成行操作,對結果集中得某行進行操作。
第二篇:SQL總結
1.SQL語句的With cte as用法:
with as短語,也叫做子查詢部分。即定義一個SQL片斷,該片斷會讓整個SQL語句所用到。eg:
with
cr as
(select CountryRegionCode from person.CountryRegion where Name like 'C%')
select * from person.StateProvince where CountryRegionCode in(select * from cr)
CTE后面必須直接跟使用CTE的SQL語句(如select,insert,update等),否則,CTE將失效。CTE后面也可以跟其他的CTE,但只能使用一個with,多個CTE中間用逗號(,)分隔。eg:
with
cte1 as
(select * from table1 where name like 'abc%'),cte2 as
(select * from table2 where id > 20),cte3 as
(select * from table3 where price < 100)
select a.* from cte1 a, cte2 b, cte3 c where a.id = b.id and a.id = c.id
2.case when then多條件判斷:
CASE
WHEN 條件1 THEN 結果1
WHEN 條件2 THEN 結果2
WHEN 條件3 THEN 結果3
WHEN 條件4 THEN 結果4
.........WHEN 條件N THEN 結果N
ELSE 結果X
END
Case具有兩種格式。簡單Case函數和Case搜索函數。
--簡單Case函數
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
--Case搜索函數
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
3.select語句前面加@轉義字符的作用是強制后面的字符串中不使用轉義字符,當作字符串
處理。
eg:string ss=@“aanaa”;輸出:aanaa
string ss=“aanaa”;
輸出:aa
aa
4.select getdate():從SQL SERVER返回當前的時間與日期。
select first():函數返回指定的字段中第一個記錄的值。
select last():函數返回指定的字段中最后一個記錄的值。
select ucase():把字段的值轉換為大寫。
select lcase():把字段的值轉換為小寫。
select round():用于把數值字段設入為指定的小數位數。SELECT ROUND(column_name,decimals)FROM table_name
column_name 必需。要舍入的字段。decimals 必需。規定要返回的小數位數。format():用于對字段的顯示進行格式化。
SELECT ProductName, UnitPrice, FORMAT(Now(),'YYYY-MM-DD')as PerDate FROM Products
5.union與union all的區別:
對重復結果的處理,UNION ALL 會將每一筆符合條件的資料都列出來,無論資料值有無重復
6.SELECT INTO 語句從一個表中選取數據,然后把數據插入另一個表中。
SELECT INTO 語句常用于創建表的備份復件或者用于對記錄進行存檔。
將整個table1復制到table2中:
INSERT INTO SELECT語句
語句形式為:Insert into Table2(field1,field2,...)select value1,value2,...from Table1(要求目標表Table2必須存在,由于目標表Table2已經存在,所以我們除了插入源表Table1的字段外,還可以插入常量。)
SELECT INTO FROM語句
語句形式為:SELECT value1, value2 into Table2 from Table1(要求目標表Table2不存在,因為在插入時會自動創建表Table2,并將Table1中指定字段數據復制到Table2中)
7.nchar :固定長度的 Unicode 數據,最大長度為 4,000 個字符。
nvarchar:可變長度Unicode 數據,其最大長度為4,000字符。
char: 固定長度的非 Unicode 字符數據,最大長度為 8,000 個字符。
varchar:可變長度的非Unicode數據,最長為8,000 個字符。
char和varchar都是字符串類型的,用Unicode編碼的字符串,結果是字符的整數值.8.select 1 from:
select 1 from mytable;與select anycol(目的表集合中的任意一行)from mytable;與select * from mytable 作用上來說是沒有差別的,都是查看是否有記錄,一般是作條件用的。select 1 from 中的1是一常量,查到的所有行的值都是它,但從效率上來說,1>anycol>*,因為不用查字典表。
查看記錄條數可以用select sum(1)from mytable;等價于select sum(*)from mytable;
9.SQL中的字符匹配:
[NOT] LIKE '<匹配串>' [ESCAPE '<換碼字符>']
<匹配串>可以是一個完整的字符串,也可以含有通配符%和_
%代表任意長度的字符串。eg:a%b表示以a開頭以b結尾的任意長度的字符串。_代表任意單個字符。eg:a_b表示以a開頭,以b結尾的長度為3的任意字符串。ESCAPE定義轉義字符,當轉義符置于通配符之前時,該通配符解釋為普通字符。
10.GROUP BY子句將查詢結果按某一列或多列的值分組,值相等的為一組。HAVING短語給出選擇組的條件。
11.ROW_NUMBER()OVER函數的基本用法 :
row_number()OVER(PARTITION BY COL1 ORDER BY COL2)表示根據COL1分組,在分組內部根據 COL2排序,而此函數計算的值就表示每組內部排序后的順序編號(組內連續的唯一的)
select row_number()over(order by field2 desc)as row_number,* from t_table order by field1 desc Desc:倒序,Asc:正序
12.DbDataAdapter.Fill 方法(DataTable, IDbCommand, CommandBehavior):
在DataTable中添加或刪除新行以匹配使用指定 DataTable 和 IDataReader 名稱的數據源中的行。
13.SqlCommand.ExecuteScalar 方法:執行查詢,并返回查詢所返回的結果集中第一行的第一列,忽略其他列或行。
14.inner join(等值連接)只返回兩個表中聯結字段相等的行
left join(左聯接)返回包括左表中的所有記錄和右表中聯結字段相等的記錄
right join(右聯接)返回包括右表中的所有記錄和左表中聯結字段相等的記錄
15.e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem指觸發的類型為DadaList中的基本行或內容行
16.order by的用法:
如果Order by 中指定了表達式Nulls first則表示null值的記錄將排在最前(不管是asc 還是 desc)
如果Order by 中指定了表達式Nulls last則表示null值的記錄將排在最后(不管是asc 還是 desc)
eg:將nulls始終放在最前
select * from zl_cbqc order by cb_ld nulls first
--將nulls始終放在最后
select * from zl_cbqc order by cb_ld desc nulls last
單列升序:select
單列降序:select
多列升序:select
多列降序:select
多列混合排序:select
17.C#中NULL,“",DBNULL,String.Empty,Convert.IsDBNull區別
(1)NULL
null 關鍵字是表示不引用任何對象的空引用的文字值。null 是引用類型變量的默認值。那么也只有引用型的變量可以為NULL,如果 int i=null,的話,是不可以的,因為Int是值類型的。
(2)DBNULL
DBNull在DotNet是單獨的一個類型,該類只能存在唯一的實例,DBNULL.Value,DBNull唯一作用是可以表示數據庫中的字符串,數字,或日期,為什么可以表示原因是DotNet儲存這些數據的類(DataRow等)都是以 object 的形式來儲存數據的。對于 DataRow , 它的 row[column] 返回的值永遠不為 null,要么就是具體的為column 的類型的值。要么就是 DBNull。所以 row[column].ToString()這個寫法永遠不會在ToString那里發生NullReferenceException。DBNull 實現了 IConvertible。但是,除了 ToString 是正常的外,其他的ToXXX都會拋出不能轉換的錯誤。
(3)”“和String.Empty
這兩個都是表示空字符串,其中有一個重點是string str1=”“ 和 string str2=null 的區別,這樣定義后,str1是一個空字符串,空字符串是一個特殊的字符串,只不過這個字符串的值為空,在內存中是有準確的指向的,string str2=null,這樣定義后,只是定義了一個string 類的引用,str2并沒有指向任何地方,在使用前如果不實例化的話,都將報錯。
(4)Convert.IsDBNull()
Convert.IsDBNull()返回有關指定對象是否為 DBNull 類型的指示,即是用來判斷對象是否為DBNULL的。其返回值是True或Flase。
string.Empty不分配存儲空間
”“分配一個長度為空的存儲空間
所以一般用string.Empty
null表示一個對象的指向無效,即該對象為空對象
DBNull。Value表示一個對象在數據庫中的值為空,或者說為初始化,DBNull。Value對象指向有效的對象
18.DataSet.Relations.add():獲取用于將表鏈接起來并允許從父表瀏覽到子表的關系的集合。DataSet.Relations.Add(”關聯名稱“, 父關聯主鍵字段, 子關聯外來鍵字段)
19.DataBind():在Page_Load方法中我們建立了一個數組(ArrayList),并通過DataBind方法將這個數組捆綁到了DropDownList控件中,使得DropDownList最后有數據顯示:)
20.IN 操作符允許我們在 WHERE 子句中規定多個值。
SQL IN 語法:SELECT column_name(s)FROM table_nameWHERE column_name IN(value1,value2,...)
21.DataBinder.Eval方法:在運行時使用反射來分析和計算對象的數據綁定表達式<%# DataBinder.Eval(Container.DataItem, ”ColumnName“)%>
eval()函數可計算某個字符串,并執行其中的的 JavaScript 代碼。
可以理解為反射的綁定
或者理解為將Eval()里的字符串轉換為表達式
在數據綁定的時候常用,其實是通過反射的手段實現了綁定
22.sql語句 count(1)與 count(*)的區別 :
count(1),其實就是計算一共有多少符合條件的行。
1并不是表示第一個字段,而是表示一個固定值。
其實就可以想成表中有這么一個字段,這個字段就是固定值1,count(1),就是計算一共有多少個1.count(*),執行時會把星號翻譯成字段的具體名字,效果也是一樣的,不過多了一個翻譯的動作,比固定值的方式效率稍微低一些。
23.DataTable.NewRow :創建與該表具有相同框架的新的DataRow
24.ExcuteNonQuery():
如果要創建或修改數據庫結構,操作成功時返回值為-1;如果要更新記錄,返回值為操作影響的記錄數;
ExecuteNonQuery()方法主要用于用戶更新數據,通常它使用Update,Insert,Delete語句來操作數據庫,其方法返回值意義:對于 Update,Insert,Delete 語句 執行成功是返回值為該命令所影響的行數,如果影響的行數為0時返回的值為0,如果數據操作回滾得話返回值為-1,關于MyCommand的ExecuteNonQuery(),ExecuteScalar(),ExecuteReader方法的區別:
***ExecuteNonQuery():執行SQL,返回一個整型變量,如果SQL是對數據庫的記錄進行操作,那么返回操作影響的記錄條數,如果是SQL=”CREATE TABLE LookupCodes(code_id smallint IDENTITY(1,1)PRIMARY KEY CLUSTERED, code_desc varchar(50)NOT NULL)"那么在表創建成功后該方法返回-1。
***ExecuteScalar():執行SQL,(如果SQL是查詢Select)返回查詢結果的第一行第一列,如果(如果SQL不是查詢Select)那么返回未實列化的對象,因為對象未實列化,所以返回結果不能ToString(),不能Equals(null),也就是說返回結果沒有任何作用
***executeReader方法執行SQL,(如果SQL是查詢Select)返回查詢結果的集合,類型是 System.Data.OleDb.OleDbDataReader,你可以通過此結果,獲取查詢的數據。如果(如果SQL不是查詢Select)那么返回一個沒有任何數據的System.Data.OleDb.OleDbDataReader類型的集合(EOF)
25.DbDataAdapter.Fill 方法(DataTable):在 DataSet 的指定范圍中添加或刷新行,以與使用 DataTable 名稱的數據源中的行匹配。
26.Decimal:decimal(2,1),有效長度為2,小數位占1位。
varchar:可變長度的非Unicode數據,最長為8,000 個字符。
nvarchar:可變長度Unicode 數據,其最大長度為4,000字符。
char: 固定長度的非 Unicode 字符數據,最大長度為 8,000 個字符。
nchar :固定長度的 Unicode 數據,最大長度為 4,000 個字符。
char和varchar都是字符串類型的,用Unicode編碼的字符串,結果是字符的整數值.timestamp:數據類型是一種特殊的數據類型,用來創建一個數據庫范圍內的唯一數碼。一個表中只能有一個timestamp列。每次插入或修改一行時,timestamp列的值都會改變。盡管它的名字中有“time”,但timestamp列不是人們可識別的日期。在一個數據庫里,timestamp值是唯一的Uniqueidentifier特殊數據型
SELECT UPPER('Kelly'):upper是數據庫的字符串函數,它的作用是將傳遞給它的英文字符串中小寫字母轉換為大寫(大寫的保持不變);
SELECT LOWER('kelly'):lower將指定字符串中的大寫字母換成小寫字母
SUBSTRING(colunm name,startposition,length)從指定字符串中取字符
eg:SQL實例:
顯示每個地區的總人口數和總面積.
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
先以region把返回記錄分成多個組,這就是GROUP BY的字面含義。分完組后,然后用聚合函數對每組中的不同字段(一或多條記錄)作運算。
顯示每個地區的總人口數和總面積.僅顯示那些面積超過1000000的地區。
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area)>1000000
27.SELECT [ALL|DISTINCT] <目標列表達式> [別名] [,<目標列表達式> [別名]]…… FROM <表名或視圖名> [別名] [,<表名或視圖名> [別名]]……
[WHERE <條件表達式>]
[GROUP BY <列名1> [HAVING <條件表達式>]]
[ORDER BY <列名2> [ASC|DESC]]
INSERT
INTO <表名> [(<屬性列1>[,<屬性列2>……])]
VALUES(<常量1> [,<常量2>]……)
UPDATE <表名>
SET <列名>=<表達式> [,<列名>=<表達式>]……
[WHERE <條件>]
DELETE
FROM <表名>
[WHERE <條件>]
第三篇:sql語句學習
一、選擇題
1、SQL語言是()語言。——(SQL特點)(易)
A)層次數據庫 B)網絡數據庫 C)關系數據庫D)非數據庫
答案:C2、SQL語言具有兩種使用方式,分別稱為交互式SQL和()。
——(SQL語言使用方式)(易)
A)提示式SQLB)多用戶SQLC)嵌入式SQLD)解釋式SQL
答案:C
3-4-5()包括數據庫模式定義和數據庫存儲結構與存取方法定義。()實現對DB的操作,包括查詢、插入、刪除、修改數據庫中的數據。()用于數據保護,包括數據的安全性,完整性,并發控制和恢復等。——(數據庫語言DDLDMLDCL)(中)
A)數據控制子語言 B)數據定義子語言 C)數據操縱子語言 D)數據庫語言
答案:B C A
6-7-8-9-
10、下列SQL語句中,實現數據檢索的語句是(),修改表結構的是(),修改屬性值的是(),刪除表結構的是(),刪除表記錄的是()。
——(DROP TABLE, ALTER TABLE,UPDATE, DELETE,SELECT 語句)(易)
A)SELECTB)DROPC)UPDATED)ALTERE)DELETE
答案:A D C B E
二、用關系代數表達式及SQL語句描述關系查詢
1、設有如下關系表R、S和T:——(易)R(BH,XM,XB,DWH)
S(DWH,DWM)
T(BH,XM,XB,DWH)
寫出實現下列關系代數的SQL語句:
1)?DWH?'100'(R)σDWH=’100’(R)
2)?XM,XB(R)∏xM,XB(R)
3)?XM,DWH(?
4)R?S R∞S
5)?XM,XB,DWH(?
解:
1)SELECT * FROM R WHERE DWH=’100’;
2)SELECT XM,XB FROM R;
3)SELECT XM,DWH FROM R WHERE XB=’女’;
4)SELECT R.*,S.DWM FROM R, S WHERE R.DWH=S.DWH;
5)SELECT XM,XB,DWH FROM R,S WHERE R.DWH=S.DWH AND XB=’男’;XB?'男'XB?'女'(R))∏XM,DWH(σXB=’女’(R))(R?S))∏XM,XB,DWH(σXB=’男’(R∞S))
2、設有如下三個關系:——(易-易)
A(A#,ANAME,WQTY,CITY): A#:商店代號;ANAME:商店名;WQTY:店員人數
B(B#,BNAME,PRICE):B#:商品號;BNAME:商品名稱;
AB(A#,B#,QTY):QTY:商品數量
試用關系代數和SQL語言寫出下列查詢。
1)找出店員人數不超過100人或者在長沙市的所有商店的代號和商店名;
2)找出供應書包的商店名;
解:
1)?A#,ANAME(?WQTY??100 ? CITY?'長沙'(A))∏A#,ANAME(σWQTY<=100ⅤCITY=’長沙’(A))
SELECT A#,ANAME FROM A WHERE WQTY<=100 OR CITY=’長沙’;
2)?ANAME((?BNAME?'書包'(B))?AB?A)∏ANAME((σBNAME=’書包’(B))∞AB∞(A))
SELECT ANAME FROM A,B,AB
WHERE BNAME=’書包’ AND B.B#=AB.B# AND AB.A#=A.A#;
3.設有如下關系模式:
student(NO, NAME , SEX ,BIRTHDAY, CLASS)
teacher(NO,NAME,SEX,BIRTHDAY,PROF,DEPART)PROF為職稱,DEPART為系別
course(CNO, CNAME, TNO)
score(NO, CNO, DEGREE)DEGREE 為成績
寫出實現以下各題功能的SQL語句:
(1)查詢至少有2名男生的班號;——(難)
(2)查詢不姓“王”的同學記錄;——(易)
(3)查詢每個學生的姓名和年齡;——(難)
(4)查詢學生中最大和最小的birthday日期值;——(中)
(5)查詢學生表的全部記錄并按班號和年齡從大到小的順序;——(中)
(6)查詢男教師及其所上的課程;——(中)
(7)查詢最高分同學的學號,課程號和成績;——(中)
(8)查詢和“李軍”同性別并同班的所有同學的姓名;——(中)
(9)查詢選修“數據庫系統概論”課程的男同學的成績表;——(中)
(10)查詢所有未講課的教師的姓名和所在系別;——(難)
(11)查詢“計算機系”教師所教課程的成績表;——(難)
(12)查詢選修“3-105”課程的成績高于“109”號同學成績的所有同學的記錄;——(難)
(13)查詢最低分大于70,最高分小于90的學生的學號;——(中)
(14)查詢成績在60到80之間的所有記錄;——(中)
(15)查詢成績比該課程平均成績低的同學的成績表;——(相關子查詢)(難)
(16)查詢所有女教師和女同學的姓名、性別和生日;——(中)
(17)查詢“計算機系”和“無線電系”不同職稱的教師的姓名和職稱;——(中)
解:(1)SELECT CLASS FROM student WHERE SEX=‘男’
GROUP BY CLASS HAVING COUNT(*)>=2;
(2)SELECT * FROM student WHERE NAME NOT LIKE ‘王%’;
(3)SELECT NAME,year(date())-year(birthday)as age FROM student;
(4)SELECT MAX(BIRTHDAY), MIN(BIRTHDAY)FROM student;
(5)SELECT * FROM student ORDER BY CLASS,BIRTHDAY DESC;
(6)SELECT x.name, y.cname FROM teacher x, course y WHERE x.no=y.tno and x.sex=’男’;
(7)SELECT * FROM score WHERE degree=(SELECT max(degree)FROM score);
(8)SELECT name FROM student WHERE sex=(SELECT sex FROM student WHEREname=’
李軍’)and class=(SELECT class FROM student WHERE name=’李軍’);
(9)SELECT * FROM score WHERE no IN(SELECT no FROM student WHERE sex=‘男’)and
cno=(SELECT cno FROM course WHERE cname=‘數據庫系統概論’);
(10)SELECT name, depart FROM teacher t WHERE NOT EXIST(SELECT * FROM course c
WHERE c.tno=t.no);
(11)SELECT * FROM score s, teacher t, course c WHERE t.depart=’計算機系’ and t.no=c.tno
and c.cno=score.cno;
(12)SELECT * FROM student s, score sc WHERE s.no=sc.no and cno=’3-105’ and
degree>(SELECT degree FROMsc WHERE no=’109’ and cno=’3-105’);
(13)SELECT no FROM score GROUP BY no HAVING min(degree)>70 and max(degree)<90;
(14)SELECT * FROM score WHERE degree BETWEEN 60 AND 80;
(15)SELECT * FROM score a WHERE degree <(SELECT avg(degree)FROM score b WHERE b.cno=a.cno group by b.cno);
(16)SELECT name, sex, birthday FROM teacher WHERE sex=‘女’UNION SELECT name, sex,birthday FROM student WHERE sex=‘女’;
(17)SELECT name, prof FROM teacher WHERE depart=’計算機系’ OR depart=’無線電系’
order by prof;
4、設有圖書登記表TS,具有屬性:BNO(圖書編號),BC(圖書類別),BNA(書名),AU(著者),PUB(出版社)。按下列要求用SQL語言進行設計。——(易)
1)按圖書館編號BNO建立TS表的索引ITS;
2)查詢按出版社統計其出版圖書總數。
3)刪除索引。
解:1)CREATE INDEX ITSON TS(BNO);
2)SELECT PUB,COUNT(BNO)FROM TS GROUP BY PUB;
3)DROP INDEXITS;
5、已知三個關系R、S和T——(中)
R(A,B,C)S(A,D,E)T(D,F)
試用SQL語句實現如下操作:
1)R、S和T三個關系按關聯屬性建立一個視圖R-S-T;
2)對視圖R-S-T按屬性A分組后,求屬性C和E的平均值。
解:1)CREATE VIEW R-S-T(A,B,C,D,E,F)AS
SELECT R.A , B, C ,S.D, E, F FROM R, S, T
WHERE R.A=S.A AND S.D=T.D;
2)SELECT AVG(C), AVG(E)FROM R-S-T GOUPY BY A;
6、設有學生表S(SNO, SN)(SNO為學生號,SN為姓名)和學生選修課程表SC(SNO,CNO,CN,G)
(CNO為課程號,CN為課程名,G為成績),試用SQL語言完成以下各題:——(易)
a)建立一個視圖V-SSC(SNO, SN, CNO, CN, G);
b)從視圖V-SSC上查詢平均成績在90分以上的SN, CN 和G。
解:
1)CREATE VIEW V-SSC(SNO , SN, CNO, CN, G)AS
SELECT S.SNO, SN, CNO, CN, GFROM S, SC WHERE S.SNO=SC.SNO
2)SELECT SN, CN, G FROM V-SSC GROUP BY SNO HAVING AVG(G)>907、設有關系模式: 其中SB表示供應商,SN為供應商號,SNAME為供應商名字,CITY
為供應商所在城市; PB(PN, PNAME, COLOR, WEIGHT)其中PB表示零件,PN為零件代號,PANME為零件名
字,COLOR為零件顏色,WEIGHT為零件重量; JB(JN, JNAME, CITY)其中JB表示工程,JN為工程編號,JNAME為工程名字,CITY為工
程所在城市;
SPJB()其中SPJB表示供應關系,QTY表示提供的零件數量。
寫出實現以下各題功能的SQL語句:
(1)取出所有工程的全部細節;——(易)
(2)取出所在城市為上海的所有工程的全部細節;——(易)
(3)取出重量最輕的零件代號;——(難)
(4)取出為工程J1提供零件的供應商代號;——(易)
(5)取出為工程J1提供零件P1的供應商代號;——(易)
(6)取出由供應商S1提供零件的工程名稱;——(易)
(7)取出供應商S1提供的零件的顏色;——(易)
(8)取出為工程J1或J2提供零件的供應商代號;——(中)
(9)取出為工程J1提供紅色零件的供應商代號;——(易)
(10)取出為所在城市為上海的工程提供零件的供應商代號;——(易)
(11)取出為所在城市為上海或北京的工程提供紅色零件的供應商代號;——(中)
(12)取出供應商與工程所在城市相同的供應商提供的零件代號;——(中)
(13)取出上海的供應商提供給上海的任一工程的零件的代號;——(難)
(14)取出至少有一個和工程不在同一城市的供應商提供零件的工程代號;——(難)
(15)取出上海供應商不提供任何零件的工程的代號;——(難)
(16)取出這樣一些供應商代號,它們能夠提供至少一種由紅色零件的供應商提供的零件;
——(難)
(17)取出由供應商S1提供零件的工程的代號;——(易)
(18)取出所有這樣的一些 市的工程提供零件;——(難) (19)取出所有這樣的三元組 市的工程提供指定的零件;——(難) (20)重復(19)題,但不檢索兩個CITY值相同的三元組。——(難) 解: (1)SELECT * FROM JB; (2)SELECT * FROM JB WHERE CITY=‘上海’; (3)SELECT PN FROM PB WHERE WEIGHT=(SELECT MIN(WEIGHT)FROM PB); (4)SELECT SN FORM SPJB WHERE JN=‘J1’; (5)SELECT SN FORM SPJB WHERE JN=‘J1’AND PN=‘P1’; (6)SELECT JNAME FROM JB,SPJB WHERE SN=‘S1’AND SPJB.JN=JB.JN; (7)SELECT DISTINCT COLOR FROM PB,SPJB WHERE SN=‘S1’AND SPJB.JN=JB.JN' (8)SELECT SN FROM SPJB WHERE JN IN {J1, J2}; 或者 SELECT SN FROM SPJB WHERE JN=’J1’ OR JN=’J2’; (9)SELECT SN FROM SPJB,PB WHERE COLOR=‘紅色’AND PB.PN=SPJB.PN AND JN=’J1’; (10)SELECT DISTINCT SN FROM SPJB,JB WHERE CITY=‘上海’AND JB.JN=SPJB.JN; (11)SELECT SN FROM PB, JB, SPJB WHERE COLOR=‘紅色’AND CITY IN {‘上海’,‘北京’} AND PB.PN=SPJB.PN AND JB.JN=SPJB.JN; (12)SELECT PN FROM SB, JB , SPJB WEHRE SB.CITY=JB.CITY AND SB.SN=SPJB.SN AND JB.JN=SPJB.JN; (13)SELECT PN FROM SB, SPJB, JB WEHRE SB.CITY=‘上海’AND JB.CITY=‘上海’ AND SB.SN=SPJB.SN AND JB.JN=SPJB.JN; (14)SELECT JN FROM JB WHERE EXISTS(SELECT * FROM SB WHERE EXISTS(SELECT * FROM SPJB WHERE SB.CITY<>JB.CITY AND SPJB.SN= SB.SN AND SPJB.JN= JB.JN)); (15)SELECT DISTINCT JN FROM SPJB WHERE JN NOT IN(SELECT DISTINCT SPJB.JN FROM SB,SPJB WHERE SB.SN=SPJB.SN AND SB.CITY=‘上海’); (16)SELECT DISTINCT SPJB.SN FROM SB,SPJB WHERE SPJB.PN IN(SELECT SPJB.PN FROM SPJB,PB WHEREPB.PN=SPJB.PN AND PB.COLOR=‘紅色’; (17)SELECTJN FROM SPJB WHERE SN=’S1’; (18)SELECT DINSINCT SB.CITY , JB.CITY FROM SB, JB, SPJB WHERE SB.SN=SPJB.SN AND JB.JN=SPJB.SN; (19)SELECT SB.CITY, SPJB.PN, JB.CITY FROM SB,JB,SPJB WHERE SB.SN=SPJB.SN AND JB.JN=SPJB.JN; (20)SELECT DISTINCT SB.CITY, SPJB.PN, JB.CITY FROM SB,JB,SPJB WHERE SB.SN=SPJB.SN AND JB.JN=SPJB.JN AND SB.CITY<>JB.CITY; 8、設有如下關系模式:——(中) 圖書關系B(圖書編號B#,圖書名T,作者A,出版社P); 讀者關系R(借書證號C#,讀者名N,讀者地址D); 借閱關系L(C#,B#,借書日期E,還書標志BZ); BZ=‘1’表示已還; BZ=‘0’ 表示未還; 寫出實現以下各題功能的SQL語句: (1)查詢“工業出版社”出版的圖書名 (2)將書號為B5的圖書的出版社改為“工業出版社” (3)查詢99年12月31日以前借書未還的讀者名與書名 (4)查所借的書包含借書證號為C1的讀者借出未還的所有書的讀者名與借書證號。 (5)刪去“工業出版社”出版的所有圖書及相關的借閱信息。 解: (1)SelectTfromBWhereP = ’工業出版社’ (2)UpdateBSetP=’工業出版社’ WhereB# = ’B5’ (3)SelectN , TFrom B, R , L WhereE <’99/12/31’ AND BZ=’0’ AND L.C#=R.C# AND L.B#=B.B# (4)select N,C# from R where not exists (select * from LL1 where L1.C#=’c1’ and BZ=‘0’ andnot exists (select * from L L2 where L2.c#=R.c# and L2.B#=L1.B#)) (6)Delete from LWhere B#IN(Select B#From B Where P=’工業出版社’); Delete from B Where P=’工業出版社’; sql學習心得:SQL SERVER 2005 sql學習心得:SQL SERVER 2005學習心得 一、數據庫設計方面 1、字段類型。 varchar(max)nvarchar(max)類型的引入大大的提高了編程的效率,可以使用字符串函數對CLOB類型進行操 作,這是一個亮點。但是這就引發了對varchar和char效率討論的老問題。到底如何分配varchar的數據,是否 會出現大規模的碎片?是否碎片會引發效率問題?這都是需要進一步探討的東西。varbinary(max)代替image也讓SQL Server的字段類型更加簡潔統一。 XML字段類型更好的解決了XML數據的操作。XQuery確實不錯,但是個人對其沒好感。(CSDN的開發者應 該是相當的熟了!) 2、外鍵的級聯更能擴展 可能大部分的同行在設計OLTP系統的時候都不愿意建立外鍵,都是通過程序來控制父子數據的完整性。但是 再開發調試階段和OLAP環境中,外鍵是可以建立的。新版本中加入了SET NULL 和 SET DEFAULT 屬性,能夠 提供能好的級聯設置。 3、索引附加字段 這是一個不錯的新特性。雖然索引的附加字段沒有索引鍵值效率高,但是相對映射到數據表中效率還是提高了 很多。我做過試驗,在我的實驗環境中會比映射到表中提高30%左右的效率。 4、計算字段的持久化 原來的計算字段其實和虛擬字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了計算 字段的持久化,這就提高了查詢的性能,但是會加重insert和update的負擔。OLTP慎用。OLAP可以大規模使 用。 5、分區表 分區表是個亮點!從分區表也能看出微軟要做大作強SQL Server的信心。資料很多,這里不詳細說。但是重點 了解的是:現在的SQL Server2005的表,都是默認為分區表的。因為它要支持滑動窗口的這個特性。這種特性 對歷史數據和實時數據的處理是很有幫助的。 但是需要注意的一點,也是我使用過程中發現的一個問題。在建立 function->schema->table后,如果在現有的分區表上建立沒有顯式聲明的聚集索引時,分區表會自動變為非分區表。這一點很讓我納悶。如果你覺得我的非分區索引無法對起子分區,你可以提醒我一下呀!沒有任何的提醒,直接就變成了非分區表。不知道這算不算一個bug。 大家也可以試試。 分區表效率問題肯定是大家關心的問題。在我的試驗中,如果按照分區字段進行的查詢(過濾)效率會高于未 分區表的相同語句。但是如果按照非分區字段進行查詢,效率會低于未分區表的相同語句。但是隨著數據量的增大,這種成本差距會逐漸減小,趨于相等。(500萬數量級只相差10%左右) 6、CLR類型 微軟對CLR作了大篇幅的宣傳,這是因為數據庫產品終于融入.net體系中。最開始我們也是狂喜,感覺對象數 據庫的一些概念可以實現了。但是作了些試驗,發現使用CLR的存儲過程或函數在達到一定的閥值的時候,系 統性能會呈指數級下滑!這是非常危險的!只使用幾個可能沒有問題,當一旦大規模使用會造成嚴重的系統性 能問題! 其實可以做一下類比,Oracle等數據庫產品老早就支持了java編程,而且提供了java池參數作為用戶配置接口 。但是現在有哪些系統大批使用了java存儲過程?!連Oracle自己的應用都不用為什么?!還不是性能有問題 !否則面向對象的數據庫早就實現了! 建議使用CLR的地方一般是和應用的復雜程度或操作系統環境有很高的耦合度的場景。如你想構建復雜的算法,并且用到了大量的指針和高級數據模型。或者是要和操作系統進行Socket通訊的場景。否則建議慎重! 7、索引視圖 索引視圖2k就有。但是2005對其效率作了一些改進但是schema.viewname的作用域真是太限制了它的應用面 。還有一大堆的環境參數和種種限制都讓人對它有點卻步。 8、語句和事務快照 語句級快照和事務級快照終于為SQL Server的并發性能帶來了突破。個人感覺語句級快照大家應該應用。事務 級快照,如果是高并發系統還要慎用。如果一個用戶總是被提示修改不成功要求重試時,會殺人的! 9、數據庫快照 原理很簡單,對要求長時間計算某一時間點的報表生成和防用戶操作錯誤很有幫助。但是比起Oracle10g的閃 回技術還是細粒度不夠。可惜! 10、Mirror Mirror可以算是SQL Server的Data guard了。但是能不能被大伙用起來就不知道了。 二、開發方面 1、Ranking函數集 其中最有名的應該是row_number了。這個終于解決了用臨時表生成序列號的歷史,而且SQL Server2005的row_number比Oracle的更先進。因為它把Order by集成到了一起,不用像Oracle那樣還要用子查詢進行封裝 。但是大家注意一點。如下面的例子: select ROW_NUMBER()OVER(order by aa) from tbl order by bb 會先執行aa的排序,然后再進行bb的排序。 可能有的朋友會抱怨集成的order by,其實如果使用ranking函數,Order by是少不了的。如果擔心Order by會影響效率,可以為order by的字段建立聚集索引,查詢計劃會忽略order by 操作(因為本來就是排序的嘛)。 2、top 可以動態傳入參數,省卻了動態SQL的拼寫。 3、Apply 對遞歸類的樹遍歷很有幫助。 4、CTE 個人感覺這個真是太棒了!閱讀清晰,非常有時代感。 5、try/catch 代替了原來VB式的錯誤判斷。比Oracle高級不少。 6、pivot/unpivot 個人感覺沒有case直觀。而且默認的第三字段(還可能更多)作為group by字段很容易造成新手的錯誤。 三、DBA管理方面 1、數據庫級觸發器 記得在最開始使用2k的時候就要用到這個功能,可惜2k沒有,現在有了作解決方案的朋友會很高興吧。 2、多加的系統視圖和實時系統信息 這些東西對DBA挑優非常有幫助,但是感覺粒度還是不太細。 3、優化器的改進 一直以來個人感覺SQL Server的優化器要比Oracle的聰明。SQL2005的更是比2k聰明了不少。(有次作試驗 發現有的語句在200萬級時還比50萬級的相同語句要快show_text的一些提示沒有找到解釋。一直在奇怪。) 4、profiler的新事件觀察 這一點很好的加強了profiler的功能。但是提到profiler提醒大家注意一點。windows2003要安裝sp1補丁才能 啟動profiler。否則點擊沒有反應。 5、sqlcmd 習慣敲命令行的朋友可能會爽一些。但是功能有限。適合機器跑不動SQL Server Management Studio的朋友 使用。 四、遺憾 1、登陸的控制 始終遺憾SQL Server的登陸無法分配CPU/內存占用等指標數。如果你的SQL Server給別人分配了一個只可以 讀幾個表的權限,而這個家伙瘋狂的死循環進行連接查詢,會給你的系統帶來很大的負擔。而SQL Server如果 能像Oracle一樣可以為登陸分配如:5%的cpu,10%的內存。就可以解決這個漏洞。 2、數據庫物理框架沒有變動 undo和redo都放在數據庫得transaction中,個人感覺是個敗筆。如果說我們在設計數據庫的時候考慮分多個 數據庫,可能能在一定程度上避免I/O效率問題。但是同樣會為索引視圖等應用帶來麻煩。看看行級和事務級的快照數據放在tempdb中,就能感覺到目前架構的尷尬。 3、還是沒有邏輯備份 備份方面可能還是一個老大難的問題。不能單獨備份幾個表總是感覺不爽。靈活備份的問題不知道什么時候才 能解決。 4、SSIS(DTS)太復雜了 SQL Server的異構移植功能個人感覺最好了。(如果對比過SQL Server的鏈接服務器和Oracle的透明網關的朋友會發現SQL Server的sp_addlinkedserver(openquery)異構數據庫系列比Oracle真是強太多了。) 以前的DTS輕盈簡單。但是現在的SSIS雖然功能強大了很多,但是總是讓人感覺太麻煩。 sql語句學習 ? 數據定義語言(DDL): 1)創建數據庫(create):create database database-name; eg.create database test; 2)刪除數據庫:drop database dbname; eg.drop database test; 3)創建新表:create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..); eg.根據已有的表創建新表的例子:create table tab_new like tab_old;create table tab_new as select col1,col2… from tab_old definition only; 4)刪除表:drop table tabname; 5)增加列:alter table tabname add column col type; 6)添加主鍵: alter table tabname add primary key(col); 7)刪除主鍵:alter table tabname drop primary key(col); 8)創建索引:create [unique] index idxname on tabname(col….); 9)刪除索引:drop index idxname;注:索引是不可更改的,想更改必須刪除重新建; 10)創建視圖:create view viewname as select statement; 2.數據操縱語言(DML) 1)查詢語句(select) eg1.select * from table1 where field1 like '%value1%'; eg2.select * from table1 order by field1,field2 [desc]; eg3.select count as totalcount from table1; eg4.select sum(field1)as sumvalue from table1; eg5.select avg(field1)as avgvalue from table1; eg6.select max(field1)as maxvalue from table1; eg7.select min(field1)as minvalue from table1; eg8.select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c;(注:此為左外連接,結果集中包括連接表的匹配行,也包括左連接表的所有行) 2)插入語句(insert) insert into table1(field1,field2)values(value1,value2); 3)刪除語句(delete) delete from table1 where 范圍; 4)更新語句(update) update table1 set field1=value1 where 范圍; 3.數據控制語言(DCL) 1)授予權限語句(GRANT) GRANT privileges(columns)ON what TO user IDENTIFIED BY “password” WITH GRANT OPTION; 其中:privileges可為如下限定符:ALTER 修改表和索引、CREATE(創建數據庫和表)、DELETE(刪除表中已有的記錄)、DROP(刪除數據庫和表)、INDEX(創建或刪除索引)、INSERT(向表中插入新行)、REFERENCE(未用)、SELECT(檢索表中的記錄)、UPDATE(修改現存表記錄)、FILE(讀或寫服務器上的文件)、PROCESS(查看服務器中執行的線程信息或殺死線程)、RELOAD(重載授權表或清空日志、主機緩存或表緩存)、SHUTDOWN(關閉服務器)、ALL 所 有;ALL PRIVILEGES同義詞、USAGE(特殊的“無權限”權限) columns:權限運用的列,它是可選的,并且你只能設置列特定的權限。如果命令有多于一個列,應該用逗號分開它們; what:權限運用的級別。權限可以是全局的(適用于所有數據庫和所有表)、特定數據庫(適用于一個數據庫中的所有表)或特定表的。可以通過指定一個columns字句是權限是列特定的。 user :權限授予的用戶,它由一個用戶名和主機名組成。MySQL中的一個用戶名就?悄懔臃衿魘敝付ǖ撓沒?該名字不必與你的Unix登錄名或Windows名聯系起來。缺省地,如果你不明確指定一個名字,客戶程序將使用 你的登錄名作為MySQL用戶名。這只是一個約定。你可以在授權表中將該名字改為nobody,然后以nobody連接 執行需要超級用戶權限的操作。 password:賦予用戶的口令,它是可選的。如果你對新用戶沒有指定IDENTIFIED BY子句,該用戶不賦給口令(不安全)。對現有用戶,任何你指定的口令將代替老口令。如果你不指定口令,老口令保持不變,當你用IDENTIFIED BY 時,口令字符串用改用口令的字面含義,GRANT將為你編碼口令,不要象你用SET PASSWORD 那樣使用password() 函數。 WITH GRANT OPTION子句是可選的。如果你包含它,用戶可以授予權限通過GRANT語句授權給其它用戶。你可以用該子句給與其它用戶授權的能力。 用戶名、口令、數據庫和表名在授權表記錄中是大小寫敏感的,主機名和列名不是。 eg1.創建一個超級用戶test1 grant all privilleges on *.* to test1@localhost identified by '123456' with grant option;eg2.創建一個只能查詢的用戶 test2 mysql> grant select on *.* to test2@localhost identified by '9876543'; 2)撤權并刪除用戶(revoke) 要取消一個用戶的權限,使用REVOKE語句。REVOKE的語法非常類似于GRANT語句,除了TO用FROM取代并且沒有INDETIFED BY和WITH GRANT OPTION子句: revoke privileges(columns)ON what FROM user user部分必須匹配原來GRANT語句的你想撤權的用戶的user部分。privileges部分不需匹配,你可以用GRANT 語句授權,然后用REVOKE語句只撤銷部分權限。REVOKE語句只刪除權限,而不刪除用戶。即使你撤銷了所有 權限,在user表中的用戶記錄依然保留,這意味著用戶仍然可以連接服務器。要完全刪除一個用戶,你必須 用一條DELETE語句明確從user表中刪除用戶記錄: #mysql-u root mysql DELETE FROM user WHERE User=“user_name” and Host=“host_name”; FLUSH PRIVILEGES; DELETE語句刪除用戶記錄,而FLUSH語句告訴服務器重載授權表。(當你使用GRANT和REVOKE語句時,表自動重載,而你直接修改授權表時不是。) eg.刪除用戶test1 revoke all on *.* from; use mysql; delete from user where user='test' and host='localhost';flush privileges; 3)提交語句(commit) 4)回滾語句(rollback)第四篇:學習SQL必看
第五篇:sql語句學習_經典_推薦