MySQL必知必会(2):数据检索(SELECT)

本文介绍Mysql开发中使用最频繁的功能,SELECT数据检索mysql

简介

检索数据是从数据库中使用特定语句获取页面须要的数据。天天你上网浏览的网页,绝大部分数据都是从数据库中检索出来,因此它也是mysql最经常使用的功能之一。sql

从Mysql检索数据至少须要提供两个信息:数据库

  1. 你须要查找什么segmentfault

  2. 你须要从哪一个表中查询函数

检索数据

单列检索

咱们有了上面两个两个信息,咱们就能够组合成为一个最基本的查询语句:工具

SELECT name FROM my_user;

上面语句咱们从my_user表查询了用户的名字。性能

由此咱们能够看出,最基本的查询语句是由SELECT和FROM关键字组成。SELECT后面跟着你须要查询的字段,FROM后面跟着你须要从哪一个表查询出这些数据。spa

图片描述

上图的数据库表能够从本文最后附录获取。因为尚未讲解到数据排序,因此你检索出来的数据顺序和个人不同也不要惊讶。命令行

几个点说明:3d

  1. 若是在命令行执行SQL语句,那么须要使用分号结尾。

  2. 其余的状况下,Mysql不要求必定加上分号结尾,可是咱们建议加上分号结尾。

  3. Mysql不区分大小写,实际开发中习惯将关键字大写,其余小写。好比SELECT、FROM

  4. 部分版本的Mysql中(好比4.1及以前的版本)数据库名、表名、字段名区分大小写。建议养成大小写一致的习惯。

  5. Mysql默认会将多个空格合并成一个空格,因此为了便于阅读,通常会将较长SQL语句换行书写

多列检索

多列检索相似于上面一个例子,只不过查询的字段变成了多个。多个字段之间使用英文逗号分隔:

SELECT name,age,code FROM my_user;

这一次咱们检索了3个字段。记住,只能是字段之间使用逗号分隔,最后一个字段(这里是code)以后不能有逗号,不然Mysql会报错。

图片描述

检索所有字段

除了一个个的写出须要检索的字段外,Mysql还提供了一个星号*表明检索全部字段:

SELECT * FROM my_user;

图片描述

能够看到所有的字段信息都被检索了出来,少写了很多单词。这种方法十分简单,并且能够检索出数据库中你可能不知道存在的字段,在某些状况下十分有用。

可是,开发中建议不要使用这种方式检索。缘由就是会致使数据库检索性能降低。因为,检索出来的全部数据都会放在内存。因此,当你只须要好比文章标题时候,你也检索出文章内容。内存就会被文章内容严重消耗。

咱们建议,须要什么字段就检索什么字段,少用星号检索所有字段。

去除重复记录

以前使用的例子中共有5个用户,其中25岁的用户有两个,小黄和小颖。假设咱们如今只想看看用户的年龄层次,每一个年龄只能出现一次。

按照以前方法查询

SELECT age FROM my_user;

咱们会获得5条记录,2次出现25.可是咱们并不须要重复的25.Mysql提供了一个去除重复记录的关键字DISTINCT,只要将它加在检索的字段前面,便可去除重复记录。

SELECT DISTINCT age FROM my_user;

图片描述

上图结果中25只出现了一次。可是这种方法只能用在一个字段时候,若是咱们添加一个查询字段name那么,依然会显示全部的结果。

SELECT DISTINCT age,`name` FROM my_user;

图片描述

LIMIT限制记录数量

数据库是能够存放千万条数据的地方,可是咱们每次检索不可能将这么多数据。好比咱们只须要前20条,或者须要第10条到第30条数据。这时,就须要LIMIT关键字做检索记录条数限制。

SELECT age,`name` FROM my_user LIMIT 2;

图片描述

上面例子中,咱们在以前SQL语句后面添加了一个LIMIT 2,检索出来的记录数量由5条变为了2条。

咱们更改一下LIMIT后面的数值

SELECT age,`name` FROM my_user LIMIT 10;

图片描述

这一次咱们改成了10,而咱们只有5条记录,因此只显示了5条。因而可知,LIMIT后面的数字表明的是不超过数值的记录数。

其实上面的写法是一种简写,LIMIT后面正常是2个数字。

SELECT age,`name` FROM my_user LIMIT 0,2;

图片描述

咱们将上面的例子填写完整,发现结果彻底同样。

说明:

  1. LIMIT后面的第一个数字为从第几条开始检索。第一条为0,搞开发的都知道。

  2. LIMIT后面第二个数字为本次检索记录的条数。

  3. 当从首行记录开始检索时候,能够省略第一个数字,只写一个记录数。

代码写多了,你就会发现LIMIT n,m这种状况特别容易混淆两个数字的含义。因此,在Mysql 5版本以后,支持另一种更为清晰的写法:

LIMIT 4 OFFSET 3 // 表示从行3处取4行数据,至关于LIMIT 3,4

数据排序

数据排序在数据检索中很是经常使用。打个比方,你写博客,在数据库中插入的顺序是最早写的在最后一行。可是咱们想获得的列表是,最早写的排在第一行,这样咱们就须要将列表倒过来,也就是倒序。固然还有正序。

单字段排序

排序,使用关键字ORDER BY。可是,这里必需要有一个参照的关键字,好比你想文章按照写的顺序倒序。你能够按照文章建立时间倒序,时间大的在前。这里的时间就被成为排序依照字段。

咱们没有文章表,仍是拿上面的例子:

SELECT age,`name` FROM my_user ORDER BY age DESC

这条语句的意思是将用户按照年龄从大到小的顺序检索出来。

图片描述

咱们看下结果,较上面结果发生了顺序变化,年龄从大到小。其中的age就是排序的依照字段,最后一个关键字DESC表示他前面的age按照倒序排列。

正序排列就是ORDER BY age ASC,其中默认就是ASC,因此能够不写。

多字段排序

上面例子检索出来结果咱们看到,在前面有两个25岁的用户。他们年龄都是25,可是我如今想让小颖在第一个。这里就涉及到了多字段排序。

多字段排序也就是屡次排序,其中第一个字段优先级最高,若是第一个字段出现重复,则使用第二个字段排序。

SELECT user_id,age,`name` FROM my_user ORDER BY age DESC,user_id DESC

这一次咱们添加了一个排序字段user_id,而且使用倒序。为了显示清楚,咱们把user_id字段也检索出来。此次发现小颖被排到了第一个。

Mysql执行的流程是:首先使用age排序,可是发现小黄和小颖age重复,因此使用第二个字段继续排序。第二个字段为user_id DESC因此user_id比较大的被排到了前面。

注意

  1. ORDER BY 后面的关键字DESC或者ASC必须跟在每个字段后面,来表示当前字段的排序。

  2. 在Mysql的默认行为中,文本a和A开头的字符具备相同的排序优先级。可是也能够经过数据库设置来修改该行为。

  3. 若是在须要使用LIMIT的语句中也使用了ORDER BY关键字,那么LIMIT应该放在ORDER BY以后,不然数据库会报错。

条件检索

数据库通常都包含大量数据,可是每每咱们都不须要一次检索出所有,也不会说只用LIMIT来限制。咱们一般会有针对性的筛选须要的数据,好比年龄为25岁的全部用户。这时候就须要WHERE筛选数据,给出的搜索条件也被称为过滤条件。

WHERE子句

在Mysql,咱们能够在FROM关键字以后给出WHERE关键字来筛选数据:

SELECT * FROM my_user WHERE age=25;

这条SQL咱们检索出了全部年龄为25岁的用户。咱们使用了age=25,固然Mysql还能够执行更多的功能,好比大于、小于等等,看下面一个知识点。

注意:若是在SQL语句中须要使用WHERE和ORDER BY,请将ORDER BY放到WHERE以后,不然会报错

操做符

上面咱们仅仅演示了age=25的状况,其实Mysql还支持更多的操做符(上个例子中的=号就是操做符)

操做符 说明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
BETWEEN 指定的两个值之间

下面咱们拿以前的用户表演示一下

全部数据

SELECT * FROM my_user;

图片描述

不等于

SELECT * FROM my_user WHERE age <> 25;
SELECT * FROM my_user WHERE age != 25; // 这两个结果同样

图片描述

小于

此次咱们改成了小于20

SELECT * FROM my_user WHERE age < 20;

图片描述

小于等于

SELECT * FROM my_user WHERE age <= 20;

图片描述

大于

SELECT * FROM my_user WHERE age > 20;

图片描述

大于等于

SELECT * FROM my_user WHERE age >= 20;

图片描述

BETWEEN

SELECT * FROM my_user WHERE age BETWEEN 19 AND 22;

图片描述

  1. BETWEEN关键字后面须要跟上2个数值,表示一个范围,两个数值之间使用AND分割。

  2. BETWEEN后面的两个数值检索出来的范围包含这两个数值。好比咱们BETWEEN 19 AND 22就是1九、20、2一、22均可以

组合查询

上面的例子中,咱们WHERE后面值跟了一个条件。其实,WHERE后面容许跟随多个条件,他们容许用AND或者OR进行链接。

AND

and表示而且的关系。

SELECT * FROM my_user WHERE age = 25 AND user_id = 4;

上面的例子中咱们使用and链接了两个条件age=25user_id=4。它的意思是年龄为25岁的用户,而且用户ID为4的用户。

以前咱们查询age=25的时候有两条记录,可是咱们and了一个条件,结果变为了一个。因此,and是缩小范围。

OR

or表示或者的关系。

SELECT * FROM my_user WHERE age = 25 OR user_id = 1;

图片描述

此次咱们查询年龄为25岁,或者用户ID为1的用户。因此年龄为25岁,或者用户ID等于1的用户都会被检索出来,哪怕年龄不为25岁。

因此能够看出or关键字连接的语句,可能会放大查询的范围。

计算优先级

首先查看一个例子

SELECT * FROM my_user WHERE age = 25 OR user_id = 1 AND user_id > 3;

按照正常的思惟理解,咱们先获取到了年龄等于25岁的,或者用户ID为1的用户:

咱们应该获得以下结果:

图片描述

再加上用户ID大于3的条件,咱们应该获得用户ID为4的用户小颖的信息。而,实际操做中咱们发现结果并非一条,而是两条:

图片描述

咱们再次使用括号将前面两个条件括起来,执行一次:

SELECT * FROM my_user WHERE (age = 25 OR user_id = 1) AND user_id > 3;

图片描述

获得了咱们想要的答案(尽管没啥意义)。

第一条语句产生错误的结果是优先级不一样。AND的优先级高于OR优先级。因此第一条语句中Mysql是先计算了user_id = 1 AND user_id > 3这个条件没有获得任何的数据。加上后面的or age =25.因此最后结果就只剩下年龄为25岁的用户记录了。

因此,在实际开发中,遇到OR和AND并存的状况必定要注意是否会应为优先级影响结果。使用圆括号能够改变Mysql计算的优先级,必定要慎重。

IN

IN关键字很是有意思。他包含一个括号,像一个函数。在括号里面你能够写上使用逗号分割的数值,只要数值与括号内的匹配,那么就符合条件。

SELECT * FROM my_user WHERE age IN(25,20);

图片描述

咱们使用上面的语句检索出了年龄等于20或者25岁的用户。并且IN还能够和OR关键字互相替换。好比上面的IN语句能够转换为:

SELECT * FROM my_user WHERE age =20 OR age =25;

可是为啥仍是要用IN:

  1. IN操做符的语法更加简洁,SQL语句长度缩短,不容易出错。

  2. 计算的优先级更加容易看出,不用考虑OR和AND那些关系

  3. IN操做符执行速度快于OR

  4. IN还能够结合子查询使用,动态的生成查询值(后续文章中会说到子查询)

NOT

not操做符就只有一个功能,否认后面跟的条件。

SELECT * FROM my_user WHERE age NOT IN(20,25);

图片描述

结果是否是和刚刚反了过来。

附录

建立my_user表的语句:

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for my_user
-- ----------------------------
DROP TABLE IF EXISTS `my_user`;
CREATE TABLE `my_user` (
  `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  `age` tinyint(2) NOT NULL DEFAULT '0',
  `password` varchar(40) NOT NULL,
  `code` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of my_user
-- ----------------------------
INSERT INTO `my_user` VALUES ('1', '小红', '20', '7c4a8d09ca3762af61e59520943dc26494f8941b', '2arfs5dr6m');
INSERT INTO `my_user` VALUES ('2', '小明', '19', '7c4a8d09ca3762af61e59520943dc26494f8941b', 'd59tg6dr5h');
INSERT INTO `my_user` VALUES ('3', '小黄', '25', '7c4a8d09ca3762af61e59520943dc26494f8941b', 'w56tg9hjn3');
INSERT INTO `my_user` VALUES ('4', '小颖', '25', '7c4a8d09ca3762af61e59520943dc26494f8941b', 'a5d23e9yh5');
INSERT INTO `my_user` VALUES ('5', '星空幻颖', '22', '7c4a8d09ca3762af61e59520943dc26494f8941b', '86d2sadft9');

图片所示的软件工具是navicat,更多的 数据库管理软件,百度:笔点资源:发现更多开发干货集合资源

图片描述

星空幻颖,严颖

我的主页:segmentfault

相关文章
相关标签/搜索