SQL總複習帶例子(部分個人註釋)

distinct:用於返回唯一不同的值

例子
select distinct Company from Orders;

where:有條件的選取表中數據

操作符 描述
= 等於
<> 不等於
> 大於
< 小於
>= 大於等於
<= 小於等於

BETWEEN 在某個範圍內
LIKE 搜索某種模式

例子
Select * from Persons where Firstname=’Jack’;
Select * from Persons where score>80;
Select * from Persons where Firstname like ‘Xie %’;
Select * from Persons where Secondname not like ‘%qq%’;

And 和 Or運算符:用戶將多個條件相結合

例子
Select * from Persons where Firstname=‘Xie’and where SecondName like “xie%”;
Select * from Persons where (Firstname = ‘Xie’ OR Firstname =’Zhang’) and Secondname = ‘%xie’;

Order by:根據指定的列對結果集進行排序

例子
Select name,score From users order by score desc ;
Select name,score from users order by score desc,name asc;

Insert into:用於向表格中插入新的行

例子
Insert into Users values (‘Jack’,100,’1,’beijing’);
Insert into Users(name,score) values(‘Jack’,99);

Update:用於修改表中的數據

例子
Update Users set name=’Mary’,score=288 where id=99;

Delete:用於刪除表中的行

例子
Delete from users where id = 28;
Delete from users;//刪除所有數據,表結構依然存在

Top/limit:規定要返回的記錄的數目

例子
Select top 2 name,user from users;
Select top 50 percent user,score from users;
Select * from users limit 5;
Select * from users where rownum <= 5;
① selete * from testtable limit 2,1;
② selete * from testtable limit 2 offset 1;
2.offset X是跳過X個數據,limit Y是選取Y個數據
3.limit X,Y 中X表示跳過X個數據,讀取Y個數據
①是從數據庫中第三條開始查詢,取一條數據,即第三條數據讀取,一二條跳過
②是從數據庫中的第二條數據開始查詢兩條數據,即第二條和第三條。

Like:用於在where字句中搜索列中的指定模式。

例子
Select name,score form users where name like ’Xie%’;
Select name,score form users where name not like ’Xie%’;

SQL通配符:在搜索數據庫中的數據時,SQL通配符可替代一個或多個字符。

通配符 描述
% 替代一個或多個字符
_ 僅替代一個字符
[charlist] 字符列中的任何單一字符
[^charlist]
或者
[!charlist] 不在字符列中的任何單一字符

例子
Select name,score form users where name like ’Xie%’;
Select name,score from users where name like ‘_ie%’;
Select name,score from users where name not like ‘C_r_er’;
Select name,City,score from users where City like ‘[SSB]%’;//將查詢所所有S或S或B開頭的城市
Select name,City,score from users where City like ‘[!SSB]%’;

IN操作符:允許我們在where字句中規定多個值

例子
Select name,score from users where Firstname In(‘Xie’,’Zhang’);

Between操作符:在where字句中使用,作用是介於兩個值的數據範圍

例子
Selecst name,score from users where score between 100 and 90;//MySQL包含了100和90兩個邊界值
Select name,score from users where name not between ‘Xie%’ and ‘__ang%’;

SQL Alias(別名):可以爲列名稱和表名稱指定別名

例子
Select u.id,u.score,o.id,o.orderId,o.total_price from users as u,Orders as o where u.id=o.id,o.status=1;//連表查詢+別名
Select Lastname as Family ,FirstName As Name from users;

SQL Join:用於兩個或多個表中的列之間的關係,從這些表中查詢數據

例子
Select u.id,u.name,o.id,o.total_price,o.uid from users as u inner join orders as o on u.id = o.uid order by o.total_price desc;//inner join內連接查詢+別名+根據總價降序排名

SQL inner join(與join相同):在表表中至少存在一個匹配時,inner join關鍵字返回行 //只顯示匹配的字段

例子:同上

