检索数据 - SELECT

阅读:156
  1. SELECT介绍

SELECT,是检索关键字,不能作为表名或者字段名。用于检索一列或者多个数据列。

2. 数据准备

2.1 建立数据库

登录MySQL客户端后,使用如下命令创建d_mall数据库。

mysql> create database d_mall;
Query OK, 1 row affected (0.00 sec)

使用d_mall该数据库:

mysql> use d_mall;
Database changed

2.2 创建表并初始化数据

我们创建t_user表,表中有5个字段,分别是id、name、age、sex、password,其中id为主键。并插入4条数据。SQL脚本如下:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `age` int(3) DEFAULT NULL,
  `sex` varchar(2) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of t_user
-- ----------------------------
BEGIN;
INSERT INTO `t_user` VALUES (1, 'zhangsan', 18, '男', 'tiger');
INSERT INTO `t_user` VALUES (2, 'lisi', 20, '女', 'lisi');
INSERT INTO `t_user` VALUES (3, 'wangwu', 30, '男', '12345678');
INSERT INTO `t_user` VALUES (4, 'zhaoliu', 80, '女', 'abc123');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

以上SQL脚本,直接复制到MySQL客户端执行即可。

执行如下命令:

mysql> show tables;
+------------------+
| Tables_in_d_mall |
+------------------+
| t_user           |
+------------------+
1 row in set (0.00 sec)

说明表创建成功。

3. 检索数据

在第一节中我们讲到SELECT为检索关键字,可以通过SELECT查询一个或者多个列数据。下面我们开始动手做实践。

3.1 检索单列数据

输入和执行如下命令:

mysql> SELECT name FROM t_user;
+----------+
| name     |
+----------+
| zhangsan |
| lisi     |
| wangwu   |
| zhaoliu  |
+----------+
4 rows in set (0.00 sec)

上面SQL是指,通过SELECT从t_user表中检索名为name的列。

SELECT后面是要检索的列,FROM关键词是指从哪张表检索数据。结果和我们预期一致。

提示:

  • 结束SQL语句。多个SQL必须以分号隔开。单条SQL,不同DBMS要求不同,有的不需要加分号,MySQL是需要用分号结束SQL。不过,任何DBMS最好加上分号,没有坏处,结构比较清晰。
  • SQL不区分大小写。SQL关键词一般程序猿喜欢用大写,便于阅读和调试。但是表名和字段名不同,是否区分大小写依赖于DBMS配置。
  • 忽略空格。SQL执行时忽略所有空格。也可以把SQL分多行。

一般把SQL分成多行,便于阅读和调试。

3.2 检索多个列

通过SELECT后跟多个列名,并用逗号隔开,其中最后一个字段后不能有逗号,检索多个列。

现在我们检索id、name、age三个列,输入并执行如下SQL:

  mysql> SELECT id, name, age FROM t_user;
  +----+----------+------+
  | id | name     | age  |
  +----+----------+------+
  |  1 | zhangsan |   18 |
  |  2 | lisi     |   20 |
  |  3 | wangwu   |   30 |
  |  4 | zhaoliu  |   80 |
  +----+----------+------+
  4 rows in set (0.00 sec)

3.3 检索所有列

通过SELECT后跟上星号(*)通配符,来检索所有的列。

输入并执行如下SQL来检索t_user表中所有的数据:

  mysql> SELECT * FROM t_user;
  +----+----------+------+------+----------+
  | id | name     | age  | sex  | password |
  +----+----------+------+------+----------+
  |  1 | zhangsan |   18 | 男   | tiger    |
  |  2 | lisi     |   20 | 女   | lisi     |
  |  3 | wangwu   |   30 | 男   | 12345678 |
  |  4 | zhaoliu  |   80 | 女   | abc123   |
  +----+----------+------+------+----------+
  4 rows in set (0.00 sec)

注意,除非需要检索所有的列,最好不要使用通配符检索所有的列,检索出不需要的列时,会降低检索性能。

3.4 去重

检索数据时,当有的列数据是重复,我们需要去除重复数据,然后输出数据。这时,通过DISTINCT关键字,放在列名前面即可。

现在我们对t_user的性别去重,输入并执行如下SQL:

  mysql> SELECT DISTINCT sex FROM t_user;
  +------+
  | sex  |
  +------+
  | 男   |
  | 女   |
  +------+
  2 rows in set (0.00 sec)

3.5 检索指定数量的列

如果表中有很多行数据,我们需要返回指定数量的行,该怎么办呢?

遗憾的是不同的数据库软件,实现方式不同,没有统一的标准。MySQL、MariaDB、􏵐PostgreSQL 或者 SQLite通过LIMIT关键字,SQL Server 和Access通过TOP关键字,Oracle需要借助ROWNUM(行计数器)来实现。

MySQL标准语法如下:

  SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

LIMIT 后可以跟上一个或两个数字参数, OFFSET(偏移量)。需要注意:

  • 参数必须是整数常量,也就是数字。
  • 如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。比如LIMIT 1, 2,返回从偏移量为1的开始,最多返回两行记录。
  • 初始记录行的偏移量是 0(而不是 1),也就是从偏移量是从0开始。
  • 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。

我们需要从t_user查询两行数据,从偏移量1开始,最多输出两行记录,输入和执行一下SQL:

  mysql> SELECT * FROM t_user LIMIT 1, 2;
  +----+--------+------+------+----------+
  | id | name   | age  | sex  | password |
  +----+--------+------+------+----------+
  |  2 | lisi   |   20 | 女   | lisi     |
  |  3 | wangwu |   30 | 男   | 12345678 |
  +----+--------+------+------+----------+
  2 rows in set (0.00 sec)

总结:

  • 查询通过SELECT关键字,FROM后通过哪个表查询数据。
  • 多个列查询SELECT后跟上多个字段,字段间用逗号隔开,最后一个字段后不能用逗号。
  • 所有字段用通配符(*)查询,不建议使用,影响性能。
  • 指定输出行数,MySQL使用LIMIT关键字,不同的DBMS实现不同。

读后有收获,请作者喝杯咖啡

全部评论

发表评论
更多精彩内容,请关注微信公众号