主頁 > 軟體設計 > ?? 2萬字 SQL 零基礎入門教程【圖文并茂】(建議收藏)

?? 2萬字 SQL 零基礎入門教程【圖文并茂】(建議收藏)

2021-10-14 20:33:33 軟體設計

目錄

  • 📚 前言
  • 🌴 SQL 介紹
    • 🌼 什么是 SQL
    • 🌀 SQL 的型別
    • 🌵 學習 SQL 的作用
    • 🍄 資料庫是什么
  • 🐥 SQL 基礎語言學習
    • 🐤 CREATE TABLE – 創建表
    • 🐑 INSERT – 插入資料
    • 🐼 SELECT – 查詢資料
    • 🐫 DISTINCT – 去除重復值
    • 🐸 WHERE – 條件過濾
    • 🐹 AND & OR – 運算子
    • 🐰 ORDER BY – 排序
    • 🐱 UPDATE – 更新資料
    • 🐨 DELETE – 洗掉資料
    • 🐵 TRUNCATE TABLE – 清除表資料
    • 🐯 DROP TABLE – 洗掉表
  • 🚀 SQL 高級言語學習
    • 🚢 LIKE – 查找類似值
    • 🚤 IN – 鎖定多個值
    • ?? BETWEEN – 選取區間資料
    • 🚂 AS – 別名
    • 🚁 JOIN – 多表關聯
    • 🚜 UNION – 合并結果集
    • 🚌 NOT NULL – 非空
    • 🚐 VIEW – 視圖
  • 🎯 SQL 常用函式學習
    • 🍔 AVG – 平均值
    • 🍕 COUNT – 匯總行數
    • 🍘 MAX – 最大值
    • 🍢 MIN – 最小值
    • 🍰 SUM – 求和
    • 🍪 GROUP BY – 分組
    • 🍭 HAVING – 句尾連接
    • 🍷 UCASE/UPPER – 大寫
    • 🍶 LCASE/LOWER – 小寫
    • 👛 LEN/LENGTH – 獲取長度
    • 🍗 ROUND – 數值取舍
    • 🍞 NOW/SYSDATE – 當前時間
  • 🍺 寫在最后
  • ?? 情景學習
  • ?? 趣味 SQL
  • ?? 粉絲專屬福利

📚 前言

SQL 是日常作業學習中最常用的語言,可以說很有必要掌握它!
這不,我就來給大家分享一波 😄!

點我跳轉文末 可以獲取 粉絲福利 以及博主的聯系方式

SQL語言有40多年的歷史,從它被應用至今幾乎無處不在,我們消費的每一筆支付記錄,收集的每一條用戶資訊,發出去的每一條訊息,都會使用資料庫或與其相關的產品來存盤,而操縱資料庫的語言正是 SQL !

SQL 對于現在的互聯網公司生產研發等崗位幾乎是一個必備技能,如果不會 SQL 的話,可能什么都做不了,你可以把 SQL 當做是一種工具,利用它可以幫助你完成你的作業,創造價值,


文章結尾有 SQL 小測驗哦!看看你能得幾分?

?? 點我跳轉到 SQL 測驗!

🌴 SQL 介紹

🌼 什么是 SQL

SQL 是用于訪問和處理資料庫的標準的計算機語言,

  • SQL 指結構化查詢語言
  • SQL 使我們有能力訪問資料庫
  • SQL 是一種 ANSI 的標準計算機語言


SQL 可與資料庫程式協同作業,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他資料庫系統,但是由于各種各樣的資料庫出現,導致很多不同版本的 SQL 語言,為了與 ANSI 標準相兼容,它們必須以相似的方式共同地來支持一些主要的關鍵詞(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等),這些就是我們要學習的SQL基礎,

🌀 SQL 的型別

可以把 SQL 分為兩個部分:資料操作語言 (DML) 和 資料定義語言 (DDL),

  • 資料查詢語言(DQL: Data Query Language)
  • 資料操縱語言(DML:Data Manipulation Language)

🌵 學習 SQL 的作用

SQL 是一門 ANSI 的標準計算機語言,用來訪問和操作資料庫系統,SQL 陳述句用于取回和更新資料庫中的資料,

  • SQL 面向資料庫執行查詢
  • SQL 可從資料庫取回資料
  • SQL 可在資料庫中插入新的記錄
  • SQL 可更新資料庫中的資料
  • SQL 可從資料庫洗掉記錄
  • SQL 可創建新資料庫
  • SQL 可在資料庫中創建新表
  • SQL 可在資料庫中創建存盤程序
  • SQL 可在資料庫中創建視圖
  • SQL 可以設定表、存盤程序和視圖的權限

🍄 資料庫是什么

顧名思義,你可以理解為資料庫是用來存放資料的一個容器,

打個比方,每個人家里都會有冰箱,冰箱是用來干什么的?冰箱是用來存放食物的地方,

