前言
打怪升級:第81天 |
---|
![]() |
提前聲明:
- SQL中的語法不區(qū)分大小寫,下方博主為了書寫方便,并沒有刻意去將關(guān)鍵字大寫,希望不會對大家?guī)砀蓴_。
- 本篇文章為博主為了期末考試,考前一周臨時學習時進行的自我總結(jié),由于時間精力有限,并沒有寫的足夠全面,如果各位在學習過程中發(fā)現(xiàn)問題或有所疑問都可以在評論區(qū)提出,
會及時查看,感激不盡。
希望本篇文章可以為有需要的朋友提供幫助。
一、CREATE – 創(chuàng)建
創(chuàng)建數(shù)據(jù)庫與表
CREATE DATABASE testdb-- 創(chuàng)建 數(shù)據(jù)庫 數(shù)據(jù)庫名稱
use testdb
CREATE TABLE T1(
CID INT NOT NULL PRIMARY KEY,
CNAME VARCHAR(20) ,
CAGE INT
);
CREATE TABLE T2(...);
CREATE TABLE T3(...);
go
創(chuàng)建一個名為TEST14的數(shù)據(jù)庫,創(chuàng)建三個表T1、T2、T3,
表T1有三個列,分別為 ID、NUME、AGE,且ID列為主鍵,非空。
二、INSERT INTO + VALUES – 插入數(shù)據(jù)
insert into 公司
values ('g010', '哪兒都通快遞公司', 10)
go
插入操作可以同時插入多行數(shù)據(jù),通過逗號分割,示例:
insert into table1
values
(data1, data1),
(data2, data2),
(data3, data3)
go
三、SELECT + FROM – 查找數(shù)據(jù)
1.SEKECT簡單了解
查找操作也是數(shù)據(jù)庫中十分重要的一個功能,可以根據(jù)用戶的需求,進行各種各樣的查找。
以下為最基本的查找模板:
SELECT 屬性1, 屬性2, ...
FROM table1, table2, ...
WHERE 查找條件 -- 可選
查找學生表中,學號大于等于陳靈均同學的學號的同學。
select 學號, 姓名
from 學生
where 學號 >= ( select 學號 -- 小括號-子查詢
from 學生
where 姓名 ='陳靈均')
2.函數(shù)的使用
目標:
統(tǒng)計不同畢業(yè)去向的人數(shù)。
實現(xiàn):
使用group by 按照畢業(yè)去向分組,使用 count函數(shù),統(tǒng)計各個分組的行數(shù),并且給該列起一個新的列名 – 人數(shù)
SELECT 畢業(yè)去向, COUNT(*) AS 人數(shù)
FROM 學生
GROUP BY 畢業(yè)去向
3.選擇列表與group by子句的對應
選擇列表就是 select 后面跟著的一堆列名、表達式、聚合函數(shù)等。
select cid, count(*) as scount
from sc
group by cid
在這段代碼中,選擇列表中的表達式是 “cid, count( * ) as scount”,而 GROUP BY 子句中的表達式是 “cid”,它們不完全相同。但是這是合法的 SQL 查詢,因為 “cid” 是 GROUP BY 子句中的唯一列,而 “count( * ) as scount” 是一個聚合函數(shù),它將對每個分組計算 “cid” 列中的唯一值數(shù)量,并將結(jié)果命名為 “scount”。
在這個查詢中,“cid” 列用于確定分組,而 “count(*) as scount” 列用于顯示每個分組中 “cid” 列的唯一值數(shù)量。因此,這個查詢將返回每個 “cid” 值及其對應的唯一值數(shù)量。
總之,雖然選擇列表和 GROUP BY 子句中的表達式不完全相同,但它們的含義是一致的,因此這個查詢是合法的。
4.exists子查詢
如果子查詢需要返回多個列,你可以使用
EXISTS
子查詢來解決這個問題。EXISTS
子查詢只需要返回一個布爾值,因此可以用于檢查一個表中是否存在符合條件的記錄。下面是一個使用EXISTS
子查詢的示例查詢:
SELECT *
FROM c
WHERE EXISTS (
SELECT 1
FROM sc
WHERE sc.cid = c.cid
GROUP BY sc.cid
HAVING COUNT(*) >= 3
);
在這個查詢中,子查詢返回一個布爾值,指示是否存在至少 3 個學生選修了每個課程。如果子查詢返回 TRUE
,則 EXISTS
子句將返回 TRUE
,否則將返回 FALSE
。因此,這個查詢將返回選修人數(shù)不少于 3 人的課程信息。
[ 注 ] :select這部分寫的有些混亂,在最后的《小小示例》中,有許多查找樣例參考。
四、UPDATE + SET – 更改數(shù)據(jù)
在 SQL Server 中,UPDATE 語句用于更新表中的現(xiàn)有記錄。它允許您更改表中的一行或多行數(shù)據(jù)。
下面是一些使用 UPDATE 語句的示例:
- 更新單個記錄:
UPDATE 表名
SET 列名 = 新值
WHERE 條件;
例如,如果您要將公司表中一個公司的招收人數(shù)改為10,則可以使用以下語法:
use 大學生畢業(yè)去向
update 公司
set 招收人數(shù) = 10
where 公司id = 'g090';
- 更新多個記錄:
UPDATE 表名
SET 列名 = 新值
WHERE 條件;
例如,如果您要將客戶表中的所有客戶的郵政編碼更改為新郵政編碼,則可以使用以下語法:
use 大學生畢業(yè)去向
update 公司
set 招收人數(shù) = 0
- 更新多個列:
UPDATE 表名
SET 列1 = 新值1, 列2 = 新值2, …
WHERE 條件;
例如,如果您要將客戶表中的某個客戶的電話號碼和郵政編碼同時更改,則可以使用以下語法:
UPDATE Customers
SET Phone = '123-456-7890', PostalCode = '12345'
WHERE CustomerID = 1;
五、ALTER + DROP、ADD-- 修改屬性
ALTER 是 SQL 中用于修改已經(jīng)存在的數(shù)據(jù)庫對象(如表、列、索引等)的關(guān)鍵字。常見的使用場景包括:
修改表的結(jié)構(gòu):可以使用 ALTER TABLE 語句來添加、修改或刪除表的列、約束(如主鍵、外鍵、唯一性約束等)等。
修改列的定義:可以使用 ALTER TABLE 語句來修改列的數(shù)據(jù)類型、長度、默認值等屬性。
修改索引:可以使用 ALTER INDEX 語句來修改已經(jīng)存在的索引的屬性,例如添加或刪除索引列、更改索引類型等。
修改視圖:可以使用 ALTER VIEW 語句來修改已經(jīng)存在的視圖的定義,例如更改視圖的查詢語句、視圖的列名等。
修改存儲過程、觸發(fā)器等:可以使用 ALTER PROCEDURE、ALTER TRIGGER 等語句來修改已經(jīng)存在的存儲過程、觸發(fā)器等對象的定義。
總之,ALTER 在 SQL 中是一個非常常用的關(guān)鍵字,用于修改已經(jīng)存在的數(shù)據(jù)庫對象,以滿足不同的需求。
- 添加列
ALTER TABLE STU
ADD ID INT, SEX VARCHAR(10), SCH VARCHAR(50), TOTO VARCHAR(50) -- 逗號分割,創(chuàng)建多個列
GO
- 刪除列
USE TEST14
ALTER TABLE STU
DROP COLUMN SWA
GO
- 修改列屬性
USE TEST14
ALTER TABLE STU
ALTER COLUMN ID VARCHAR(50) NOT NULL ; -- 修改列屬性
ADD CONSTRAINT pk_STU PRIMARY KEY(ID); -- 設置為主鍵 pk_表名
GO
六、JOIN + ON-- 鏈接多個表
1. join初始
JOIN
是 SQL 中用于連接多個表的關(guān)鍵字。它將兩個或多個表中的行基于一個共同的列進行匹配,從而生成一個新的結(jié)果集。JOIN
通常需要指定連接條件,以確定哪些行應該被連接在一起。常用的
JOIN
類型包括:
INNER JOIN
:返回兩個表中匹配的行。LEFT JOIN
:返回左表中的所有行和右表中匹配的行。RIGHT JOIN
:返回右表中的所有行和左表中匹配的行。FULL OUTER JOIN
:返回左右兩個表中的所有行和匹配的行。
JOIN
的語法如下:
SELECT 列1, 列2, ...
FROM 表1
JOIN 表2 ON 連接條件
[JOIN 表3 ON 連接條件 ...]
WHERE 篩選條件
其中,
JOIN
關(guān)鍵字后面跟著要連接的表名,ON
關(guān)鍵字后面指定連接條件,多個表之間可以使用多個JOIN
進行連接。
最后使用WHERE
子句對結(jié)果進行篩選。需要注意的是,使用
JOIN
進行表連接時,應該確保連接條件是準確的,否則可能會得到不正確的結(jié)果。
示例:
USE 大學生畢業(yè)去向
select *
from 學生, 公司
where 去向id = 公司id
GO
USE 大學生畢業(yè)去向
select *
from 學生
left join 公司 on 去向id = 公司id
where 公司id is not null -- 篩選出第三個表中有對應公司的學生和公司信息
go
USE 大學生畢業(yè)去向
select *
from 學生
left join 公司 on 去向id = 公司id
go
2.inner join
Inner Join 和 Join 是 SQL 語言中的兩種 Join 操作,它們的區(qū)別在于:
- Inner Join 只返回兩個表中共有的記錄,而 Join 返回兩個表中所有的記錄。
- Inner Join 只返回滿足連接條件的記錄,而 Join 則返回所有記錄,其中未匹配的記錄將以 NULL 值填充。
因此,Inner Join 可以看作是 Join 的一種特殊情況,它只返回兩個表中共有的記錄,而 Join 則返回兩個表中所有的記錄。
在實際應用中,Inner Join 更常用,因為通常我們只需要查詢兩個表中共有的記錄。
而 Join則需要在后續(xù)的數(shù)據(jù)處理中進行額外的過濾和處理,比較繁瑣。
七、分支語句
1.IF
IF 關(guān)鍵字用于控制流程,根據(jù)條件執(zhí)行不同的代碼塊。
IF語句的基本語法如下:
IF condition
BEGIN
-- code to be executed if condition is true
END
ELSE
BEGIN
-- code to be executed if condition is false
END
其中,condition是一個布爾表達式,如果為true,則執(zhí)行第一個BEGIN和END之間的代碼塊,否則執(zhí)行第二個BEGIN和END之間的代碼塊。您還可以使用ELSE IF子句來添加更多的條件分支。
以下是一個簡單的示例,演示如何在SQL Server中使用IF語句:
DECLARE @score INT = 80;
IF @score >= 90
BEGIN
PRINT 'A';
END
ELSE IF @score >= 80
BEGIN
PRINT 'B';
END
ELSE IF @score >= 70
BEGIN
PRINT 'C';
END
ELSE
BEGIN
PRINT 'F';
END
在這個例子中,我們聲明了一個變量@score,并使用IF語句根據(jù)不同的分數(shù)范圍打印不同的成績等級。如果@score大于或等于90,則打印’A’,否則檢查下一個條件分支,以此類推。
2.CASE
CASE
是 SQL 中的一種條件表達式,用于在查詢中根據(jù)條件返回不同的結(jié)果。
它的語法如下:
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END
其中,condition1
、condition2
等是條件表達式,result1
、result2
等是對應條件成立時返回的結(jié)果,default_result
是所有條件都不成立時返回的默認結(jié)果。在 CASE
表達式中,可以包含多個 WHEN
子句,每個子句都可以有不同的條件和返回結(jié)果。
栗子1:獲取學生學號、姓名、考試科目以及考試成績,并且根據(jù)考試成績劃分等級。
select s.sid, sname, cid, score,
case
when score >= 90 then 'a'
when score >= 80 then 'b'
else 'c'
end as grade
from s inner join sc on s.sid = sc.sid
栗子2:因為課程號不方便我們查看,要求通過課程號為各個科目命名(假設sc表沒有存課程名)求各科平均成績
select
case
when cid = 1 then 'course1'
when cid = 2 then 'course2'
else 'other_course'
end as grade,
avg(score) as course -- 求均值
from sc
group by
case
when cid = 1 then 'course1'
when cid = 2 then 'course2'
else 'other_course'
end
3.IF 與 CASE 對比
CASE
表達式和 IF
語句雖然都是用于條件判斷和流程控制,但它們的語法和使用場景是不同的。
IF
語句通常用于程序中的控制流程,例如在編寫存儲過程或函數(shù)時,可以使用 IF
語句來判斷輸入?yún)?shù)的值,以便執(zhí)行不同的邏輯。而 CASE
表達式則是用于查詢語句中的條件判斷,可以根據(jù)不同的條件返回不同的結(jié)果集。
八、循環(huán)語句
1.WHILE
WHILE 循環(huán)是 SQL Server 中一種基于條件的循環(huán)結(jié)構(gòu),它可以在滿足指定條件的情況下重復執(zhí)行一段代碼塊。
WHILE 循環(huán)的語法如下:
WHILE condition
BEGIN
-- Code block to be executed while condition is true
END
其中,condition
是一個邏輯表達式,用于指定循環(huán)的條件。只要 condition
的值為真,就會重復執(zhí)行 BEGIN
和 END
之間的代碼塊。
在 WHILE 循環(huán)中,需要注意以下幾點:
必須在代碼塊中修改循環(huán)條件,否則循環(huán)會一直執(zhí)行下去,導致死循環(huán)。
可以在代碼塊中使用 BREAK 語句來提前結(jié)束循環(huán)。
可以在代碼塊中使用 CONTINUE 語句來跳過當前循環(huán),直接進入下一次循環(huán)。
WHILE 循環(huán)通常與游標一起使用,用于處理從數(shù)據(jù)庫中檢索的記錄。
下面是一個簡單的 WHILE 循環(huán)示例,用于計算 1 到 10 的和:
DECLARE @i INT = 1
DECLARE @sum INT = 0
WHILE @i <= 10
BEGIN
SET @sum = @sum + @i
SET @i = @i + 1
END
SELECT @sum -- 輸出結(jié)果為 55
在這個例子中,我們首先定義了兩個變量 @i
和 @sum
,分別用于存儲計數(shù)器和累加器的值。然后使用 WHILE 循環(huán)重復執(zhí)行累加操作,直到計數(shù)器的值達到 10。最后輸出累加器的值,即 1 到 10 的和。
-
變量
在 SQL Server 中,變量可以用來存儲臨時數(shù)據(jù),以便在查詢或存儲過程中使用。變量必須在使用之前聲明,并且必須指定變量的數(shù)據(jù)類型。以下是一個聲明和使用變量的示例:
DECLARE @myVariable INT;
SET @myVariable = 10;
SELECT @myVariable;
在上面的示例中,我們聲明了一個名為 @myVariable 的整數(shù)類型變量,并將其設置為 10。然后,我們使用 SELECT 語句檢索變量的值。
2.FOR + TO
在 SQL Server 中,
for
通常用于循環(huán)語句的控制,可以與while
一起使用。for
循環(huán)包括三個部分:初始化、循環(huán)條件和循環(huán)迭代。
其基本語法結(jié)構(gòu)如下:
DECLARE @counter INT = 0
FOR @counter = 1 TO 10
BEGIN
-- 循環(huán)體
END
其中,@counter
變量被初始化為 0,然后在 for
循環(huán)中被設置為 1,循環(huán)條件為 @counter <= 10
,循環(huán)迭代為 @counter = @counter + 1
。在每次循環(huán)中,@counter
的值都會自動遞增,直到循環(huán)條件不再滿足為止。需要注意的是,for
循環(huán)僅在 SQL Server 2016 及以上版本中才支持,如果使用早期版本,則需要使用 while
循環(huán)來實現(xiàn)類似的功能。
FOR 循環(huán)和 WHILE 循環(huán)是 SQL Server 中兩種不同的循環(huán)結(jié)構(gòu),它們的用法和使用場景有所不同。
FOR 循環(huán)是一種基于計數(shù)器的循環(huán),通常用于執(zhí)行已知次數(shù)的循環(huán)操作。FOR
循環(huán)在執(zhí)行前需要明確指定循環(huán)次數(shù),然后在每次循環(huán)中遞增計數(shù)器的值,直到計數(shù)器達到指定的循環(huán)次數(shù)為止。FOR
循環(huán)通常用于處理固定數(shù)量的數(shù)據(jù),例如數(shù)組或表格。WHILE 循環(huán)則是一種基于條件的循環(huán),通常用于執(zhí)行未知次數(shù)的循環(huán)操作。WHILE
循環(huán)在執(zhí)行前不需要指定循環(huán)次數(shù),而是在每次循環(huán)中檢查一個條件,只要條件為真,就會繼續(xù)執(zhí)行循環(huán)操作。WHILE
循環(huán)通常用于處理不確定數(shù)量的數(shù)據(jù),例如從數(shù)據(jù)庫中檢索的記錄。總的來說,F(xiàn)OR 循環(huán)適合處理已知數(shù)量的數(shù)據(jù),
而 WHILE循環(huán)適合處理未知數(shù)量的數(shù)據(jù)。在實際應用中,需要根據(jù)具體的需求選擇合適的循環(huán)結(jié)構(gòu)。
九、DECLARE + CURSOR-- 游標
1.初識游標
游標是一種用于在 SQL Server 中遍歷結(jié)果集的機制。游標可以讓我們逐行地讀取結(jié)果集中的數(shù)據(jù),并對每一行數(shù)據(jù)進行處理。在 SQL
Server 中,使用游標需要以下步驟:
聲明游標:使用
DECLARE
語句聲明游標,并指定要遍歷的結(jié)果集。打開游標:使用
OPEN
語句打開游標,準備開始遍歷結(jié)果集。讀取數(shù)據(jù):使用
FETCH
語句讀取游標當前指向的行,并將數(shù)據(jù)存儲到變量中。處理數(shù)據(jù):對于每一行數(shù)據(jù),可以進行相應的處理,例如輸出、更新等操作。
關(guān)閉游標:使用
CLOSE
語句關(guān)閉游標,釋放資源。釋放游標:使用
DEALLOCATE
語句釋放游標占用的內(nèi)存空間。
2.游標的定義
最簡單的游標聲明語法如下:
DECLARE cursor_name CURSOR FOR
SELECT column1, column2, ...
FROM table_name
其中,cursor_name
是游標的名稱,table_name
是要查詢的表名,column1
、column2
等是要查詢的列名。這條語句將創(chuàng)建一個游標,將查詢結(jié)果集中的所有行放入游標中,游標的指針初始位置為第一行。
3.見見豬跑
以下是一個示例代碼,用于讀取 student 表中的女生信息,并將第二個女同學的年齡改為 20:
(略看即可)
DECLARE female_cursor CURSOR FOR
SELECT name, age FROM student WHERE gender='female'
OPEN female_cursor
DECLARE @name VARCHAR(50), @age INT
FETCH NEXT FROM female_cursor INTO @name, @age
WHILE @@FETCH_STATUS = 0
BEGIN
-- 處理數(shù)據(jù)
PRINT 'Name: ' + @name + ', Age: ' + CAST(@age AS VARCHAR(10))
IF @@CURSOR_ROWS = 2
BEGIN
-- 修改第二個女同學的年齡為 20
UPDATE student SET age = 20 WHERE CURRENT OF female_cursor
PRINT 'Age updated to 20'
END
FETCH NEXT FROM female_cursor INTO @name, @age
END
CLOSE female_cursor
DEALLOCATE female_cursor
在上面的示例代碼中,我們使用 DECLARE
語句聲明了一個名為 female_cursor
的游標,用于遍歷 student
表中的女生信息。然后使用 OPEN
語句打開游標,使用 FETCH
語句讀取第一行數(shù)據(jù),并將數(shù)據(jù)存儲到 @name
和 @age
變量中。在循環(huán)中,我們對每一行數(shù)據(jù)進行相應的處理,包括輸出、更新等操作。在讀取完所有數(shù)據(jù)后,使用 CLOSE
語句關(guān)閉游標,使用 DEALLOCATE
語句釋放游標占用的內(nèi)存空間。
4.吃“豬肉”
在 SQL Server 中,使用
FOR
關(guān)鍵字聲明游標時,它是用來指定游標的循環(huán)方式的。在FOR
關(guān)鍵字后面指定了游標的循環(huán)方式,可以是FORWARD_ONLY
,SCROLL
或STATIC
,默認情況下為FORWARD_ONLY。
FORWARD_ONLY
:指定游標只能向前滾動,不能回滾。這是最快的游標類型,因為它不需要額外的資源來維護游標位置。
SCROLL
:指定游標可以向前和向后滾動,可以隨意定位到表中的任何位置。這種類型的游標需要額外的資源來維護游標的位置,因此比FORWARD_ONLY
類型的游標慢。
STATIC
:指定游標是靜態(tài)的,它不會隨著表的修改而改變。這種類型的游標可以提供一致的結(jié)果,但是需要較多的資源來維護游標。
例如,以下代碼聲明了一個 FORWARD_ONLY
類型的游標:
DECLARE myCursor CURSOR FORWARD_ONLY FOR
SELECT column1, column2, column3
FROM myTable
5.FETCH使用細節(jié)
@@FETCH_STATUS
是一個系統(tǒng)變量,用于檢查最近一次FETCH
語句的執(zhí)行結(jié)果。
如果FETCH
語句成功讀取了一行數(shù)據(jù),則@@FETCH_STATUS
的值為 0。
如果FETCH
語句沒有讀取到數(shù)據(jù),則@@FETCH_STATUS
的值為 -1。
如果FETCH
語句執(zhí)行出錯,則@@FETCH_STATUS
的值為-2。
在使用游標時,通常需要在循環(huán)中檢查@@FETCH_STATUS
的值,以便在讀取完所有數(shù)據(jù)后正確地退出循環(huán)。
在 SQL Server 中,可以使用 FETCH
語句來從游標中檢索數(shù)據(jù),并且可以使用 關(guān)鍵字來顯式地移動游標指針。
`FETCH` 語句有多種形式,可以使用 `FETCH NEXT` 語句來檢索下一行數(shù)據(jù),例如:
FETCH NEXT FROM cursor_name; -- 如不顯示聲明,默認為 NEXT
可以使用 `FETCH PRIOR` 語句來檢索上一行數(shù)據(jù),例如:
FETCH PRIOR FROM cursor_name;
可以使用 `FETCH FIRST` 語句來檢索第一行數(shù)據(jù),例如:
FETCH FIRST FROM cursor_name;
可以使用 `FETCH LAST` 語句來檢索最后一行數(shù)據(jù),例如:
FETCH LAST FROM cursor_name;
此外,還可以使用 `FETCH ABSOLUTE` 和 `FETCH RELATIVE` 語句來檢索指定行號或相對位置的數(shù)據(jù),例如:
FETCH ABSOLUTE 5 FROM cursor_name;
FETCH RELATIVE 2 FROM cursor_name;
需要注意的是,游標的移動是有限制的,當游標移動到結(jié)果集的第一行或最后一行時,再次移動游標將不會有任何效果。此外,在使用游標時,還應該注意游標的關(guān)閉和釋放,以免占用過多的系統(tǒng)資源。
十、CREATE VIEW – 視圖
視圖(View)是一種虛擬的表,它不像物理表一樣存儲數(shù)據(jù),而是基于一個或多個物理表的查詢結(jié)果集來創(chuàng)建的。視圖可以看作是一個“虛擬表格”,它包含了從一個或多個表中查詢出來的數(shù)據(jù),并且可以像表一樣被查詢、過濾、排序等。
視圖的創(chuàng)建方式類似于查詢語句,它是基于一個或多個表的查詢結(jié)果集來創(chuàng)建的,可以包含任意的 SQL 語句,例如
SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY 等。
視圖可以使用 CREATE VIEW 語句來創(chuàng)建,語法如下:
CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;
其中,view_name
是視圖的名稱,column1, column2, ...
是要查詢的列,table_name
是要查詢的物理表,condition
是查詢條件。
創(chuàng)建視圖后,可以像查詢普通表一樣使用視圖。例如,可以使用以下語法來查詢視圖:
SELECT * FROM view_name;
在查詢視圖時,實際上是執(zhí)行了視圖定義中的
SELECT
語句,并返回結(jié)果集。
可以使用視圖來簡化復雜查詢,提高查詢效率,增強數(shù)據(jù)安全性等。視圖可以多次使用,也可以在其他查詢語句中嵌套使用。
創(chuàng)建一個保存sc表中前兩名同學所有信息的視圖:
create view top_tow_sc
as
select top(2) * from sc order by score desc -- 降序
視圖的使用:
select * from top_tow_sc;
select s.sid, s.sname, score from s join top_tow_sc on s.sid = top_tow_sc.sid;
一個視圖創(chuàng)建后可以當做實際的表來使用,并且可以多次使用。
十一、CREATE PROCEDURE – 存儲過程
存儲過程是一種預編譯的數(shù)據(jù)庫對象,可以在數(shù)據(jù)庫中創(chuàng)建和保存,由一組 SQL語句和流程控制語句組成。存儲過程可以接收參數(shù),執(zhí)行一系列操作,返回結(jié)果集或輸出參數(shù)。存儲過程通常用于實現(xiàn)復雜的業(yè)務邏輯,可以提高數(shù)據(jù)庫的性能和安全性,減少網(wǎng)絡傳輸?shù)臄?shù)據(jù)量。存儲過程還可以被其他程序或存儲過程調(diào)用,提高代碼的重用性和可維護性。
在SQL Server 數(shù)據(jù)庫系統(tǒng)中,存儲過程可以使用 Transact-SQL 語言編寫,并使用 SQL Server ManagementStudio 工具進行管理和調(diào)試。
CREATE PROCEDURE get_score -- 創(chuàng)建存儲過程
@id int -- 一個變量
as
begin
select score from sc where sid = @id -- 存儲過程執(zhí)行的操作
end
exec get_score @id = 202121; -- 調(diào)用存儲過程
上方創(chuàng)建一個存儲過程,來查找學號為 @id的學生的成績。
存儲過程不管是定義還是使用都很類似于C語言等計算機語言的函數(shù)調(diào)用。
EXEC – 執(zhí)行
在SQL Server中,
EXEC
是一個用于執(zhí)行存儲過程、函數(shù)和動態(tài)SQL語句的關(guān)鍵字。
它的語法如下:
EXEC procedure_name [parameter1, parameter2, ...]
其中,
procedure_name
是要執(zhí)行的存儲過程或函數(shù)的名稱,parameter1, parameter2, ...
是可選的輸入?yún)?shù)。如果存儲過程或函數(shù)沒有參數(shù),則可以省略方括號中的參數(shù)部分。
EXEC
關(guān)鍵字還可以用于執(zhí)行動態(tài)SQL語句,即在運行時動態(tài)構(gòu)建SQL語句并執(zhí)行。
例如:
DECLARE @sql NVARCHAR(MAX); -- 聲明變量 變量名 數(shù)據(jù)類型
SET @sql = 'SELECT * FROM my_table'; -- 變量賦值
EXEC (@sql); -- 執(zhí)行
這里,我們首先聲明一個變量@sql
來存儲SQL語句,然后使用EXEC
關(guān)鍵字來執(zhí)行該語句。請注意,在執(zhí)行動態(tài)SQL語句時,需要非常小心,以避免SQL注入等安全問題。
示例:
USE TEST14
--CREATE TABLE [STU](aaa INT); -- 創(chuàng)建表,一列,列名為 aaa
EXEC sp_rename 'STU.aaa', 'S', 'COLUMN'; -- 更改列明 '舊名' , '新名', '列'
十二、CREATE FUNCTION – 函數(shù)
在 SQL Server中,函數(shù)(Function)是一種特殊的存儲過程,用于在查詢中返回一個標量值或表格。函數(shù)可以接受一個或多個輸入?yún)?shù),并根據(jù)這些參數(shù)計算結(jié)果。函數(shù)可以用于簡化復雜的查詢和數(shù)據(jù)處理操作,提高查詢性能和代碼重用性。
SQL Server 中有三種類型的函數(shù):標量函數(shù)(Scalar Function)、表值函數(shù)(Table-Valued Function)和聚合函數(shù)(Aggregate Function)。其中,標量函數(shù)返回一個標量值(例如整數(shù)、字符串或日期),表值函數(shù)返回一個表格,而聚合函數(shù)返回一個聚合值(例如總和、平均值或計數(shù))。
下面是一個標量函數(shù)的定義示例:
CREATE FUNCTION GetSLen(@targetS VARCHAR(1000))
RETURNS INT
AS
BEGIN
RETURN LEN(@targetS);
END
該函數(shù)名為 GetSLen,接受一個 VARCHAR 類型的參數(shù) @targetS,返回參數(shù)字符串的長度。在函數(shù)體中,使用 RETURN 語句返回計算結(jié)果。
函數(shù)調(diào)用:
select dbo.GetSLen('helloworld') -- 注意使用調(diào)用模式
在 SQL Server中,每個對象都必須屬于某個模式(Schema),模式是數(shù)據(jù)庫對象的邏輯容器,用于對數(shù)據(jù)庫對象進行分類和組織。
如果在創(chuàng)建 UDF時沒有指定模式,則 SQL Server 會將其分配給默認模式 dbo。因此,當調(diào)用 UDF 時,需要使用函數(shù)名前綴 dbo.,以指定UDF 的所有者模式。如果使用的是 SQL Server 的默認模式,則可以省略 dbo. 前綴,直接使用函數(shù)名調(diào)用UDF。但是,為了避免可能的歧義,建議始終在函數(shù)名前面加上 dbo. 前綴。
十三、小小示例
該樣例從建庫開始,所有操作都可以直接復制運行,并且?guī)в胁糠肿⑨?,希望對大家有所幫助?/p>
-- 1.建數(shù)據(jù)庫
create database ssc
go
-- 2.建表
use ssc
create table s -- 學號,姓名,性別
(
sid int not null primary key , -- 非空 主鍵
sname varchar(50) ,
sex char(10),
);
create table c -- 課程號,課程名,教師
(
cid int not null primary key,
cname varchar(50) ,
teacher varchar(50)
);
create table sc -- 學號,課程號,成績
(
sid int not null,
cid int not null,
score int,
constraint pk_sc primary key(sid, cid)
)
GO
-- 3.插入數(shù)據(jù)
use ssc
insert into s
values (202121, 's1', 'man'),
(202122, 's2', 'man'),
(202123, 's3', 'woman'),
(202153, 's4', 'man');
go
use ssc
insert into c
values
(01, 's1', 'tea1'),
(02, 's2', 'tea2'),
(07, 's7', 'tea7');
go
use ssc
insert into sc
values
(202121, 01, 91),
(202122,02, 67),
(202123, 01, 97),
(202153,01, 91);
go
-- 4.查找練習
use ssc
select s.sid , sname, score -- 查看學生成績
from s join sc on s.sid = sc.sid
go
use ssc
select s.sid , sname, score -- 同上
from s, sc
where s.sid = sc.sid
go
use ssc
select * -- 查找學生學號中含有 212 的學生信息
from s
where sid like '%212%'
use ssc
select *
from c join sc on c.cid = sc.cid -- 篩選有學生選修的課程信息
go
use ssc
select teacher, count(*) as 報課人數(shù)
from c join sc on c.cid = sc.cid
group by teacher -- 按照老師分組,開始統(tǒng)計報課人數(shù)
go
use ssc
select * -- 查找有學生報名的課程的信息 -- 去重
from c
where teacher IN -- 判斷 teacher是否在子查詢中
(
select c.teacher -- 子查詢,查找所有學生選課的信息
from sc
where sc.cid = c.cid
)
go
use ssc -- 同上
select *
from c
where exists
(
select 1
from sc
where sc.cid = c.cid
)
go
-- 查找不學習課程s7的學生
select sid, sname
from s
where sid not in -- 查找不在的
(
select sid -- 子查詢:查找在的
from sc
where cid = 1
)
-- 查詢選修人數(shù)不少于3人的課程信息
select *
from c
where cid in
(
select cid
from sc
group by cid
having count(*) >= 3 -- 判斷人數(shù)
)
-- 查詢選修人數(shù)不少于3人的課程信息 -- 同上
select *
from c
where exists -- 使用 exists子查詢
(
select 1
from sc
where c.cid = sc.cid
group by cid
having count(*) >= 3 -- 判斷人數(shù)
)
-- 查詢選修人數(shù)不少于3人的課程信息 -- 同上 -- 返回結(jié)果略有不同,會帶上子查詢的結(jié)果
select *
from c inner join -- 鏈接子查詢返回的結(jié)果集
(
select cid, count(*) as scount
from sc
group by cid
having count(*) >= 3 -- 判斷人數(shù)
) as tmp -- 起個名字,便于下方使用
on c.cid = tmp.cid
-- 5. 修改數(shù)據(jù)
use ssc
update c
set cid = 06, cname = 'c6', teacher = 'newtea' -- 沒有人報名的課,更換老師,跟換新課程
-- 按照教師分組,并統(tǒng)計各個教師所教課程的報課人數(shù),等于0就替換
where not exists
(
select 1
from sc
where c.cid = sc.cid
)
go
-- 6.修改屬性
use ssc
alter table sc
alter column score int ;
go
-- 7.while循環(huán)的使用,print函數(shù)只能打印字符串
-- 使用循環(huán)中的print語句,打印學生信息以及它的成績
use ssc
declare @minid int = (select min(sid) from s);
declare @maxid int = (select max(sid) from s);
declare @i int = @minid;
while @i <= @maxid
begin
if exists (select 1 from s where sid = @i) -- 判斷學生是否存在
begin
declare @name varchar(50) = (select sname from s where sid = @i)
declare @score int = (select score from sc where sid = @i)
print 'sname: ' + @name + ', score: ' + cast (@score as varchar(10)); -- 使用cast函數(shù),將整形score轉(zhuǎn)換為varchar,以便于字符串連接
end
set @i = @i + 1;
end
-- 8.游標
-- 使用游標,查找第二個成績大于90分的同學的姓名與成績
DECLARE S_CURSOR CURSOR FORWARD_ONLY FOR
SELECT SNAME, SCORE FROM SC JOIN S ON SC.SID = S.SID
WHERE SCORE >= 90
OPEN S_CURSOR
DECLARE @NAME VARCHAR(50), @SCORE INT;
FETCH FROM S_CURSOR INTO @NAME, @SCORE
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @NAME + ': ' + CAST(@SCORE AS VARCHAR(10) );
FETCH FROM S_CURSOR INTO @NAME, @SCORE
END
CLOSE S_CURSOR
DEALLOCATE S_CURSOR
總結(jié)
-
SQL關(guān)鍵字不區(qū)分大小寫。
-
在 SQL 中,引號用于表示字符串類型的值。如果公司id是字符串類型的話,那么需要使用引號將其括起來。如果招收人數(shù)是數(shù)值類型的話,就不需要使用引號。所以,需要根據(jù)數(shù)據(jù)類型來決定是否使用引號。
-
子查詢是指在一個 SQL 語句中嵌套另一個完整的 SQL 語句,用于查詢嵌套查詢中所需要的數(shù)據(jù)。子查詢返回的是一個結(jié)果集,這個結(jié)果集可以是一個標量值、一個行或多行數(shù)據(jù)。
子查詢的結(jié)果可以作為另一個 SQL 語句的一部分,用于過濾、排序、分組等操作。例如,我們可以使用子查詢來查詢某個表中滿足某個條件的記錄數(shù),或者查詢某個表中的最大或最小值等。 -
在 SQL Server 中,變量名前面必須加上 “@” 符號,這是為了區(qū)分變量名和列名或表名。
-
游標通過declare聲明。
-
視圖是一種虛擬表,通過create創(chuàng)建,一個視圖創(chuàng)建后可以當做實際的表來使用,并且可以多次使用。文章來源:http://www.zghlxwxcb.cn/news/detail-499112.html
-
CREATE 和 DECLARE 是 SQL Server 中用于創(chuàng)建對象的兩個關(guān)鍵字,它們的使用場景和語法有所不同。
CREATE 用于創(chuàng)建新的數(shù)據(jù)庫對象,例如表、視圖、存儲過程、函數(shù)等。CREATE 語句通常需要指定對象名稱、列定義、約束、索引等詳細信息,以及必要的權(quán)限和選項。CREATE 語句的語法通常比較復雜,需要考慮多種因素,例如數(shù)據(jù)類型、長度、精度、性能等。
DECLARE 用于聲明變量、游標、表變量等臨時對象,這些對象通常只在當前會話中存在,并且不會被持久化保存。DECLARE 語句通常只需要指定對象名稱、數(shù)據(jù)類型、長度等基本信息,不需要考慮復雜的約束和索引。
關(guān)于為什么游標使用 DECLARE 而視圖和存儲過程使用 CREATE,主要是因為它們的作用和使用場景不同。游標是一種臨時對象,通常只在當前會話中使用,并且不需要被其他程序或會話調(diào)用,因此使用 DECLARE 更加合適。而視圖和存儲過程是一種可重用的數(shù)據(jù)庫對象,可以在多個查詢或程序中使用,并且需要被持久化保存,因此使用 CREATE 更加合適。文章來源地址http://www.zghlxwxcb.cn/news/detail-499112.html
到了這里,關(guān)于【SQL server關(guān)鍵字】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!