這是第二次打卡作業了,這一次的主要內容是基礎的SQL語句,但是有個概念我們要搞清楚,就是什麼是SQL、什麼是MySQL。以下的語句都是基於MySQL。
什麼是SQL
SQL是Structured Query Language的縮寫,中文叫做結構化查詢語言,是專門用來運算元據庫的。
什麼是MySQL
MySQL是一款資料庫軟體,當然,站在語言的角度也是一門語言,是遵循SQL的一些準則便攜的語言例項。SQL是標準,而MySQL是具體的實現。
SELECT FROM查詢語句
基礎用法
SElECT查詢語句可以說會是資料庫中使用最多的語句了。他可以查詢資料表中的內容。如果你想要從資料庫中查詢某個資訊,你最少需要提供兩個資訊。
- 想要查詢的欄位名(域名)
- 想要查詢的表名
SELECT name
FROM student
複製程式碼
上面的這條語句就是從student表中檢索一個欄位名為name的列。這是最簡單的用法,SELECT語句還有很多子語句,我們會在下面介紹。當然,你也可以查詢多個列,就像下面這個樣子,欄位名的中間使用逗號隔開就好。當然,你也可以使用*號,來返回所有的列。
SELECT id,
name,
sex
FROM student
複製程式碼
去重語句
我們使用上面的查詢語句會有一個很重要的問題,就是他會將所有的查詢結果返回給我們,但是也許我們只是想要不同的那一部分。這時,我們可以使用DISTINCT關鍵字,將它放在相應的欄位名前即可
SELECT DISTINCT id,
FROM products
複製程式碼
這樣的話就會將不同的id幫你檢索出來,還有一個很重要的問題,便是如果DISTINCT後面跟了多個欄位名,那麼這兩個欄位都會起作用,也就是說除非兩行的這兩個欄位是一模一樣的,否則就會被檢索出來。
限制結果
有些時候我們期望檢索從某個位置開始,返回這之後匹配到的指定數量的資料,這時便是限制結果起作用的時候了。
SELECT name
FROM products
LIMIT 5;
複製程式碼
上面的語句便是告訴資料庫只返回檢索到的5個資料,limit子語句還有一個關鍵字,允許告訴資料庫從距離起始位置多少個數量的地方開始檢索資料
SELECT name
FROM products
LIMIT 5 OFFSET 5
複製程式碼
上面的語句就是告訴資料庫從便宜起始位置5個數量的地方開始檢索,並且檢索的資料量不超過5個。也可以使用簡寫的方式,LIMIT 5,5;
WHERE篩選語句
上面我們已經看了基本的SELECT語句了,但是上面的無法滿足我們更多的需求,我們使用資料庫查詢資料更多的時候是需要提供一些條件的,這時我們便需要用到WHERE子語句。例如我們從學生表中查詢學號為10的學生名
SELECT name
FROM student
WHERE id = 10;
複製程式碼
最下面的WHERE語句後面跟的是條件,當然我們也可以複合,使用AND、OR操作符(可以想象成程式語言的&&、||操作符)
AND
SELECT name
FROM student
WHERE age < 18 AND sex = female;
複製程式碼
上面的查詢語句表示要查詢年齡小於18歲,並且性別為男性的學生。
OR
SELECT name
FROM student
WHERE age < 18 OR age >20;
複製程式碼
上面的查詢語句表示要查詢年齡小於18歲,或者年齡大於20歲的學生。
BETWEEN AND
使用BETWEEN AND操作符可以將某個條件限定在一定範圍之內,我們可以將上面的查詢在18到20歲年齡區間的改為使用BETWEEN AND查詢
SELECT name
FROM student
WHERE age BETWEEN 18 AND 20;
複製程式碼
還有一些簡答的單個操作符就不再一一介紹了,具體可以去查相關文件
ORDER BY排序語句
當我們有了我們想要資料,我們還是不滿足,返回來一大堆資料,毫無順序可言,這怎麼看,這是ORDER BY排序語句就登場了。ORDER BY可以按照升降序排列。預設是升序,想要使用降序時可以使用DESC關鍵字
SELECT name
FROM products
ORDER BY name;
複製程式碼
這樣的話就會按照name欄位的字典順序排列,如果想要變為降序,只需在ORDER BY的語句後面新增DESC。
SELECT name
FROM products
ORDER BY name DESC;
複製程式碼
還有可以按照多個列排序
SELECT id, price, name
FROM products
ORDER BY price, name;
複製程式碼
上面的例子就是按照多個列排序,這裡問題是隻有第一個排序條件相同時第二個才會起作用。
GROUP BY子句與HAVING子句
GROUP BY子句
我們直接看一個例子
SELECT id, COUNT(*) AS count
FROM products
GROUP BY id;
--結果
id count
BRS01 3
DLL01 4
FNG01 2
複製程式碼
上面的例子返回的結果有兩個列,其中第一列為id,第二列為第一列id的數量,其實是GROUP BY幫我們根據id分了組,然後再每個組各自計算的數量。有個一個需要注意的地方,GROUP BY子句必須出現在WHERE子句之後,ORDER BY子句之前
HAVING子句
依然是來看例子
SELECT id, COUNT(*) AS count
FROM orders
GROUP BY id
HAVING COUNT(*) >= 2;
複製程式碼
上面的語句基本與上一個例子相同,只是最後一行多了HAVING子句,表示查詢分組之後的資料中數量大於2的分組
函式
函式有日期處理函式、熟知處理函式、字元處理函式、聚合函式,我們就來看看應該是使用最多的的聚合函式的用法吧
聚合函式
上面是聚合函式的型別,他們使用起來很簡單,只要在查詢時,將我們的資料欄位使用函式包裹起來就好。 --平均值函式
SELECT AVG(price) AS avg_price
FROM products;
--總數函式
SELECT COUNT(*) AS cust
FROM products;
--最大值函式
SELECT MAX(price) AS max_price
FROM products;
--最小值函式
SELECT MIN(price) AS min_price
FROM products;
-- 求和函式
SELECT SUM(quantity) AS items_ordered
FROM orderItems
WHERE order_num = 20005;
複製程式碼
作業
作業一
第一步:建立資料表&插入資料
CREATE DATABASE test;
USE test;
CREATE TABLE if NOT EXISTS email(
ID INT NOT NULL PRIMARY KEY,
Email VARCHAR(255)
);
INSERT INTO email VALUES('1','a@b.com');
INSERT INTO email VALUES('2','c@d.com');
INSERT INTO email VALUES('3','a@b.com');
複製程式碼
第二步:查詢資料
SELECT Email
FROM email
GROUP BY Email
HAVING COUNT(*) >=2;
複製程式碼
結果圖:
作業二
第一步:建立資料表&插入資料
CREATE TABLE if not exists World(
name VARCHAR(50) NOT NULL,
continent VARCHAR(50) NOT NULL,
area INT NOT NULL,
population INT NOT NULL,
gdp INT NOT NULL
);
INSERT INTO World
VALUES('Afghanistan','Asia',652230,25500100,20343000);
INSERT INTO World
VALUES('Albania','Europe',28748,2831741,12960000);
INSERT INTO World
VALUES('Algeria','Africa',2381741,37100000,188681000);
INSERT INTO World
VALUES('Andorra','Europe',468,78115,3712000);
INSERT INTO World
VALUES('Angola','Africa',1246700,20609294,100990000);
複製程式碼
第二步:查詢資料
SELECT name,population,area
FROM World
WHERE area >= 3000000
OR (population >= 25000000 AND gdp >= 20000000);
複製程式碼
結果圖: