------------恢復內容開始------------
一、查詢語句
語句執行順序
FROM ——> SELECT
SELECT select_list
FROM table_name;
查詢多列數據
SELECT
lastname,
firstname,
jobtitle
FROM
employees;
二、排序數據
語句執行順序
FROM --> SELECT --> ORDER BY
SELECT
select_list
FROM
table_name
ORDER BY
column1 [ASC|DESC],
column2 [ASC|DESC],
...;
如果未明確指定任何排序規則,默認(升序)使用ORDER BY ASC
-
升序 ASC
ORDER BY column1 ASC;
-
降序 DESC
ORDER BY column1 DESC;
多列對結果集進行排序
ORDER BY
column1,
column2;
第一個名字降序排列,然后將客戶的姓氏排序
SELECT
contactLastname,
contactFirstname
FROM
customers
ORDER BY
contactLastname DESC,
contactFirstname ASC;
對結果集進行排序
SELECT
orderNumber,
orderlinenumber,
quantityOrdered * priceEach
FROM
orderdetails
ORDER BY
quantityOrdered * priceEach DESC;
按訂單狀態進行排序
SELECT
orderNumber,
status
FROM
orders
ORDER BY
FIELD(status,
'In Process',
'On Hold',
'Cancelled',
'Resolved',
'Disputed',
'Shipped');
三、過濾數據
WHERE子句,為查詢返回的行指定搜索條件
語句執行順序
FROM --> WHERE-->SELECT --> ORDER BY
SELECT
lastname,
firstname,
jobtitle
FROM
employees
WHERE
jobtitle = 'Sales Rep';
WHERE子句與AND運算符
查找職務為Sales Rep
且辦公代碼為1的員工
SELECT
lastname,
firstname,
jobtitle,
officeCode
FROM
employees
WHERE
jobtitle = 'Sales Rep' AND
officeCode = 1;
WHERE子句與OR運算符
查找職務為的Sales Rep
員工或使用辦公代碼1查找辦公室的員工
SELECT
lastName,
firstName,
jobTitle,
officeCode
FROM
employees
WHERE
jobtitle = 'Sales Rep' OR
officeCode = 1
ORDER BY
officeCode ,
jobTitle;
WHERE子句與BETWEEN運算符
查找辦公室代碼為1到3的辦公室中的員工
SELECT
firstName,
lastName,
officeCode
FROM
employees
WHERE
officeCode BETWEEN 1 AND 3
ORDER BY officeCode;
WHERE和LIKE運算符
查詢查找姓氏以字符串結尾的員工'son'
SELECT
firstName,
lastName
FROM
employees
WHERE
lastName LIKE '%son'
ORDER BY firstName;
WHERE和IN操作符
查找位於辦公室的辦公室代碼為1的員工
SELECT
firstName,
lastName,
officeCode
FROM
employees
WHERE
officeCode IN (1 , 2, 3)
ORDER BY
officeCode;
WHERE和 IS NULL 操作符
在數據庫世界中,NULL
是一個標記,指示一條信息丟失或未知。它不等於數字0或空字符串。
SELECT
lastName,
firstName,
reportsTo
FROM
employees
WHERE
reportsTo IS NULL;
運算符
操作 | 描述 |
---|---|
= | 等於 |
<>或!= | 不等於 |
< | 少於 |
> | 大於 |
<= | 小於或等於 |
> = | 大於或等於 |
查詢使用不等於(<>)運算符查找不是的所有員工Sales Rep
SELECT
lastname,
firstname,
jobtitle
FROM
employees
WHERE
jobtitle <> 'Sales Rep';
DISTINCT,結果集去重 (DISTINCT
將所有NULL
值都視為相同值)
SELECT DISTINCT
select_list
FROM
table_name;
選擇雇員的唯一姓氏
SELECT
DISTINCT lastname
FROM
employees
ORDER BY
lastname;
DISTINCT多個字段
從customers
表中獲得城市和州的唯一組合
SELECT DISTINCT
state, city
FROM
customers
WHERE
state IS NOT NULL
ORDER BY
state,
city;
GROUP BY
在SELECT
語句中使用該子句而不使用聚合 函數,則該GROUP BY
子句的行為類似於該DISTINCT
子句
SELECT
state
FROM
customers
GROUP BY state;
DISTINCT和聚合函數
計算美國客戶的唯一狀態
SELECT
COUNT(DISTINCT state)
FROM
customers
WHERE
country = 'USA';
DISTINCT和LIMIT
選擇表中的前五個非空唯一狀態customers
SELECT DISTINCT
state
FROM
customers
WHERE
state IS NOT NULL
LIMIT 5;
AND 運算符
它將兩個或多個布爾表達式組合在一起,並且僅在兩個表達式都為true時才返回true
AND 短路邏輯
SELECT 1 = 0 AND 1 / 0 ;
1 = 0 AND 1 / 0
---------------
0
OR 運算符
OR 短路邏輯
SELECT 1 = 1 OR 1 / 0;
1 = 1 OR 1 / 0
--------------
1
多個運算符順序,先 執行AND 再執行OR
SELECT true OR false AND false;
true OR false AND false
-----------------------
1
改變運算順序使用括號
SELECT (true OR false) AND false;
(true OR false) AND false
-------------------------
0
獲取位於美國或法國的客戶
SELECT
customername,
country
FROM
customers
WHERE country = 'USA' OR
country = 'France';
位於美國或法國且信用額度大於100,000的客戶
SELECT
customername,
country,
creditLimit
FROM
customers
WHERE(country = 'USA'
OR country = 'France')
AND creditlimit > 100000;
IN運算符
SELECT
column1,column2,...
FROM
table_name
WHERE
(expr|column_1) IN ('value1','value2',...);
位於美國和法國的辦事處,則可以使用該IN
運算符
SELECT
officeCode,
city,
phone,
country
FROM
offices
WHERE
country IN ('USA' , 'France');
OR
運算符獲得與以下查詢相同
SELECT
officeCode,
city,
phone
FROM
offices
WHERE
country = 'USA' OR country = 'France';
IN與子查詢一起使用
總價值是大於60,000
的訂單,按訂單號升序
SELECT
orderNumber,
customerNumber,
status,
shippedDate
FROM
orders
WHERE orderNumber IN
(
SELECT
orderNumber
FROM
orderDetails
GROUP BY
orderNumber
HAVING SUM(quantityOrdered * priceEach) > 60000
);
BETWEEN 運算符
expr [NOT] BETWEEN begin_expr AND end_expr;
使用BETWEEN
運算符查找購買價格在90
和之間的產品 100
SELECT
productCode,
productName,
buyPrice
FROM
products
WHERE
buyPrice BETWEEN 90 AND 100;
使用大於或等於(>=
)和小於或等於(<=
)運算符而不是BETWEEN
運算符來獲得相同的結果
SELECT
productCode,
productName,
buyPrice
FROM
products
WHERE
buyPrice >= 90 AND buyPrice <= 100;
查找購買價格不在$ 20到$ 100之間的產品,可將BETWEEN
運算符與NOT
運算符組合
SELECT
productCode,
productName,
buyPrice
FROM
products
WHERE
buyPrice NOT BETWEEN 20 AND 100;
使用小於(<
),大於(>
)和邏輯運算符(AND
)來重寫上面的查詢
SELECT
productCode,
productName,
buyPrice
FROM
products
WHERE
buyPrice < 20 OR buyPrice > 100;
返回訂單的日期為2003年1月1日至2003年3月1日 (安全起見,轉成timestamp進行比較)
SELECT
orderNumber,
requiredDate,
status
FROM
orders
WHERE
requireddate BETWEEN
CAST('2003-01-01' AS DATETIME) AND
CAST('2003-01-31' AS DATETIME);
LIKE運算符(模糊匹配)
expression LIKE pattern ESCAPE escape_character
- 百分比(
%
)通配符與零個或多個字符的任何字符串匹配。 - 下划線(
_
)通配符匹配任何單個字符。
查找名字開頭為a
的員工
SELECT
employeeNumber,
lastName,
firstName
FROM
employees
WHERE
firstName LIKE 'a%';
雇員的姓氏以on
結尾
SELECT
employeeNumber,
lastName,
firstName
FROM
employees
WHERE
lastName LIKE '%on';
姓氏包含on
的所有員工
SELECT
employeeNumber,
lastName,
firstName
FROM
employees
WHERE
lastname LIKE '%on%';
找到員工,其名字開始 T
與結束m
,並包含之間的任何單個字符例如Tom
,Tim
SELECT
employeeNumber,
lastName,
firstName
FROM
employees
WHERE
firstname LIKE 'T_m';
姓氏不是以B
字符開頭的員工
SELECT
employeeNumber,
lastName,
firstName
FROM
employees
WHERE
lastName NOT LIKE 'B%';
查找產品代碼包含_20
字符串的產品,則可以使用%\_20%
SELECT
productCode,
productName
FROM
products
WHERE
productCode LIKE '%\_20%';
或者可以使用$
,ESCAPE
子句
SELECT
productCode,
productName
FROM
products
WHERE
productCode LIKE '%$_20%' ESCAPE '$';
LIMIT子句
SELECT
select_list
FROM
table_name
LIMIT [offset,] row_count;
這兩個子句是等效的:
LIMIT row_count;
和
LIMIT 0 , row_count;
語句執行順序
FROM -> WHERE -> SELECT -> ORDER BY -> LIMIT
SELECT select_list
FROM table_name
ORDER BY order_expression
LIMIT offset, row_count;
獲得信用度最高的前五名客戶
SELECT
customerNumber,
customerName,
creditLimit
FROM
customers
ORDER BY creditLimit DESC
LIMIT 5;
ORDER BY
子句中添加更多列以按唯一順序約束行
SELECT
customerNumber,
customerName,
creditLimit
FROM
customers
ORDER BY
creditLimit,
customerNumber
LIMIT 5;
LIMIT分頁
表中獲取總行數
SELECT COUNT(*) FROM customers;
獲取第1頁的行,該行包含按客戶名稱排序的前10個客戶
SELECT
customerNumber,
customerName
FROM
customers
ORDER BY customerName
LIMIT 10;
第11-20行
SELECT
customerNumber,
customerName
FROM
customers
ORDER BY customerName
LIMIT 10, 10;
LIMIT獲得第n個最高或最低值
SELECT select_list
FROM table_name
ORDER BY sort_expression
LIMIT n-1, 1;
查找信用度第二高的客戶
SELECT
customerName,
creditLimit
FROM
customers
ORDER BY
creditLimit DESC
LIMIT 1,1;
更為准確使用子查詢
SELECT
customerName,
creditLimit
FROM
customers
WHERE
creditLimit = (SELECT
customerName,
creditLimit
FROM
customers
ORDER BY
creditLimit DESC
LIMIT 1,1));
更為准確要使用DENSE_RANK()
函數 (待補充 )
IS NULL運算符
SELECT 1 IS NULL, -- 0
0 IS NULL, -- 0
NULL IS NULL; -- 1
檢查值是否不是NULL
value IS NOT NULL
查找沒有銷售代表的客戶
SELECT
customerName,
country,
salesrepemployeenumber
FROM
customers
WHERE
salesrepemployeenumber IS NULL
ORDER BY
customerName;
如果DATE或DATETIME列具有NOT NULL約束並且包含特殊日期'0000-00-00',則可以使用IS NULL
CREATE TABLE IF NOT EXISTS projects (
id INT AUTO_INCREMENT,
title VARCHAR(255),
begin_date DATE NOT NULL,
complete_date DATE NOT NULL,
PRIMARY KEY(id)
);
INSERT INTO projects(title,begin_date, complete_date)
VALUES('New CRM','2020-01-01','0000-00-00'),
('ERP Future','2020-01-01','0000-00-00'),
('VR','2020-01-01','2030-01-01');
SELECT *
FROM projects
WHERE complete_date IS NULL;