SQL server (四)數據的增刪改查


1.查詢數據

1. SELECT語句

SELECT select_list

[INTO new_table_name]

FROM table_list

[WHERE search_conditions]

[GROUP BY group_by_list]

[HAVING search_conditions]

[ORDER BY order_list [ASC|DESC]]

use sc_db

--查詢學生表中學生的姓名
SELECT Sname
FROM Student

--查詢三列
SELECT Sno,Sname,Ssex
FROM Student

--查詢所有
SELECT *
FROM Student

關鍵字DISTINCT

作用:去重

SELECT DISTINCT 列名稱 FROM 表名稱

--去重復數據
SELECT DISTINCT Sdept
FROM Student

關鍵字TOP

用於規定要返回的記錄的數目

SELECT TOP n *|列名 FROM 表名

--查詢所有列的前三行
SELECT TOP 3 *
FROM Student

--查詢系名的前三行
SELECT TOP 3 Sdept
FROM Student

--去掉重復數據后,后面的數據會往前補
SELECT DISTINCT TOP 3 Sdept
FROM Student 

使用別名查詢

1.在列的表達式中給出別名

SELECT 列名 ‘別名’ FROM 表名

SELECT Sno 'Sno1',Sname 'Sname1',Ssex 'Ssex1',Sage 'Sage1',Sdept 'Sdept1'
FROM Student

2.使用'='表達式

SELECT '別名' =列名 FROM 表名

SELECT 'Sno1' =Sno,'Sname1'=Sname
FROM Student

3.使用AS關鍵字來連接列表達式和指定的別名

SELECT 列名 AS '別名' FROM 表名

SELECT Sno AS 'Sno1',Cno AS 'Cno1',Grade AS 'Grade1'
FROM SC

計算列

SELECT Sno,Cno,'調整前的成績'=Grade,
'調整后的成績'=Grade-10
FROM SC

在查詢基礎上創建新表

SELECT 選擇列表

INTO 新表名

FROM 表名

2.選擇查詢

SELECT 列名

FROM 表名

WHERE 條件

比較搜索條件

=,>,<,>=,<=,<>(不等於),!>(不大於),!<(不小於),!=(不等於)

--查詢計算機科學系的學生信息
SELECT *
FROM Student
WHERE Sdept='CS'

--查詢計算機科學系的男學生信息
SELECT *
FROM Student
WHERE Sdept='CS' AND Ssex='男'

范圍搜索條件

BETWEEN和NOT BETWEEN

--查詢成績在80到90之間的學生		[80,90]閉區間
SELECT *
FROM SC
WHERE Grade BETWEEN 80 AND 90

列表搜索條件

IN關鍵字使用戶可以選擇與列表中的任意值匹配的行

--查詢計算機科學系和數學系的學生
SELECT *
FROM Student
WHERE Sdept in ('CS','MA')

搜索條件中的字符匹配符

LIKE 關鍵字搜索與指定模式匹配的字符串,字符串中可包含4種通配符

%:代替零個或多個字符

-:僅替代一個字符

[]:代表指定范圍內的單個字符,[]中可以是單個字符(如[acef]),也可以字符范圍(如[a-f])

[]:代表不在指定范圍內的單個字符,如[acef],[^a-f]

涉及空值的查詢

列名 IS NULL

列名 IS NOT NULL

--查詢課程表中先行課為空的課程
SELECT *
FROM Course
WHERE Cpno IS NULL

3.聚合函數

聚合函數對一組值執行計算,並返回單個值

SUM([DISTINCT] <列名>):求和

AVG([DISTINCT] <列名>):平均值

MAX([DISTINCT] <列名>):最大值

MIN([DISTINCT] <列名>):最小值

COUNT(*):統計表中元組個數

COUNT([DISTINCT] <列名>):統計本列列值個數

除COUNT(*)外,其他函數在計算過程中均忽略NULL值。

SELECT 聚合函數 FROM 表名

--求成績的總和
SELECT SUM(Grade) AS '總成績'
FROM SC

--求成績的平均值
SELECT AVG(Grade) AS '平均成績'
FROM SC

--最大值
SELECT MAX(Grade) AS '最高成績'
FROM SC

--最小值
SELECT MIN(Grade) AS '最低成績'
FROM SC

--統計學生的總人數
SELECT COUNT(*) AS '總人數'
FROM Student

--查詢有成績的學生個數
SELECT COUNT(DISTINCT Sno)
FROM SC

4.數據分組

GROUP BY 語句用於聚合函數,根據一個或多個列對結果集進行分組。

SELECT 列名, 聚合函數(列名) FROM 表名

GROUP BY 列名

--對系分組,查詢每個系的學生人數
SELECT Sdept,COUNT(Sdept) AS '系數量'
FROM Student
GROUP BY Sdept

--查詢每個系學生的最大年齡和最小年齡
SELECT Sdept,MAX(Sage) AS '最大年齡',MIN(Sage) AS '最小年齡'
FROM Student
GROUP BY Sdept

HAVING通常與GROUP BY子句一起使用。相當於一個用於組的WHERE子句,制定組的搜索條件。HAVING子句可以包含聚合函數,但WHERE不可以。

--查詢總成績小於400分的學號
SELECT Sno,SUM(Grade) AS '總成績'
FROM SC
GROUP BY Sno
HAVING SUM(Grade)<400

5.數據排序

使用ORDER BY 語句對結果集排序

默認升序,降序可以使用DESC關鍵字

--查看學生表,按年齡升序
SELECT *
FROM Student
ORDER BY Sage

--查看學生表,按年齡降序
SELECT *
FROM Student
ORDER BY Sage DESC

6.子查詢

子查詢在其他查詢結果的基礎上提供了一種有效的方式來表示WHERE子句的條件。

子查詢用圓括號括起來。

嵌套子查詢

--查詢計算機科學系學生選修了哪些課程
SELECT *
FROM SC
WHERE Sno IN
(SELECT Sno
FROM Student
WHERE Sdept='CS'
)

--查詢修了‘2’號課程
--且成績高於此課程平均分的學生的學號和成績
SELECT Sno,Grade
FROM SC
WHERE Cno='2'
AND Grade>
(SELECT AVG(Grade)
FROM SC
WHERE Cno='2'
)

WHERE子句后的條件要什么,子查詢就查什么。

相關子查詢

也叫單值子查詢。只返回一個值,然后將一列值與查詢返回的值進行比較。

--查詢和李勇一個系的學生
SELECT Sname
FROM Student
WHERE Sdept=(SELECT Sdept
FROM Student
WHERE Sname='李勇'
)

7.表連接

在實際查詢應用中,用戶所需要的數據並不全在一個表中,可能存在多個表中,這時就需使用多表查詢。

在數據庫應用中,經常需要從多個相關的表中查詢數據,這就需要進行表連接。

內部連接

兩種語法:

SELECT select_list FROM 表名1,表名2

WHERE 表1.列=表2.列

SELECT select_list FROM 表1 [INNER] JOIN 表2

ON 表1.列=表2.列

--查詢學生信息和成績
SELECT Student.Sno,Student.Sname,Student.Sdept,SC.Grade
FROM Student,SC
WHERE Student.Sno=SC.Sno

--使用別名
SELECT Stu.Sno,Stu.Sname,Stu.Sdept,SC.Grade
FROM Student AS Stu,SC
WHERE Stu.Sno=SC.Sno

SELECT Student.Sno,Sname,Sdept, SC.Grade
FROM Student INNER JOIN SC
ON Student.Sno=SC.Sno

只用匹配到的結果才會有輸出

外部連接

返回FROM子句中提到的至少一個表或視圖中的所有行

分為左外部連接、右外部連接、全外連接

(先寫的是左表)

左外連接

使用LEFT OUTER JOIN關鍵字。左外部連接對連接條件中左邊的表不加限制。如果左表的某行在右表中沒有找到匹配的行,則結果集中的右表的相對應的位置為NULL。

--查詢所有學生的學號,姓名,系名,成績
SELECT Student.Sno,Student.Sname,Student.Sdept,SC.Grade
FROM Student LEFT OUTER JOIN SC
ON Student.Sno=SC.Sno
右外連接

使用RIGHT OUTER JOIN關鍵字。右外部連接對連接條件中右邊的表不加限制。如果右表的某行在左表中沒有找到匹配的行,則結果集中的左表的相對應的位置為NULL。

完全連接

使用FULL OUTER JOIN關鍵字。對兩個表都不加限制,所有兩個表中的行都會包括在結果集中。當某行在一個表中沒有匹配的行時,則另一個表與之相對應列的值為NULL。

2.添加數據

1.使用INSERT和VALUES插入行

INSERT [INTO] 表名 [(列名)]

VALUES(data_values,...n)

--往學生表添加學生信息
INSERT INTO Student(Sno,Sname,Ssex,Sage,Sdept) VALUES('201215121','李勇','男',20,'CS')
INSERT INTO Student VALUES('201215122','劉晨','女',19,'CS')
INSERT INTO Student VALUES('201215123','王敏','女',18,'MA')
INSERT INTO Student VALUES('201215125','張立','男',19,'IS')

--往課程表添加課程信息
INSERT INTO Course(Cno,Cname,Cpno,Ccredit) VALUES('1','數據庫','5',4)
INSERT INTO Course VALUES('2','數學',NULL,4)
INSERT INTO Course VALUES('3','信息系統','1',4)
INSERT INTO Course VALUES('4','操作系統','6',3)
INSERT INTO Course VALUES('5','數據結構','7',4)
INSERT INTO Course VALUES('6','數據處理',NULL,2)
INSERT INTO Course VALUES('7','PASCAL語言','6',4)

--往學生-課程表添加信息
INSERT INTO SC(Sno,Cno,Grade) VALUES('201215121','1',92)
INSERT INTO SC VALUES('201215121','2',85),('201215121','3',88),
('201215121','2',90),('201215121','2',80)

2.使用INSERT和SELECT插入行

在INSERT語句中使用SELECT子句可以將一個或多個表或視圖中的值添加到另一個表中。使用SELECT子句還可以同時插入多行。

INSERT [INTO] table_name [(column_list)]

SELECT select_list FROM table_name

--創建一個學號-姓名表
CREATE TABLE Sno_Sname
(
Sno VARCHAR(50),
Sname VARCHAR(50)
)

INSERT INTO Sno_Sname
SELECT Sno,Sname FROM Student

3.修改數據

UPDATE 表名 SET 列名=表達式 [WHERE限定條件]

--修改數學課程的學分
UPDATE Course SET Ccredit=2 WHERE Cno='2'

--將計算機系全體學生成績+5分
--使用子查詢
UPDATE SC SET Grade=Grade+5
WHERE Sno IN
(SELECT Sno FROM Student
WHERE Sdept='CS'
)
--使用多表連接
UPDATE SC SET Grade=Grade+5
FROM SC JOIN Student ON SC.Sno=Student.Sno
WHERE Sdept='CS'

4.刪除數據

DELETE FROM 表名 WHERE 選擇條件

--刪除90分以上的學生
DELETE FROM SC
WHERE Grade>90

--刪除前20%的學生成績
DELETE TOP (20) PERCENT FROM SC
--刪除前5行
DELETE TOP (5) FROM SC


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM