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