同樣的,資料庫是存放資料的地方,正是因為有了資料庫后,我們可以直接查找資料,例如你每天使用余額寶查看自己的賬戶收益,就是從資料庫讀取資料后給你的,

最常見的資料庫型別是關系型資料庫管理系統(RDBMS):

RDBMS 是 SQL 的基礎,同樣也是所有現代資料庫系統的基礎,比如 MS SQL Server, IBM DB2, Oracle, MySQL 以及 Microsoft Access等等,

RDBMS 中的資料存盤在被稱為表(tables)的資料庫物件中, 是相關的資料項的集合,它由列和行組成,

由于本文主要講解 SQL 基礎,因此對資料庫不做過多解釋,只需要大概了解即可,咱們直接開始學習SQL!

🐥 SQL 基礎語言學習

在了解 SQL 基礎陳述句使用之前,我們先講一下 是什么?

一個資料庫通常包含一個或多個表,每個表由一個名字標識(例如“客戶”或者“訂單”),表包含帶有資料的記錄(行),

下面的例子是一個名為 “Persons” 的表:

IdLastNameFirstNameAddressCity
1AdamsJohnOxford StreetLondon
2BushGeorgeFifth AvenueNew York
3CarterThomasChangan StreetBeijing

上面的表包含三條記錄(每一條對應一個人)和五個列(Id、姓、名、地址和城市),

有表才能查詢,那么如何創建這樣一個表?

🐤 CREATE TABLE – 創建表

CREATE TABLE 陳述句用于創建資料庫中的表,

語法:

CREATE TABLE 表名稱
(
列名稱1 資料型別,
列名稱2 資料型別,
列名稱3 資料型別,
....
);

資料型別(data_type)規定了列可容納何種資料型別,下面的表格包含了SQL中最常用的資料型別:

資料型別描述
integer(size),int(size),smallint(size),tinyint(size)僅容納整數、在括號內規定數字的最大位數
decimal(size,d),numeric(size,d)容納帶有小數的數字、“size” 規定數字的最大位數、“d” 規定小數點右側的最大位數
char(size)容納固定長度的字串(可容納字母、數字以及特殊字符)、在括號中規定字串的長度
varchar(size)容納可變長度的字串(可容納字母、數字以及特殊的字符)、在括號中規定字串的最大長度
date(yyyymmdd)容納日期

實體:

本例演示如何創建名為 “Persons” 的表,

該表包含 5 個列,列名分別是:“Id_P”、“LastName”、“FirstName”、“Address” 以及 “City”:

CREATE TABLE Persons
(
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);

Id_P 列的資料型別是 int,包含整數,其余 4 列的資料型別是 varchar,最大長度為 255 個字符,


空的 “Persons” 表類似這樣:

可使用 INSERT INTO 陳述句向空表寫入資料,

🐑 INSERT – 插入資料

INSERT INTO 陳述句用于向表格中插入新的行,

語法:

INSERT INTO 表名稱 VALUES (1,2,....);

我們也可以指定所要插入資料的列:

INSERT INTO table_name (1,2,...) VALUES (1,2,....);

實體:

本例演示 “Persons” 表插入記錄的兩種方式:

1、插入新的行

INSERT INTO Persons VALUES (1, 'Gates', 'Bill', 'Xuanwumen 10', 'Beijing');

2、在指定的列中插入資料

INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees');


插入成功后,資料如下:

這個資料插入之后,是通過 SELECT 陳述句進行查詢出來的,別急馬上講!

🐼 SELECT – 查詢資料

SELECT 陳述句用于從表中選取資料,結果被存盤在一個結果表中(稱為結果集),

語法:

SELECT * FROM 表名稱;

我們也可以指定所要查詢資料的列:

SELECT 列名稱 FROM 表名稱;

📢 注意: SQL 陳述句對大小寫不敏感,SELECT 等效于 select,

實體:

SQL SELECT * 實體:

SELECT * FROM Persons;


📢 注意: 星號(*)是選取所有列的快捷方式,

如需獲取名為 “LastName” 和 “FirstName” 的列的內容(從名為 “Persons” 的資料庫表),請使用類似這樣的 SELECT 陳述句:

SELECT LastName,FirstName FROM Persons;

🐫 DISTINCT – 去除重復值

如果一張表中有多行重復資料,如何去重顯示呢?可以了解下 DISTINCT

語法:

SELECT DISTINCT 列名稱 FROM 表名稱;

實體:

如果要從 “LASTNAME” 列中選取所有的值,我們需要使用 SELECT 陳述句:

SELECT LASTNAME FROM Persons;


可以發現,在結果集中,Wilson 被列出了多次,

如需從 “LASTNAME” 列中僅選取唯一不同的值,我們需要使用 SELECT DISTINCT 陳述句:

SELECT DISTINCT LASTNAME FROM Persons;


通過上述查詢,結果集中只顯示了一列 Wilson,顯然已經去除了重復列,

🐸 WHERE – 條件過濾

