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;