MySQL必知必會學習錄之查詢和排序
MySQL如何檢索數據?
本篇博文使用樣例表如下:
SQL 建表語句如下:
/*
Navicat Premium Data Transfer
Source Server : localhost_mysql
Source Server Type : MySQL
Source Server Version : 80019
Source Host : localhost:3306
Source Schema : mysql_must_be_know_db
Target Server Type : MySQL
Target Server Version : 80019
File Encoding : 65001
Date: 08/04/2020 22:18:27
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for products
-- ----------------------------
DROP TABLE IF EXISTS `products`;
CREATE TABLE `products` (
`prod_id` int NOT NULL AUTO_INCREMENT,
`vend_id` int DEFAULT NULL COMMENT '產品供應商ID(關聯到vendors表中的vend_id)',
`prod_name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '產品名',
`prod_price` decimal(10,2) DEFAULT NULL COMMENT '產品價格',
`prod_desc` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '產品描述',
PRIMARY KEY (`prod_id`),
KEY `vend_foreign_id` (`vend_id`),
CONSTRAINT `vend_foreign_id` FOREIGN KEY (`vend_id`) REFERENCES `vendors` (`vend_id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
-- ----------------------------
-- Records of products
-- ----------------------------
BEGIN;
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
點擊查看更多
MySQL必知必會學習錄之樣例表
1.1 檢索單個列
檢索單個列示例如下:
SELECT
prod_name
FROM
products;
1.2 檢索多個列
檢索多個列示例如下:
SELECT
prod_id,
prod_name,
prod_price
FROM
products;
1.3 檢索所有列
檢索所有列
SELECT
*
FROM
products;
- 如果給定一個通配符(*),則返回表中所有列。
- 列的順序一般是列在表定義中出現的順序。
- 但有時候並不是這樣的,表的模式的變化(如添加或刪除列)可能會導致順序的變化
- 使用通配符 一般,除非你確實需要表中的每個列,否則最好別使用*通配符。雖然使用通配符可能會使你自己省事,不用明確列出所需列,但檢索不需要的列通常會降低檢索和應用程序的性能
- 檢索未知列 使用通配符有一個大優點。由於不明確指定列名(因爲星號檢索每個列),所以能檢索出名字未知的列
1.4 使用DISTINCT 檢索去重
SELECT 會返回所有符合條件的記錄,如果有重複的,想要去重怎麼辦?
SELECT DISTINCT
vend_id
FROM
products;
1.5 使用LIMIT 關鍵字限制返回前多少條記錄
- 返回前五條記錄
SELECT
prod_name
FROM
products
LIMIT 5;
行0 檢索出來的第一行爲行0而不是行1。因此,LIMIT 1, 1將檢索出第二行而不是第一行。
- 返回第5行開始返回五條記錄
SELECT
prod_name
FROM
products
LIMIT 10,
5;
- LIMIT 10,5指示MySQL返回從行10開始的5行。第一個數爲開始位置,第二個數爲要檢索的行數
- 在行數不夠時 LIMIT中指定要檢索的行數爲檢索的最大行數。如果沒有足夠的行(例如,給出LIMIT 10, 5,但只有13行), MySQL將只返回它能返回的那麼多行。
1.6 使用完全限定的列名和表名
針對一些特別場景的時候需要使用完全限制的列名和表名
SELECT
products.prod_name
FROM
mysql_must_be_know_db.products;
0x02 MySQL如何排序數據?
接下來我們講解下如何針對MySQL 結果進行排序。
2.1 單列排序
如果只針對單個列進行排序,則語法示例如下:
SELECT
prod_name
FROM
products
ORDER BY
prod_name;
2.2 多列排序
經常需要按不止一個列進行數據排序。例如,如果要顯示僱員清單,可能希望按姓和名排序(首先按姓排序,然後在每個姓中再按名排序)。如果多個僱員具有相同的姓,這樣做很有用。
爲了按多個列排序,只要指定列名,列名之間用逗號分開即可(就像選擇多個列時所做的那樣)。
下面的代碼檢索3個列,並按其中兩個列對結果進行排序——首先按價格,然後再按名稱排序。
SELECT
prod_id,
prod_price,
prod_name
FROM
products
ORDER BY
prod_price,
prod_name;
2.3 指定排序方向
2.3.1 默認ASC 升序 從低到高進行排序
數據排序不限於升序排序(從A到Z)。這只是默認的排序順序,
按照價格從低到高進行排列,可以使用默認值
SELECT
prod_id,
prod_price,
prod_name
FROM
products
ORDER BY
prod_price;
也可以顯式指定:
SELECT
prod_id,
prod_price,
prod_name
FROM
products
ORDER BY
prod_price ASC;
2.3.2 DESC 降序 從高到低進行排序
我們還可以使用ORDER BY
子句以降序(從Z到A)順序排序。爲了進行降序排序,必須指定DESC
關鍵字
下面的例子按價格以降序排序產品(最貴的排在最前面,即價格從高到低進行排序)
SELECT
prod_id,
prod_price,
prod_name
FROM
products
ORDER BY
prod_price DESC;