SQL Left join:會從左表那裏返回所有的行,即使右表中沒有匹配的行 //左邊所有+右邊匹配

例子
Select u.id,u.name,o.id,o.total_price,o.uid from users as u left join orders as o on u.id = o.uid order by o.total_price desc;//left join左連接查詢+別名+根據總價降序排名

SQL right join:會從右表那裏返回所有的行,即使左表中沒有匹配的行 //右邊所有+左邊匹配

例子:
Select u.id,u.name,o.id,o.total_price,o.uid from users as u right join orders as o on u.id = o.uid order by o.total_price desc;//right join右連接查詢+別名+根據總價降序排名

SQL full join:只要其中某個表存在匹配,full join關鍵字就會返回行 //在inner的基礎上,也就是隻顯示匹配的關鍵字+其餘不匹配字段也顯示出來

LastName FirstName OrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678
Bush George
34764

例子
Select u.id,u.name,o.id,o.total_price,o.uid from users as u full join orders as o on u.id = o.uid order by o.total_price desc;//full join 全連接查詢+別名+根據總假降序排名

SQL union操作符:用於合併兩個或多個SELECT語句的結果集

請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。
例子
Select name from users1 union select name from users2;//不包括重複值
E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Gates, Bill

Select name from users1 union all select name from users2;//包括重複值
E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Carter, Thomas
Gates, Bill

SQL select into:用於創建表的備份附件

例子
Select * into Back.users_backup from users;//備份表
Select id,name,city into Back.users_backup from users where city=’Beijing’;//僅備份指定字段且城市爲背景的信息

SQL Constraints(約束):約束用於限制加入表的數據類型
Not null:約束強制列不接受NULL值
Ninque:約束唯一標識數據庫中的每條記錄,每個表允許多個unique約束
primary key:約束唯一標誌數據庫的每條記錄,主鍵必須包含唯一的值,每個表只能有個一個主鍵,主鍵列不能爲NULL值
聯合主鍵:主鍵可以是一個字段,也可以是多個字段。當爲多個字段時,只要不是所有的字段均相同即可插入數據,可有效的防止類似同名不同班級的情況。

例子
建表時,命名主鍵約束名,且一個主鍵多字段
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
)
已有表時,多字段主鍵
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
撤銷主鍵
ALTER TABLE Persons
DROP PRIMARY KEY

Foreign key:一個表的foreign key 指向另一個表的primary key

例子
建表時,關聯已定義的字段作爲外鍵
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (Id_O),
FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)
)
建表時,關聯兩個字段作爲外鍵,多對多關係(聯合主鍵對應多個關鍵)
CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
PRIMARY KEY (Id_O),
CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P,name_P)
REFERENCES Persons(Id_P,name_P)
)
在已有表添加外鍵,添加約束名和外鍵多字段
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (Id_P,name_P)
REFERENCES Persons(Id_P,name_P)
撤銷外鍵
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders

Check:約束用於限定列中的值的範圍

例子
建表時,約束id大於0,城市只能是Sandnes
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (Id_P>0 AND City=‘Sandnes’)
)
已有表的情況下建立check約束
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City=‘Sandnes’)
撤銷約束
ALTER TABLE Persons
DROP CHECK chk_Person
Default:約束用於向列中插入默認值
例子
建表時
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT ‘Sandnes’
)
已有表的情況下建立default約束
ALTER TABLE Persons
ALTER City SET DEFAULT ‘SANDNES’
撤銷
ALTER TABLE Persons
ALTER City DROP DEFAULT

索引:可以在表中建立索引,以便更加快速高效的查詢數據,用戶無法看到,它們只能被用來加速搜索或查詢——注意:更新一個包含索引的表比更新一個沒有索引的表花費更多的時間,因爲索引本身也需要更新。因此,理想的做法是僅在常常被搜索的列以及表上面建立索引

例子
索引單列
CREATE INDEX index_name
ON table_name (column_name)
在表上建立一個唯一的索引列,並以降序索引某個列的值
CREATE UNIQUE INDEX PersonIndex
ON Person (LastName DESC)
多個列索引
CREATE INDEX PersonIndex
ON Person (LastName, FirstName)

查看索引

(1)show index from tblname;
(2)show keys from tblname;
Drop:用於刪除索引、表和數據庫
例子
Drop index users.index_name;
Alter table:用於在已有的表中添加、修改、刪除列
例子

增加列
Alter table users add sex tinyint defau 1;
修改列的數據類型
Alter table users alter column sex char(1);
刪除列
Alter table users drop column city;
Auto increment:在每次插入新記錄時,自動創建主鍵字段的值,唯一
例子
CREATE TABLE Persons
(
P_Id int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)

SQL VIEW(視圖):視圖是基於SQL語句的結果集的可視化的表,數據庫的設計和結構不會受視圖的影響。

例子
創建視圖語法:
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

創建視圖:聯合兩表查詢並篩選條件。
Create view view_all_users as Select name,member_id,city from users1 where age>=18 and where city = ‘Shenzhen’ union select name,member_id,city from user2 where age>=18 and where name =’_ieDong%’;

創建視圖:嵌套查詢建立view,查詢出高於表自身平均價格的產品名及其價格。
Create view view_avg_price as select product_name,unit_price from products where unit_price>(select avg(unit_price) from products);

創建視圖:嵌套查詢建立view,從另一個視圖中查詢出某列的數據並建立新的視圖,注意:需指出原先視圖對應的數據表
Create view category_sales_for_1997 as select distinct CategoryName,Sum(ProductSales) as CategorySales from product_sales_for_1997 group by CategoryName;
使用select * from category_sales_for_1997;
或者加條件select product_name from category_sales_for_1997 where name = ‘potato’;

視圖添加列:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category
FROM Products
WHERE Discontinued=No

撤銷視圖:
SQL DROP VIEW Syntax
DROP VIEW view_name

Date函數:只要數據包含的只是日期部分,查詢一般沒什麼問題,但包含時間一般比較複雜。

函數 描述:

NOW()

返回當前的日期和時間

CURDATE()

返回當前的日期

CURTIME()

返回當前的時間

DATE()

提取日期或日期/時間表達式的日期部分

EXTRACT()

返回日期/時間按的單獨部分

DATE_ADD()

給日期添加指定的時間間隔

DATE_SUB()

從日期減去指定的時間間隔

DATEDIFF()

返回兩個日期之間的天數

DATE_FORMAT()

用不同的格式顯示日期/時間
例子
SELECT * FROM Orders WHERE OrderDate=‘2008-12-26’

SQL null值:NULL是遺漏的未知數據,使用is null 和 is not null來查詢,null !=0無法使用算術運算符來進行查詢

例子
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL

SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL

IFNULL:如果爲空,返回*值

例子,如果爲空,返回0
SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products

數據類型:MySQL的
Text 類型:

數據類型 描述
CHAR(size) 保存固定長度的字符串(可包含字母、數字以及特殊字符)。在括號中指定字符串的長度。最多 255 個字符。
VARCHAR(size) 保存可變長度的字符串(可包含字母、數字以及特殊字符)。在括號中指定字符串的最大長度。最多 255 個字符。
註釋:如果值的長度大於 255,則被轉換爲 TEXT 類型。
TINYTEXT 存放最大長度爲 255 個字符的字符串。
TEXT 存放最大長度爲 65,535 個字符的字符串。
BLOB 用於 BLOBs (Binary Large OBjects)。存放最多 65,535 字節的數據。
MEDIUMTEXT 存放最大長度爲 16,777,215 個字符的字符串。
MEDIUMBLOB 用於 BLOBs (Binary Large OBjects)。存放最多 16,777,215 字節的數據。
LONGTEXT 存放最大長度爲 4,294,967,295 個字符的字符串。
LONGBLOB 用於 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字節的數據。
ENUM(x,y,z,etc.) 允許你輸入可能值的列表。可以在 ENUM 列表中列出最大 65535 個值。如果列表中不存在插入的值,則插入空值。
註釋:這些值是按照你輸入的順序存儲的。
可以按照此格式輸入可能的值:ENUM(‘X’,‘Y’,‘Z’)
SET 與 ENUM 類似,SET 最多隻能包含 64 個列表項,不過 SET 可存儲一個以上的值。

Number 類型:

數據類型 描述
TINYINT(size) -128 到 127 常規。0 到 255 無符號*。在括號中規定最大位數。
SMALLINT(size) -32768 到 32767 常規。0 到 65535 無符號*。在括號中規定最大位數。
MEDIUMINT(size) -8388608 到 8388607 普通。0 to 16777215 無符號*。在括號中規定最大位數。
INT(size) -2147483648 到 2147483647 常規。0 到 4294967295 無符號*。在括號中規定最大位數。
BIGINT(size) -9223372036854775808 到 9223372036854775807 常規。0 到 18446744073709551615 無符號*。在括號中規定最大位數。
FLOAT(size,d) 帶有浮動小數點的小數字。在括號中規定最大位數。在 d 參數中規定小數點右側的最大位數。
DOUBLE(size,d) 帶有浮動小數點的大數字。在括號中規定最大位數。在 d 參數中規定小數點右側的最大位數。
DECIMAL(size,d) 作爲字符串存儲的 DOUBLE 類型,允許固定的小數點。

這些整數類型擁有額外的選項 UNSIGNED。通常,整數可以是負數或正數。如果添加 UNSIGNED 屬性,那麼範圍將從 0 開始,而不是某個負數。

Date 類型:

數據類型 描述
DATE() 日期。格式:YYYY-MM-DD
註釋:支持的範圍是從 ‘1000-01-01’ 到 ‘9999-12-31’
DATETIME() *日期和時間的組合。格式:YYYY-MM-DD HH:MM:SS
註釋:支持的範圍是從 ‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’
TIMESTAMP() *時間戳。TIMESTAMP 值使用 Unix 紀元(‘1970-01-01 00:00:00’ UTC) 至今的描述來存儲。格式:YYYY-MM-DD HH:MM:SS
註釋:支持的範圍是從 ‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-09 03:14:07’ UTC
TIME() 時間。格式:HH:MM:SS 註釋:支持的範圍是從 ‘-838:59:59’ 到 ‘838:59:59’
YEAR() 2 位或 4 位格式的年。
註釋:4 位格式所允許的值:1901 到 2155。2 位格式所允許的值:70 到 69,表示從 1970 到 2069。

即便 DATETIME 和 TIMESTAMP 返回相同的格式,它們的工作方式很不同。在 INSERT 或 UPDATE 查詢中,TIMESTAMP 自動把自身設置爲當前的日期和時間。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD。

SQL函數:用於計數和計算的內建函數
AVG():平均值,計算時不高考NULL

例子
SELECT Customer FROM Orders
WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)

COUNT():函數返回匹配指定條件的行數

例子
SELECT COUNT(Customer) AS CustomerNilsen FROM Orders
WHERE Customer=‘Carter’
CustomerNilsen
2

First():函數返回指定的字段中第一個記錄的值

例子
SELECT FIRST(OrderPrice) AS FirstOrderPrice FROM Orders
FirstOrderPrice
1000
Last():函數返回指定的字段中最後一個記錄的值
例子
SELECT LAST(OrderPrice) AS LastOrderPrice FROM Orders
LastOrderPrice
100

Max():函數返回一列中的最大值,Null不包含在計算中

例子
SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders
LargestOrderPrice
2000

Min():同上,最小值
Sum():函數返回數值列的總數(總額)

例子
SELECT SUM(OrderPrice) AS OrderTotal FROM Orders
OrderTotal
5700

