本文介绍Mysql开发中使用最频繁的功能,SELECT数据检索mysql
检索数据是从数据库中使用特定语句获取页面须要的数据。天天你上网浏览的网页,绝大部分数据都是从数据库中检索出来,因此它也是mysql最经常使用的功能之一。sql
从Mysql检索数据至少须要提供两个信息:数据库
你须要查找什么segmentfault
你须要从哪一个表中查询函数
咱们有了上面两个两个信息,咱们就能够组合成为一个最基本的查询语句:工具
SELECT name FROM my_user;
上面语句咱们从my_user
表查询了用户的名字。性能
由此咱们能够看出,最基本的查询语句是由SELECT和FROM关键字组成。SELECT后面跟着你须要查询的字段,FROM后面跟着你须要从哪一个表查询出这些数据。spa
上图的数据库表能够从本文最后附录获取。因为尚未讲解到数据排序,因此你检索出来的数据顺序和个人不同也不要惊讶。命令行
几个点说明:3d
若是在命令行执行SQL语句,那么须要使用分号结尾。
其余的状况下,Mysql不要求必定加上分号结尾,可是咱们建议加上分号结尾。
Mysql不区分大小写,实际开发中习惯将关键字大写,其余小写。好比SELECT、FROM
部分版本的Mysql中(好比4.1及以前的版本)数据库名、表名、字段名区分大小写。建议养成大小写一致的习惯。
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;
数据库是能够存放千万条数据的地方,可是咱们每次检索不可能将这么多数据。好比咱们只须要前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;
咱们将上面的例子填写完整,发现结果彻底同样。
说明:
LIMIT后面的第一个数字为从第几条开始检索。第一条为0,搞开发的都知道。
LIMIT后面第二个数字为本次检索记录的条数。
当从首行记录开始检索时候,能够省略第一个数字,只写一个记录数。
代码写多了,你就会发现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
比较大的被排到了前面。
注意:
ORDER BY 后面的关键字DESC或者ASC必须跟在每个字段后面,来表示当前字段的排序。
在Mysql的默认行为中,文本a和A开头的字符具备相同的排序优先级。可是也能够经过数据库设置来修改该行为。
若是在须要使用LIMIT的语句中也使用了ORDER BY关键字,那么LIMIT应该放在ORDER BY以后,不然数据库会报错。
数据库通常都包含大量数据,可是每每咱们都不须要一次检索出所有,也不会说只用LIMIT来限制。咱们一般会有针对性的筛选须要的数据,好比年龄为25岁的全部用户。这时候就须要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;
SELECT * FROM my_user WHERE age BETWEEN 19 AND 22;
BETWEEN
关键字后面须要跟上2个数值,表示一个范围,两个数值之间使用AND
分割。
BETWEEN
后面的两个数值检索出来的范围包含这两个数值。好比咱们BETWEEN 19 AND 22
就是1九、20、2一、22均可以
上面的例子中,咱们WHERE
后面值跟了一个条件。其实,WHERE
后面容许跟随多个条件,他们容许用AND
或者OR
进行链接。
and
表示而且的关系。
SELECT * FROM my_user WHERE age = 25 AND user_id = 4;
上面的例子中咱们使用and
链接了两个条件age=25
和user_id=4
。它的意思是年龄为25岁的用户,而且用户ID为4的用户。
以前咱们查询age=25
的时候有两条记录,可是咱们and
了一个条件,结果变为了一个。因此,and是缩小范围。
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
关键字很是有意思。他包含一个括号,像一个函数。在括号里面你能够写上使用逗号分割的数值,只要数值与括号内的匹配,那么就符合条件。
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:
IN操做符的语法更加简洁,SQL语句长度缩短,不容易出错。
计算的优先级更加容易看出,不用考虑OR和AND那些关系
IN操做符执行速度快于OR
IN还能够结合子查询使用,动态的生成查询值(后续文章中会说到子查询)
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