如果需要從表中選取指定的資料,可將 WHERE 子句添加到 SELECT 陳述句,

語法:

SELECT 列名稱 FROM 表名稱 WHERE 列 運算子 值;

下面的運算子可在 WHERE 子句中使用:

運算子描述
=等于
<>不等于
>大于
<小于
>=大于等于
<=小于等于
BETWEEN在某個范圍內
LIKE搜索某種模式

📢 注意: 在某些版本的 SQL 中,運算子 <> 可以寫為 !=,

實體:

如果只希望選取居住在城市 “Beijing” 中的人,我們需要向 SELECT 陳述句添加 WHERE 子句:

SELECT * FROM Persons WHERE City='Beijing';


📢 注意: SQL 使用單引號來環繞文本值(大部分資料庫系統也接受雙引號),如果是數值,請不要使用引號,

🐹 AND & OR – 運算子

AND 和 OR 可在 WHERE 子陳述句中把兩個或多個條件結合起來,

  • 如果第一個條件和第二個條件都成立,則 AND 運算子顯示一條記錄,
  • 如果第一個條件和第二個條件中只要有一個成立,則 OR 運算子顯示一條記錄,

語法:

AND 運算子實體:

SELECT * FROM 表名稱 WHERE 列 運算子 值 AND 列 運算子 值;

OR 運算子實體:

SELECT * FROM 表名稱 WHERE 列 運算子 值 OR 列 運算子 值;

實體:

由于 Persons 表資料太少,因此增加幾條記錄:

INSERT INTO Persons VALUES (2, 'Adams', 'John', 'Oxford Street', 'London');
INSERT INTO Persons VALUES (3, 'Bush', 'George', 'Fifth Avenue', 'New York');
INSERT INTO Persons VALUES (4, 'Carter', 'Thomas', 'Changan Street', 'Beijing');
INSERT INTO Persons VALUES (5, 'Carter', 'William', 'Xuanwumen 10', 'Beijing');
SELECT * FROM Persons;


AND 運算子實體:

使用 AND 來顯示所有姓為 “Carter” 并且名為 “Thomas” 的人:

SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter';


OR 運算子實體:

使用 OR 來顯示所有姓為 “Carter” 或者名為 “Thomas” 的人:

SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter';


結合 AND 和 OR 運算子:

我們也可以把 AND 和 OR 結合起來(使用圓括號來組成復雜的運算式):

SELECT * FROM Persons WHERE (FirstName='Thomas' OR FirstName='William') AND LastName='Carter';

🐰 ORDER BY – 排序

ORDER BY 陳述句用于根據指定的列對結果集進行排序,默認按照升序對記錄進行排序,如果您希望按照降序對記錄進行排序,可以使用 DESC 關鍵字,

語法:

SELECT * FROM 表名稱 ORDER BY1,2 DESC;

默認排序為 ASC 升序,DESC 代表降序,

實體:

以字母順序顯示 LASTNAME 名稱:

SELECT * FROM Persons ORDER BY LASTNAME;


空值(NULL)默認排序在有值行之后,

以數字順序顯示ID_P,并以字母順序顯示 LASTNAME 名稱:

SELECT * FROM Persons ORDER BY ID_P,LASTNAME;


以數字降序顯示ID_P

SELECT * FROM Persons ORDER BY ID_P DESC;


📢 注意: 在第一列中有相同的值時,第二列是以升序排列的,如果第一列中有些值為 null 時,情況也是這樣的,

🐱 UPDATE – 更新資料

Update 陳述句用于修改表中的資料,

語法:

UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值;

實體:

更新某一行中的一個列:

目前 Persons 表有很多欄位為 null 的資料,可以通過 UPDATE 為 LASTNAME 是 “Wilson” 的人添加FIRSTNAME:

UPDATE Persons SET FirstName = 'Fred' WHERE LastName = 'Wilson';


更新某一行中的若干列:

UPDATE Persons SET ID_P = 6,city= 'London' WHERE LastName = 'Wilson';

🐨 DELETE – 洗掉資料

DELETE 陳述句用于洗掉表中的行,

語法:

DELETE FROM 表名稱 WHERE 列名稱 =;

實體:

洗掉某行:

洗掉 Persons 表中 LastName 為 “Fred Wilson” 的行:

DELETE FROM Persons WHERE LastName = 'Wilson';


洗掉所有行:

可以在不洗掉表的情況下洗掉所有的行,這意味著表的結構、屬性和索引都是完整的:

DELETE FROM table_name;

🐵 TRUNCATE TABLE – 清除表資料

如果我們僅僅需要除去表內的資料,但并不洗掉表本身,那么我們該如何做呢?

可以使用 TRUNCATE TABLE 命令(僅僅洗掉表格中的資料):

語法:

TRUNCATE TABLE 表名稱;

實體:

本例演示如何洗掉名為 “Persons” 的表,

TRUNCATE TABLE persons;

🐯 DROP TABLE – 洗掉表

DROP TABLE 陳述句用于洗掉表(表的結構、屬性以及索引也會被洗掉),

語法:

DROP TABLE 表名稱;

實體:

本例演示如何洗掉名為 “Persons” 的表,

drop table persons;


從上圖可以看出,第一次執行洗掉時,成功洗掉了表 persons,第二次執行洗掉時,報錯找不到表 persons,說明表已經被洗掉了,

🚀 SQL 高級言語學習

🚢 LIKE – 查找類似值

LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式,

語法:

SELECT 列名/(*) FROM 表名稱 WHERE 列名稱 LIKE;

實體:

Persons 表插入資料:

INSERT INTO Persons VALUES (1, 'Gates', 'Bill', 'Xuanwumen 10', 'Beijing');
INSERT INTO Persons VALUES (2, 'Adams', 'John', 'Oxford Street', 'London');
INSERT INTO Persons VALUES (3, 'Bush', 'George', 'Fifth Avenue', 'New York');
INSERT INTO Persons VALUES (4, 'Carter', 'Thomas', 'Changan Street', 'Beijing');
INSERT INTO Persons VALUES (5, 'Carter', 'William', 'Xuanwumen 10', 'Beijing');
select * from persons;


1、現在,我們希望從上面的 “Persons” 表中選取居住在以 “N” 開頭的城市里的人:

SELECT * FROM Persons WHERE City LIKE 'N%';


2、接下來,我們希望從 “Persons” 表中選取居住在以 “g” 結尾的城市里的人:

SELECT * FROM Persons WHERE City LIKE '%g';


3、接下來,我們希望從 “Persons” 表中選取居住在包含 “lon” 的城市里的人:

SELECT * FROM Persons WHERE City LIKE '%on%';


4、通過使用 NOT 關鍵字,我們可以從 “Persons” 表中選取居住在不包含 “lon” 的城市里的人:

SELECT * FROM Persons WHERE City NOT LIKE '%on%';


📢注意: “%” 可用于定義通配符(模式中缺少的字母),

🚤 IN – 鎖定多個值

IN 運算子允許我們在 WHERE 子句中規定多個值,

語法:

SELECT 列名/(*) FROM 表名稱 WHERE 列名稱 IN (1,2,3);

實體:

現在,我們希望從 Persons 表中選取姓氏為 Adams 和 Carter 的人:

SELECT * FROM Persons WHERE LastName IN ('Adams','Carter');

?? BETWEEN – 選取區間資料

運算子 BETWEEN … AND 會選取介于兩個值之間的資料范圍,這些值可以是數值、文本或者日期,

語法:

SELECT 列名/(*) FROM 表名稱 WHERE 列名稱 BETWEEN1 AND2;

實體:

1、查詢以字母順序顯示介于 “Adams”(包括)和 “Carter”(不包括)之間的人:

SELECT * FROM Persons WHERE LastName BETWEEN 'Adams' AND 'Carter';


2、查詢上述結果相反的結果,可以使用 NOT:

SELECT * FROM Persons WHERE LastName NOT BETWEEN 'Adams' AND 'Carter';


📢 注意: 不同的資料庫對 BETWEEN…AND 運算子的處理方式是有差異的,

某些資料庫會列出介于 “Adams” 和 “Carter” 之間的人,但不包括 “Adams” 和 “Carter” ;某些資料庫會列出介于 “Adams” 和 “Carter” 之間并包括 “Adams” 和 “Carter” 的人;而另一些資料庫會列出介于 “Adams” 和 “Carter” 之間的人,包括 “Adams” ,但不包括 “Carter” ,

所以,請檢查你的資料庫是如何處理 BETWEEN…AND 運算子的!

🚂 AS – 別名

通過使用 SQL,可以為列名稱和表名稱指定別名(Alias),別名使查詢程式更易閱讀和書寫,

語法:

表別名:

SELECT 列名稱/(*) FROM 表名稱 AS 別名;

列別名:

SELECT 列名稱 as 別名 FROM 表名稱;

實體:

使用表名稱別名:

SELECT p.LastName, p.FirstName
FROM Persons p 
WHERE p.LastName='Adams' AND p.FirstName='John';


使用列名別名:

SELECT LastName "Family", FirstName "Name" FROM Persons;


📢 注意: 實際應用時,這個 AS 可以省略,但是列別名需要加上 " "

🚁 JOIN – 多表關聯

JOIN 用于根據兩個或多個表中的列之間的關系,從這些表中查詢資料,

有時為了得到完整的結果,我們需要從兩個或更多的表中獲取結果,我們就需要執行 join

資料庫中的表可通過鍵將彼此聯系起來,主鍵(Primary Key)是一個列,在這個列中的每一行的值都是唯一的,在表中,每個主鍵的值都是唯一的,這樣做的目的是在不重復每個表中的所有資料的情況下,把表間的資料交叉捆綁在一起,

如圖,“Id_P” 列是 Persons 表中的的主鍵,這意味著沒有兩行能夠擁有相同的 Id_P,即使兩個人的姓名完全相同,Id_P 也可以區分他們,

?? 為了下面實驗的繼續,我們需要再創建一個表:Orders,

create table orders (id_o number,orderno number,id_p number);
insert into orders values(1,11111,1);
insert into orders values(2,22222,2);
insert into orders values(3,33333,3);
insert into orders values(4,44444,4);
insert into orders values(6,66666,6);
select * from orders;


如圖,“Id_O” 列是 Orders 表中的的主鍵,同時,“Orders” 表中的 “Id_P” 列用于參考 “Persons” 表中的人,而無需使用他們的確切姓名,

select * from persons p,orders o where p.id_p=o.id_p;


可以看到,“Id_P” 列把上面的兩個表聯系了起來,

語法:

select 列名
from 表A
INNER|LEFT|RIGHT|FULL JOIN 表B
ON 表A主鍵列 = 表B外鍵列;

不同的 SQL JOIN:

下面列出了您可以使用的 JOIN 型別,以及它們之間的差異,

  • JOIN: 如果表中有至少一個匹配,則回傳行
  • INNER JOIN: 內部連接,回傳兩表中匹配的行
  • LEFT JOIN: 即使右表中沒有匹配,也從左表回傳所有的行
  • RIGHT JOIN: 即使左表中沒有匹配,也從右表回傳所有的行
  • FULL JOIN: 只要其中一個表中存在匹配,就回傳行

實體:

如果我們希望列出所有人的定購,可以使用下面的 SELECT 陳述句:

SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p
INNER JOIN Orders o
ON p.Id_P = o.Id_P
ORDER BY p.LastName DESC;

🚜 UNION – 合并結果集

UNION 運算子用于合并兩個或多個 SELECT 陳述句的結果集,

UNION 語法:

SELECT 列名 FROM 表A
UNION
SELECT 列名 FROM 表B;

📢注意: UNION 運算子默認為選取不同的值,如果查詢結果需要顯示重復的值,請使用 UNION ALL

UNION ALL 語法:

SELECT 列名 FROM 表A
UNION ALL
SELECT 列名 FROM 表B;

另外,UNION 結果集中的列名總是等于 UNION 中第一個 SELECT 陳述句中的列名,

為了實驗所需,創建 Person_b 表:

CREATE TABLE Persons_b
(
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
INSERT INTO Persons_b VALUES (1, 'Bill', 'Gates', 'Xuanwumen 10', 'Londo');
INSERT INTO Persons_b VALUES (2, 'John', 'Adams', 'Oxford Street', 'nBeijing');
INSERT INTO Persons_b VALUES (3, 'George', 'Bush', 'Fifth Avenue', 'Beijing');
INSERT INTO Persons_b VALUES (4, 'Thomas', 'Carter', 'Changan Street', 'New York');
INSERT INTO Persons_b VALUES (5, 'William', 'Carter', 'Xuanwumen 10', 'Beijing');
select * from persons_b;


實體:

使用 UNION 命令:

列出 persons 和 persons_b 中不同的人:

select * from persons
UNION
select * from persons_b;


📢注意: UNION 內部的 SELECT 陳述句必須擁有相同數量的列,列也必須擁有相似的資料型別,同時,每條 SELECT 陳述句中的列的順序必須相同,

🚌 NOT NULL – 非空

NOT NULL 約束強制列不接受 NULL 值,

NOT NULL 約束強制欄位始終包含值,這意味著,如果不向欄位添加值,就無法插入新記錄或者更新記錄,

語法:

CREATE TABLE(int NOT NULL
);

如上,創建一個表,設定列值不能為空,

實體:

create table lucifer (id number not null);
insert into lucifer values (NULL);


📢 注意: 如果插入 NULL 值,則會報錯 ORA-01400 提示無法插入!

?? 拓展小知識:NOT NULL 也可以用于查詢條件:

select * from persons where FirstName is not null;


同理,NULL 也可:

select * from persons where FirstName is null;

感興趣的朋友,可以自己嘗試一下!

🚐 VIEW – 視圖

在 SQL 中,視圖是基于 SQL 陳述句的結果集的可視化的表,

視圖包含行和列,就像一個真實的表,視圖中的欄位就是來自一個或多個資料庫中的真實的表中的欄位,我們可以向視圖添加 SQL 函式、WHERE 以及 JOIN 陳述句,我們也可以提交資料,就像這些來自于某個單一的表,

語法:

CREATE VIEW 視圖名 AS
SELECT 列名
FROM 表名
WHERE 查詢條件;

📢 注意: 視圖總是顯示最近的資料,每當用戶查詢視圖時,資料庫引擎通過使用 SQL 陳述句來重建資料,

實體:

下面,我們將 Persons 表中住在 Beijing 的人篩選出來創建視圖:

create view persons_beijing as
select * from persons where city='Beijing';


查詢上面這個視圖:

如果需要更新視圖中的列或者其他資訊,無需洗掉,使用 CREATE OR REPLACE VIEW 選項:

CREATE OR REPLACE VIEW 視圖名 AS
SELECT 列名
FROM 表名
WHERE 查詢條件;

實體:

現在需要篩選出,LASTNAME 為 Gates 的記錄:

create or replace view persons_beijing as
select * from persons where lastname='Gates';



洗掉視圖就比較簡單,跟表差不多,使用 DROP 即可:

drop view persons_beijing;


?? 本章要講的高級語言就先到此為止,不宜一次性介紹太多~

🎯 SQL 常用函式學習

SQL 擁有很多可用于計數和計算的內建函式,

函式的使用語法:

SELECT function() FROM;

?? 下面就來看看有哪些常用的函式!

🍔 AVG – 平均值

AVG 函式回傳數值列的平均值,NULL 值不包括在計算中,

語法:

SELECT AVG(列名) FROM 表名;

實體:

計算 “orderno” 欄位的平均值,

select avg(orderno) from orders;


當然,也可以用在查詢條件中,例如查詢低于平均值的記錄:

select * from orders where orderno < (select avg(orderno) from orders);

🍕 COUNT – 匯總行數

COUNT() 函式回傳匹配指定條件的行數,

語法:

count() 中可以有不同的語法:

  • COUNT(*) :回傳表中的記錄數,
  • COUNT(DISTINCT 列名) :回傳指定列的不同值的數目,
  • COUNT(列名) :回傳指定列的值的數目(NULL 不計入),
SELECT COUNT(*) FROM 表名;
SELECT COUNT(DISTINCT 列名) FROM 表名;
SELECT COUNT(列名) FROM 表名;

實體:

COUNT(*) :

select count(*) from persons;


COUNT(DISTINCT 列名) :

select count(distinct city) from persons;


COUNT(列名) :

select count(city) from persons;

🍘 MAX – 最大值

MAX 函式回傳一列中的最大值,NULL 值不包括在計算中,

語法:

SELECT MAX(列名) FROM 表名;

MIN 和 MAX 也可用于文本列,以獲得按字母順序排列的最高或最低值,

實體:

select max(orderno) from orders;

🍢 MIN – 最小值

MIN 函式回傳一列中的最小值,NULL 值不包括在計算中,

語法:

SELECT MIN(列名) FROM 表名;

實體:

select min(orderno) from orders;

🍰 SUM – 求和

SUM 函式回傳數值列的總數(總額),

語法:

SELECT SUM(列名) FROM 表名;

實體:

select sum(orderno) from orders;

🍪 GROUP BY – 分組

GROUP BY 陳述句用于結合合計函式,根據一個或多個列對結果集進行分組,

語法:

SELECT 列名A, 統計函式(列名B)
FROM 表名
WHERE 查詢條件
GROUP BY 列名A;

實體:

獲取 Persons 表中住在北京的總人數,根據 LASTNAME 分組:

select lastname,count(city) from persons 
where city='Beijing' 
group by lastname;


如果不加 GROUP BY 則會報錯:

也就是常見的 ORA-00937 不是單組分組函式的錯誤,

🍭 HAVING – 句尾連接

在 SQL 中增加 HAVING 子句原因是,WHERE 關鍵字無法與合計函式一起使用,

語法:

SELECT 列名A, 統計函式(列名B)
FROM table_name
WHERE 查詢條件
GROUP BY 列名A
HAVING 統計函式(列名B) 查詢條件;

實體:

獲取 Persons 表中住在北京的總人數大于1的 LASTNAME,根據 LASTNAME 分組:

select lastname,count(city) from persons 
where city='Beijing' 
group by lastname
having count(city) > 1;

🍷 UCASE/UPPER – 大寫

UCASE/UPPER 函式把欄位的值轉換為大寫,

語法:

select upper(列名) from 表名;

實體:

選取 “LastName” 和 “FirstName” 列的內容,然后把 “LastName” 列轉換為大寫:

select upper(lastname),firstname from persons;

🍶 LCASE/LOWER – 小寫

LCASE/LOWER 函式把欄位的值轉換為小寫,

語法:

select lower(列名) from 表名;

實體:

選取 “LastName” 和 “FirstName” 列的內容,然后把 “LastName” 列轉換為小寫:

select lower(lastname),firstname from persons;

👛 LEN/LENGTH – 獲取長度

LEN/LENGTH 函式回傳文本欄位中值的長度,

語法:

select length(列名) from 表名;

實體:

獲取 LASTNAME 的值字符長度:

select length(lastname),lastname from persons;

🍗 ROUND – 數值取舍

ROUND 函式用于把數值欄位舍入為指定的小數位數,

語法:

select round(列名,精度) from 表名;

實體:

保留2位:

select round(1.1314,2) from dual;
select round(1.1351,2) from dual;



📢 注意:ROUND 取舍是 四舍五入 的!

取整:

select round(1.1351,0) from dual;
select round(1.56,0) from dual;

🍞 NOW/SYSDATE – 當前時間

NOW/SYSDATE 函式回傳當前的日期和時間,

語法:

select sysdate from 表名;

實體:

獲取當前時間:

select sysdate from dual;


📢 注意: 如果您在使用 Sql Server 資料庫,請使用 getdate() 函式來獲得當前的日期時間,

🍺 寫在最后

上述如果都學完了的話,可以來做個小測驗:SQL 測驗,看看掌握的怎么樣!

?? 測驗會被記分:

每道題的分值是 1 分,在您完成全部的20道題之后,系統會為您的測驗打分,并提供您做錯的題目的正確答案,其中,綠色為正確答案,而紅色為錯誤答案,

? 現在就開始測驗! 祝您好運,

?? 將你的得分寫在下方的投票欄吧,讓我看看大家的水平如何???

學完基礎的SQL教程,我們來一個趣味性的教學!

?? 情景學習

下面讓我們看看小美是如何零基礎學習SQL的:

sysdate
使用這個SQL陳述句可以查看資料庫當前時間,當然也可以把 SYSDATE 換成任意東西,

例如:

計算器:SELECT 365 * 24 FROM dual;
計算器
這個SQL我們在開發中會經常用到,作為入門第一個SQL輕松有趣,小美,你覺得難嗎?


資料型別

CREATE TABLE bookshelf
(
BOOK_ID NUMBER,
BOOK_NAME VARCHAR2(100),
BOOK_TYPE VARCHAR2(100),
AUTHOR VARCHAR2(100),
INTIME DATE
);

表名為:bookshelf,有列:圖書id,圖書名稱,圖書型別,作者,入庫時間,通過上面學習的 SELECT語法,來查詢一下這張表:

SELECT * FROM bookshelf;


可以發現,新建的bookshelf表沒有任何記錄,現在,圖書館里已經增加一個空的書架,是不是需要將書放入書架上呢?這時就需要用到 操作了,

INSERT INTO bookshelf 
(book_id,
book_name,
book_type,
author,
intime)
VALUES
(1,
'飄',
'長篇小說',
'瑪格麗特·米切爾',
SYSDATE);
COMMIT;

的基本語法:

insert into 表名 (需要插入的列名,用逗號隔開) values (對應列名的值);


通過sql查詢發現,這本書《飄》已經放入了書架上,可供大家借用和查看,

的基本語法:

UPDATE 表名 SET 列名 = 新的值;

的基本語法:

DELETE FROM 表名;

現在來模擬一下場景:

1、修改作者名:

UPDATE bookshelf SET author='Margaret Mitchell';
COMMIT;

修改作者名
2、下架圖書:

DELETE FROM bookshelf;
COMMIT;

在這里插入圖片描述
通過以上兩個場景,演示了 兩種操作,



先上架3本書:

INSERT INTO bookshelf (book_id,book_name,book_type,author,intime) VALUES (1,'飄','長篇小說','瑪格麗特·米切爾',SYSDATE);
INSERT INTO bookshelf (book_id,book_name,book_type,author,intime) VALUES (2,'傾城之戀','愛情小說','張愛玲',SYSDATE);
INSERT INTO bookshelf (book_id,book_name,book_type,author,intime) VALUES (3,'從你的全世界路過','短篇小說','張嘉佳',SYSDATE);
COMMIT;


查看《傾城之戀》:

SELECT * FROM bookshelf WHERE BOOK_NAME = '傾城之戀';


更新《飄》:

UPDATE bookshelf SET author='Margaret Mitchell' WHERE book_name = '飄';
COMMIT;


洗掉《從你的全世界路過》:

DELETE FROM bookshelf WHERE book_name = '從你的全世界路過';
COMMIT;


通過上面的幾個栗子🌰,應該能很好的理解 WHERE 查詢條件的使用了,

?? 趣味 SQL

文末,贈送給各位看官幾個一句SQL畫圖的趣味小SQL:

?? 五角星:

WITH a AS
 (SELECT DISTINCT round(SUM(x) over(ORDER BY n)) x,
                  round(SUM(y) over(ORDER BY n)) y
    FROM (SELECT n,
                 cos(trunc(n / 20) * (1 - 1 / 5) * 3.1415926) * 2 x,
                 sin(trunc(n / 20) * (1 - 1 / 5) * 3.1415926) y
            FROM (SELECT rownum - 1 n
                    FROM all_objects
                   WHERE rownum <= 20 * 5)))
SELECT REPLACE(sys_connect_by_path(point,
                                   '/'),
               '/',
               NULL) star
  FROM (SELECT b.y,
               b.x,
               decode(a.x,
                      NULL,
                      ' ',
                      '*') point
          FROM a,
               (SELECT *
                  FROM (SELECT rownum - 1 + (SELECT MIN(x)
                                               FROM a) x
                          FROM all_objects
                         WHERE rownum <= (SELECT MAX(x) - MIN(x) + 1
                                            FROM a)),
                       (SELECT rownum - 1 + (SELECT MIN(y)
                                               FROM a) y
                          FROM all_objects
                         WHERE rownum <= (SELECT MAX(y) - MIN(y) + 1
                                            FROM a))) b
         WHERE a.x(+) = b.x
           AND a.y(+) = b.y)
 WHERE x = (SELECT MAX(x)
              FROM a)
 START WITH x = (SELECT MIN(x)
                   FROM a)
CONNECT BY y = PRIOR y
       AND x = PRIOR x + 1;

在這里插入圖片描述
📢 注意: 調整期中數字 5,你還可以輸出 7 角星,9 角星!

🇨🇳 奧運五環:

WITH a AS
 (SELECT DISTINCT round(a.x + b.x) x,
                  round(a.y + b.y) y
    FROM (SELECT (SUM(x) over(ORDER BY n)) x,
                 round(SUM(y) over(ORDER BY n)) y
            FROM (SELECT n,
                         cos(n / 30 * 3.1415926) * 2 x,
                         sin(n / 30 * 3.1415926) y
                    FROM (SELECT rownum - 1 n
                            FROM all_objects
                           WHERE rownum <= 30 + 30))) a,
         (SELECT n,
                 (SUM(x) over(ORDER BY n)) x,
                 round(SUM(y) over(ORDER BY n)) y
            FROM (SELECT n,
                         cos(m / 3 * 3.1415926) * 2 * 15 x,
                         sin(m / 3 * 3.1415926) * 15 y
                    FROM (SELECT CASE
                                   WHEN rownum <= 2 THEN
                                    3
                                   WHEN rownum = 3 THEN
                                    -2
                                   ELSE
                                    -6
                                 END m,
                                 rownum - 1 n
                            FROM all_objects
                           WHERE rownum <= 5))) b)
SELECT REPLACE(sys_connect_by_path(point,
                                   '/'),
               '/',
               NULL) star
  FROM (SELECT b.y,
               b.x,
               decode(a.x,
                      NULL,
                      ' ',
                      '*') point
          FROM a,
               (SELECT *
                  FROM (SELECT rownum - 1 + (SELECT MIN(x)
                                               FROM a) x
                          FROM all_objects
                         WHERE rownum <= (SELECT MAX(x) - MIN(x) + 1
                                            FROM a)),
                       (SELECT rownum - 1 + (SELECT MIN(y)
                                               FROM a) y
                          FROM all_objects
                         WHERE rownum <= (SELECT MAX(y) - MIN(y) + 1
                                            FROM a))) b
         WHERE a.x(+) = b.x
           AND a.y(+) = b.y)
 WHERE x = (SELECT MAX(x)
              FROM a)
 START WITH x = (SELECT MIN(x)
                   FROM a)
CONNECT BY y = PRIOR y
       AND x = PRIOR x + 1;


📅 列印當月日歷:

SELECT MAX(decode(dow,
                  1,
                  d,
                  NULL)) sun,
       
       MAX(decode(dow,
                  2,
                  d,
                  NULL)) mon,
       
       MAX(decode(dow,
                  3,
                  d,
                  NULL)) tue,
       
       MAX(decode(dow,
                  4,
                  d,
                  NULL)) wed,
       
       MAX(decode(dow,
                  5,
                  d,
                  NULL)) thu,
       
       MAX(decode(dow,
                  6,
                  d,
                  NULL)) fri,
       
       MAX(decode(dow,
                  7,
                  d,
                  NULL)) sat

  FROM (SELECT rownum d,
               
               rownum - 2 + to_number(to_char(trunc(SYSDATE,
                                                    'MM'),
                                              'D')) p,
               
               to_char(trunc(SYSDATE,
                             'MM') - 1 + rownum,
                       'D') dow
        
          FROM all_objects
        
         WHERE rownum <=
              
               to_number(to_char(last_day(to_date(SYSDATE)),
                                 'DD')))

 GROUP BY trunc(p / 7)

 ORDER BY sun NULLS FIRST;


該情景對話以輕松愉快的情景對話方式介紹 SQL 的 增刪改查 操作!希望能給讀者不一樣的體驗~

?? 粉絲專屬福利

玩轉 Linux: 《玩轉 Vagrant 系列》
玩轉 Oracle: 《Oracle 一鍵安裝腳本》
安裝 Oracle: 《Oracle 零基礎安裝》
運維小知識: 《每天一個DBA小知識》

👇🏻 可通過搜索下方 公眾號 免費 獲取👇🏻

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/313580.html

標籤:其他

上一篇:?? SQL 零基礎入門教程【圖文并茂】

下一篇:在《圍棋編程語言》一書中的死鎖,它是如何發生的,為什么會發生?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more