Group by:結合合計函數,根據一個或多個列對結果集進行分組

例子
對單個字段,用戶名進行分組,得出的價格會進行根據查詢的sum自動分組sum運算
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
Customer SUM(OrderPrice)
Bush 2000
Carter 1700
Adams 2000
對多個字段進行分組
SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders
GROUP BY Customer,OrderDate

Having():增加Having字句——where無法和合計函數一起使用

例子
使用where進行條件限制+having使用合計函數計算
SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer=‘Bush’ OR Customer=‘Adams’
GROUP BY Customer
HAVING SUM(OrderPrice)>1500
Customer SUM(OrderPrice)
Bush 2000
Adams 2000

Ucase():函數把字段的值轉換爲大寫

例子
SELECT UCASE(LastName) as LastName,FirstName FROM Persons
LastName FirstName
ADAMS John
BUSH George
CARTER Thomas

Lcase():同上,轉換爲小寫

例子
SELECT LCASE(LastName) as LastName,FirstName FROM Persons

Mid(): 函數用於從文本字段中提取字符。

SELECT MID(column_name,start[,length]) FROM table_name
參數 描述
column_name 必需。要提取字符的字段。
start 必需。規定開始位置(起始值是 1)。
length 可選。要返回的字符數。如果省略,則 MID() 函數返回剩餘文本。
例子
SELECT MID(City,1,3) as SmallCity FROM Persons
SmallCity
Lon
New
Bei

Len():返回文本字段中值的長度

例子
SELECT LEN(City) as LengthOfCity FROM Persons
LengthOfCity
6
8
7

Round():函數用於把數值字段四捨五入指定的小樹位數

例子
SELECT ROUND(column_name,decimals) FROM table_name

參數 描述
column_name 必需。要舍入的字段。
decimals 必需。規定要返回的小數位數。
SELECT ProductName, ROUND(UnitPrice,0) as UnitPrice FROM Products
ProductName UnitPrice
gold 32
silver 12
copper 7

Now():函數返回當前的日期和時間

SELECT ProductName, UnitPrice, Now() as PerDate FROM Products
ProductName UnitPrice PerDate
gold 32.35 12/29/2008 11:36:05 AM
silver 11.56 12/29/2008 11:36:05 AM
copper 6.85 12/29/2008 11:36:05 AM

Format():用於對字段的顯示進行格式化

例子
SELECT FORMAT(column_name,format) FROM table_name
參數 描述
column_name 必需。要格式化的字段。
format 必需。規定格式。
例子
SELECT ProductName, UnitPrice, FORMAT(Now(),‘YYYY-MM-DD’) as PerDate
FROM Products
ProductName UnitPrice PerDate
gold 32.35 12/29/2008
silver 11.56 12/29/2008
copper 6.85 12/29/2008

IF(expr1,expr2,expr3)

如果expr1是true,則IF的返回值爲expr2,否則返回expr3

Case…when…then

第一種 格式 : 簡單Case函數 :
格式說明
    case 列名
    when 條件值1 then 選擇項1
    when 條件值2 then 選項2…
    else 默認值 end
eg:
    select
    case   job_level
    when ‘1’ then ‘1111’
    when  ‘2’ then ‘1111’
    when  ‘3’ then ‘1111’
    else ‘eee’ end
    from dbo.employee


第二種 格式 :Case搜索函數
格式說明
    case
    when 列名= 條件值1 then 選擇項1
    when 列名=條件值2 then 選項2…
    else 默認值 end
eg:
    update employee
    set e_wage =
    case
    when job_level = ‘1’ then e_wage1.97
    when job_level = ‘2’ then e_wage
1.07
    when job_level = ‘3’ then e_wage1.06
    else e_wage
1.05
    end

最好刷刷題鞏固一下 https://leetcode.com/

MySQL大部分 http://www.w3school.com.cn/sql/index.asp
MySQL函數 https://www.runoob.com/mysql/mysql-functions.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章