【MySQL】SELECT语句 - 查询数据
第4章 检索数据
简单记录 - MySQL必知必会 - [英]Ben Forta
如何使用SELECT语句从表中检索一个或多个数据列。
检索、查询数据
1、SELECT语句
SQL语句是由简单的英语单词构成的。这些单词称为关键字,每个SQL语句都是由一个或多个关键字构成的。
应该最经常使用的SQL语句就是SELECT语句了。
SELECT语句用途是从一个或多个表中检索信息。
为了使用SELECT检索表数据,必须至少给出两条信息——想选择什么,以及从什么地方选择。
检索表数据,使用SELECT语句,使用SELECT至少要知道想选择什么数据,从哪里来选这数据。
SELECT ... FROM ...
2、检索单个列
使用简单的SQL SELECT语句开始来检索数据吧,
我们要检索表中的单个列的所有数据怎么办?
例子, 输入:SELECT prod_name FROM products;
输出如下所示:
mysql> SELECT prod_name FROM products;
+----------------+
| prod_name |
+----------------+
| .5 ton anvil |
| 1 ton anvil |
| 2 ton anvil |
| Detonator |
| Bird seed |
| Carrots |
| Fuses |
| JetPack 1000 |
| JetPack 2000 |
| Oil can |
| Safe |
| Sling |
| TNT (1 stick) |
| TNT (5 sticks) |
+----------------+
14 rows in set (0.00 sec)
分析:
SELECT prod_name FROM products;
语句利用SELECT语句从products表中检索一个名叫prod_name的列。平常我们要检索单个列的时候,可以用这个语句SELECT ...FROM ...
, 所需的列名在SELECT关键字之后给出,FROM关键字后面是要检索数据的表名。
注意:简单SELECT语句将返回表中所有行,但数据没有过滤(过滤将得出结果集的一个子集),也没有排序。
注意,SQL语句不区分大小写,因此SELECT与select是相同的。同样,写成SeLect也没有关系。但一般是所有SQL关键字使用大写,而对所有列和表名使用小写,这样做使代码更易于阅读和调试。
3、检索多个列
要想从一个表中检索多个列,还是使用SELECT语句。唯一的不同是必须在SELECT关键字后给出多个列名,列名之间必须以逗号分隔。
例子:SELECT prod_id,prod_name,prod_price FROM products;
mysql> SELECT prod_id,prod_name,prod_price FROM products;
+---------+----------------+------------+
| prod_id | prod_name | prod_price |
+---------+----------------+------------+
| ANV01 | .5 ton anvil | 5.99 |
| ANV02 | 1 ton anvil | 9.99 |
| ANV03 | 2 ton anvil | 14.99 |
| DTNTR | Detonator | 13.00 |
| FB | Bird seed | 10.00 |
| FC | Carrots | 2.50 |
| FU1 | Fuses | 3.42 |
| JP1000 | JetPack 1000 | 35.00 |
| JP2000 | JetPack 2000 | 55.00 |
| OL1 | Oil can | 8.99 |
| SAFE | Safe | 50.00 |
| SLING | Sling | 4.49 |
| TNT1 | TNT (1 stick) | 2.50 |
| TNT2 | TNT (5 sticks) | 10.00 |
+---------+----------------+------------+
14 rows in set (0.00 sec)
分析:
这条语句使用SELECT语句从表products中选择数据。在这个例子中,指定了3个列名prod_id,prod_name,prod_price,列名之间用逗号分隔。
说明 数据表示: 从上述输出可以看到,SQL语句一般返回原始的、无格式的数据。一般在显示在应用程序的数据是格式化了的,很少使用实际检索出的原始数据。
在选择多个列时,一定要在列名之间加上逗号,但最后一个列名后不加。如果在最后一个列名后加了逗号,将出现错误。
例如:SELECT prod_id,prod_name,prod_price, FROM products;
mysql> SELECT prod_id,prod_name,prod_price, FROM products;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM products' at line 1
mysql>
4、检索所有列
除了指定所需的列外(一个或多个列), SELECT语句还可以检索所有的列而不必逐个列出它们。这可以通过在实际列名的位置使用星号(*)通配符来达到,如下所示:
SELECT * FROM products;
mysql> SELECT * FROM products;
+---------+---------+----------------+------------+----------------------------------------------------------------+
| prod_id | vend_id | prod_name | prod_price | prod_desc |
+---------+---------+----------------+------------+----------------------------------------------------------------+
| ANV01 | 1001 | .5 ton anvil | 5.99 | .5 ton anvil, black, complete with handy hook |
| ANV02 | 1001 | 1 ton anvil | 9.99 | 1 ton anvil, black, complete with handy hook and carrying case |
| ANV03 | 1001 | 2 ton anvil | 14.99 | 2 ton anvil, black, complete with handy hook and carrying case |
| DTNTR | 1003 | Detonator | 13.00 | Detonator (plunger powered), fuses not included |
| FB | 1003 | Bird seed | 10.00 | Large bag (suitable for road runners) |
| FC | 1003 | Carrots | 2.50 | Carrots (rabbit hunting season only) |
| FU1 | 1002 | Fuses | 3.42 | 1 dozen, extra long |
| JP1000 | 1005 | JetPack 1000 | 35.00 | JetPack 1000, intended for single use |
| JP2000 | 1005 | JetPack 2000 | 55.00 | JetPack 2000, multi-use |
| OL1 | 1002 | Oil can | 8.99 | Oil can, red |
| SAFE | 1003 | Safe | 50.00 | Safe with combination lock |
| SLING | 1003 | Sling | 4.49 | Sling, one size fits all |
| TNT1 | 1003 | TNT (1 stick) | 2.50 | TNT, red, single stick |
| TNT2 | 1003 | TNT (5 sticks) | 10.00 | TNT, red, pack of 10 sticks |
+---------+---------+----------------+------------+----------------------------------------------------------------+
14 rows in set (0.00 sec)
分析:如果给定一个通配符(*),则返回表中所有列。列的顺序一般是列在表定义中出现的顺序。但有时候并不是这样的,表的模式的变化(如添加或删除列)可能会导致顺序的变化。
注意:使用通配符 一般,除非确实需要表中的每个列,否则最好别使用*通配符。虽然使用通配符可能会使你自己省事,不用明确列出所需列,但检索不需要的列通常会降低检索和应用程序的性能。
提示:检索未知列 使用通配符有一个大优点。由于不明确指定列名(因为星号检索每个列),所以能检索出名字未知的列。
5、检索不同的行
SELECT能返回所有匹配的行。但是,如果不想要每个值每次都出现(重复的数出现一次就好了),怎么办?
例如,想知道products表中产品的所有供应商ID:
SELECT vend_id FROM products;
mysql> SELECT vend_id FROM products;
+---------+
| vend_id |
+---------+
| 1001 |
| 1001 |
| 1001 |
| 1002 |
| 1002 |
| 1003 |
| 1003 |
| 1003 |
| 1003 |
| 1003 |
| 1003 |
| 1003 |
| 1005 |
| 1005 |
+---------+
14 rows in set (0.00 sec)
SELECT语句返回14行(但表中只有4个供应商),products表中列出了14个产品。
那么,如何检索出有不同值的列表呢?解决办法是使用DISTINCT关键字,顾名思义,此关键字指示MySQL只返回不同的值。distinct
SELECT DISTINCT vend_id FROM products;
mysql> SELECT DISTINCT vend_id FROM products;
+---------+
| vend_id |
+---------+
| 1001 |
| 1002 |
| 1003 |
| 1005 |
+---------+
4 rows in set (0.00 sec)
mysql>
分析:
SELECT DISTINCT vend_id告诉MySQL只返回不同(唯一)的vend_id行,因此只返回4行。如果使用DISTINCT关键字,它必须直接放在列名的前面。
DISTINCT vend_id, prod_price
作用两个 看这个两列,两列的组合重复就过滤掉。
mysql> SELECT vend_id, prod_price FROM products;
+---------+------------+
| vend_id | prod_price |
+---------+------------+
| 1001 | 5.99 |
| 1001 | 9.99 |
| 1001 | 14.99 |
| 1003 | 13.00 |
| 1003 | 10.00 |
| 1003 | 2.50 |
| 1002 | 3.42 |
| 1005 | 35.00 |
| 1005 | 55.00 |
| 1002 | 8.99 |
| 1003 | 50.00 |
| 1003 | 4.49 |
| 1003 | 2.50 |
| 1003 | 10.00 |
+---------+------------+
14 rows in set (0.00 sec)
SELECT DISTINCT vend_id, prod_price
看vend_id, prod_price列的组合有没有重复的,有的话就过滤。
mysql> SELECT DISTINCT vend_id, prod_price FROM products;
+---------+------------+
| vend_id | prod_price |
+---------+------------+
| 1001 | 5.99 |
| 1001 | 9.99 |
| 1001 | 14.99 |
| 1003 | 13.00 |
| 1003 | 10.00 |
| 1003 | 2.50 |
| 1002 | 3.42 |
| 1005 | 35.00 |
| 1005 | 55.00 |
| 1002 | 8.99 |
| 1003 | 50.00 |
| 1003 | 4.49 |
+---------+------------+
12 rows in set (0.00 sec)
6、限制结果
SELECT语句返回所有匹配的行,它们可能是指定表中的每个行。
但有时我们需要返回第一行或前几行,怎么办呢?
可使用LIMIT子句。
例子: 返回prod_name的前5行 SELECT prod_name FROM products LIMIT 5;
mysql> SELECT prod_name FROM products LIMIT 5;
+--------------+
| prod_name |
+--------------+
| .5 ton anvil |
| 1 ton anvil |
| 2 ton anvil |
| Detonator |
| Bird seed |
+--------------+
5 rows in set (0.00 sec)
mysql>
分析:
此语句使用SELECT语句检索单个列。LIMIT 5指示MySQL返回不多于5行。
我想要得到下一个5行,怎么做呢?
为得出下一个5行,可指定要检索的开始行和行数,
如下所示:SELECT prod_name FROM products LIMIT 5,5;
mysql> SELECT prod_name FROM products LIMIT 5,5;
+--------------+
| prod_name |
+--------------+
| Carrots |
| Fuses |
| JetPack 1000 |
| JetPack 2000 |
| Oil can |
+--------------+
5 rows in set (0.00 sec)
mysql>
LIMIT 5, 5指示MySQL返回从行5开始的5行。第一个数为开始位置,第二个数为要检索的行数。
所以,带一个值的LIMIT总是从第一行开始,给出的数为返回的行数。带两个值的LIMIT可以指定从行号为第一个值的位置开始。(带两个值的LIMIT,相对某行开始返回)
注意:行0 检索出来的第一行为行0而不是行1。因此,LIMIT 1, 1将检索出第二行而不是第一行。
mysql> SELECT prod_name FROM products LIMIT 1,1;
+-------------+
| prod_name |
+-------------+
| 1 ton anvil |
+-------------+
1 row in set (0.00 sec)
mysql> SELECT prod_name FROM products LIMIT 0,5;
+--------------+
| prod_name |
+--------------+
| .5 ton anvil |
| 1 ton anvil |
| 2 ton anvil |
| Detonator |
| Bird seed |
+--------------+
5 rows in set (0.00 sec)
mysql>
说明;在行数不够时 ,当LIMIT中指定要检索的行数为检索的最大行数,如果没有足够的行, MySQL将只返回它能返回的那么多行。(例如,给出LIMIT 10, 5,但只有0-13行,返回10 、11、12、13 四行)
mysql> SELECT prod_name FROM products LIMIT 10,5;
+----------------+
| prod_name |
+----------------+
| Safe |
| Sling |
| TNT (1 stick) |
| TNT (5 sticks) |
+----------------+
4 rows in set (0.00 sec)
mysql>
提示:MySQL 5的LIMIT语法 LIMIT 3, 4的含义是从行4开始的3行还是从行3开始的4行?如前所述,它的意思是从行3开始的4行,这容易把人搞糊涂。由于这个原因,MySQL 5支持LIMIT的另一种替代语法。LIMIT 4 OFFSET 3意为从行3开始取4行,就像LIMIT 3, 4一样。从行3开始的4行 3,4,5,6,
mysql> SELECT prod_name FROM products LIMIT 4 OFFSET 3;
+-----------+
| prod_name |
+-----------+
| Detonator |
| Bird seed |
| Carrots |
| Fuses |
+-----------+
4 rows in set (0.00 sec)
mysql> SELECT prod_name FROM products LIMIT 3,4;
+-----------+
| prod_name |
+-----------+
| Detonator |
| Bird seed |
| Carrots |
| Fuses |
+-----------+
4 rows in set (0.00 sec)
LIMIT 4 OFFSET 3意为从行3开始取4行,就像LIMIT 3, 4一样。
7、使用完全限定的表名
之前的SQL例子只通过列名引用列,可以使用完全限定的名字来引用列(同时使用表名和列字)。
例子:SELECT products.prod_name FROM products;
mysql> SELECT products.prod_name FROM products;
+----------------+
| prod_name |
+----------------+
| .5 ton anvil |
| 1 ton anvil |
| 2 ton anvil |
| Detonator |
| Bird seed |
| Carrots |
| Fuses |
| JetPack 1000 |
| JetPack 2000 |
| Oil can |
| Safe |
| Sling |
| TNT (1 stick) |
| TNT (5 sticks) |
+----------------+
14 rows in set (0.00 sec)
mysql>
这条SQL语句在功能上等于SELECT prod_name FROM products;
语句,
mysql> SELECT prod_name FROM products;
+----------------+
| prod_name |
+----------------+
| .5 ton anvil |
| 1 ton anvil |
| 2 ton anvil |
| Detonator |
| Bird seed |
| Carrots |
| Fuses |
| JetPack 1000 |
| JetPack 2000 |
| Oil can |
| Safe |
| Sling |
| TNT (1 stick) |
| TNT (5 sticks) |
+----------------+
14 rows in set (0.00 sec)
但这里指定了一个完全限定的列名。表名也可以是完全限定的,如下所示:
SELECT products.prod_name FROM mysqlcrashcourse.products;
mysql> SELECT products.prod_name FROM mysqlcrashcourse.products;
+----------------+
| prod_name |
+----------------+
| .5 ton anvil |
| 1 ton anvil |
| 2 ton anvil |
| Detonator |
| Bird seed |
| Carrots |
| Fuses |
| JetPack 1000 |
| JetPack 2000 |
| Oil can |
| Safe |
| Sling |
| TNT (1 stick) |
| TNT (5 sticks) |
+----------------+
14 rows in set (0.00 sec)
mysql>
这条语句在功能上也等于SELECT products.prod_name FROM products;
语句(products表必须位于mysqlcrashcourse数据库中)。在有一些情形需要完全限定名,就会用到这个语法,需注意,以便在遇到时知道它的作用。
8、小结
学习了如何使用SQL的SELECT语句来检索单个表列、多个表列以及所有表列。
SELECT语句用途是从一个或多个表中检索信息。使用SELECT检索表数据,必须至少给出两条信息——想选择什么,以及从什么地方选择。 SELECT ... FROM ...
单个列,例如SELECT prod_name FROM products;
多个列,例如SELECT prod_id,prod_name,prod_price FROM products;
检索所有列,例如SELECT * FROM products;
不重复的列,例如SELECT DISTINCT vend_id FROM products;
返回前几行,例如 SELECT prod_name FROM products LIMIT 5;
SELECT prod_name FROM products LIMIT 3,4;
等于 SELECT prod_name FROM products LIMIT 4 OFFSET 3;
从0行开始算的,返回 3、4、5、6四行。
完全限定的名字来引用列、表,例如SELECT products.prod_name FROM mysqlcrashcourse.products;
搞定,复习排序检索数据去了。
【MySQL】SELECT语句 - 查询数据的更多相关文章
- mysql select语句查询流程是怎么样的
select查询流程是怎么样的 mysql select查询的数据是查询内存里面,如果没有查询的数据没有在内存,就需要mysql的innodb引擎读取磁盘,将数据加载的内存后在读取.这就体现了,mys ...
- php使用select语句查询数据信息
<html> <head> <title>Finding User</title> </head> <body> <h2& ...
- 使用SELECT语句检索数据
使用SELECT语句检索数据select指令适用于SQL数据库SELECT 语句用于从数据库中选取数据.(指令不分大小写,选择的值除名字和一些有特殊意义的字符可不分大小写,from结束时一定要加;) ...
- mysql SELECT语句 语法
mysql SELECT语句 语法,苏州大理石方箱 作用:用于从表中选取数据.结果被存储在一个结果表中(称为结果集). 语法:SELECT 列名称 FROM 表名称 以及 SELECT * FROM ...
- Sql Server 函数的操作实例!(返回一条Select语句查询后的临时表)
Sql Server 函数的操作实例!(返回一条Select语句查询后的临时表) SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE FUN ...
- MySQL select 语句指定字段查询
指定字段查询 SELECT 语法 SELECT [ALL | DISTINCT] {* | table.* | [table.field1[as alias1][,table.field2[as al ...
- MySQL SELECT语句
说明:MySQL的offset第一行是0 位置指的是在SELECT语句中第几个出现的字段,如:1,则代表用第一个出现的字段来分组. SELECT语句: SELECT select_expr1 [,s ...
- 2-14-1 MySQL基础语句,查询语句
一. SQL概述 结构化查询语言(Structured Query Language)简称SQL 1. 它是一种特殊目的的编程语言 2. 它还是一种数据库查询和程序设计语言 (用于存取数据以及查询.更 ...
- mysql select语句解析
select语句用于从一个或多个数据表选出特定行.特定列的交集 最简单的select语句的语法格式如下: select column1,column2 ........ (列) from 数 ...
随机推荐
- 从零开始学生信-orthofinder的安装和使用-基因家族分析
[环境变量]注释掉conda3,source ~/.bashrc conda install orthofinder # 若在上一章之后没有重启的同学请重启后操作. # 由于是刚开始搭建,这里没有给o ...
- 从0到1实战移动Web App开发
从0到1实战移动Web App开发 教程介绍 从0到1 实战webapp,通过热门的web前端技术实现移动端app应用,先基础.后实战,在讲解的同时引导思考,会抛出自己独特的观点,一行一行写代码讲 ...
- 服务器标配 SSH 协议,你了解多少?
年初,新冠肺炎疫情的出现,全国数千万名员工在家远程办公,使用个人设备通过家庭网络访问公司资料.因此,IT 安全团队面临了众多新挑战:如何实施更加安全的身份验证方案,以确保只有授权人员和设备才能访问公司 ...
- 数字crawlergo动态爬虫结合长亭XRAY被动扫描
群里师傅分享了个挖洞的视频,搜了一下,大概就是基于这篇文章录的 https://xz.aliyun.com/t/7047 (小声哔哔一下,不得不说,阿里云先知社区和360酒仙桥六号部队公众号这两个地方 ...
- java基础模拟考试三套试卷
卷1: 一.单选题(15道,共30分) //1.下列关于JDK.JRE.JVM关系描述正确的是 (A) A:JDK是开发工具,包含了JRE.JRE是运行环境,包含了JVM.JVM是虚拟机,可以保证跨平 ...
- .NET5 API 网关Ocelot+Consul服务注册
1|0网关介绍 网关其实就是将我们写好的API全部放在一个统一的地址暴露在公网,提供访问的一个入口.在 .NET Core下可以使用Ocelot来帮助我们很方便的接入API 网关.与之类似的库还有Pr ...
- Winform 去掉 最大化 最小化 关闭按钮(不是关闭按钮变灰)终极解决办法
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- Centos7安装packstack
Centos7安装packstack 步骤一 下载centos7.6 https://archive.kernel.org/centos-vault/7.6.1810/isos/x86_64/Cent ...
- Code Review 最佳实践
ref: Code review Best Practices 文章将了以下内容: 3w:why.what.when 进行 code review code review 之前的准备 执行 code ...
- 使用ajax请求上传多个或者多个附件
jsp页面 <%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML> ...