SQL查詢語句(一)—— 單表查詢


------------恢復內容開始------------

一、查詢語句

語句執行順序

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 BYSELECT語句中使用該子句而不使用聚合 函數,則該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,並包含之間的任何單個字符例如TomTim

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;




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM