前言
本节比较重要,对数据表数据进行查询操作,其中可能大家不熟悉的就对于INNER JOIN(内连接)、LEFT JOIN(左连接)、RIGHT JOIN(右连接)等一些复杂查询。 通过本节的学习,可以让你知道这些基本的复杂查询是怎么实现的,但是建议还是需要多动手去敲,虽然理解了什么是内连接等,但是从理解到学会,是完全不一样的感觉。总结了一张MYSQL知识图谱分享给大家:
一、单表查询
创建查询环境
CREATE TABLE fruits(
f_id CHAR(10) NOT NULL,
s_id INT NOT NULL,
f_name char(255) NOT NULL,
f_price DECIMAL(8,2) NOT NULL,
PRIMARY KEY(f_id)
);
解释:
f_id:主键 使用的是CHAR类型的字符来代表主键
s_id:这个其实是批发商的编号,也就是代表该水果是从哪个批发商那里过来的,写这个字段的目的是为了方便后面扩增表。
f_name:水果的名字
f_price:水果的价格,使用的是DECIMAL这个数据类型,如果不清楚这个类型去查看一下上面一篇讲解数据类型的文章。
添加数据。
INSERT INTO fruits(f_id,s_id,f_name,f_price) VALUES
(‘a1’ , 101 , ‘apple’ , 5.2),
(‘b1’ , 101 , ‘blackberry’ , 10.2),
(‘bs1’ , 102 , ‘orange’ , 11.2),
(‘bs2’ , 105 , ‘melon’ , 8.2),
(‘t1’ , 102 , ‘banana’ , 10.3),
(‘t2’ , 102 , ‘grape’ , 5.3),
(‘o2’ , 103 , ‘coconut’ , 9.2),
(‘c0’ , 101 , ‘cherry’ , 3.2),
(‘a2’ , 103 , ‘apricot’ , 2.2),
(‘l2’ , 104 , ‘lemon’ , 6.4),
(‘b2’ , 104 , ‘berry’ , 7.6),
(‘m1’ , 106, ‘mango’ , 15.6),
(‘m2’ , 105 , ‘xbabay’ , 2.6),
(‘t4’ , 107, ‘xbababa’ , 3.6),
(‘m3’ , 105 , ‘xxtt’ , 11.6),
(‘b5’ , 107, ‘xxxx’ , 3.6 );
blackberry:黑莓 melon:甜瓜 grape:葡萄 coconut:椰子 cherry:樱桃 apricot:杏子 berry:浆果 mango:芒果 后面几个xbabay都是为了测试所编写的,没有实际意义。
注意:在复制我的代码到cmd窗口时,应注意语句之间不能有空格,不然会报错,我这里是为了使你们观看更清楚,所以每行前面度加有空格,
1.1、查询所有字段
SELECT * FROM fruits;
解释:* 代表所有字段,也就是从表中将所有字段下面的记录度查询出来
1.2、查询指定字段
查询f_name 和 f_price 字段的记录
SELECT f_name, f_price FROM fruits;
1.3、查询指定记录
指定记录:也就是按条件进行查询,将满足一定条件的记录给查询出来,使用WHERE关键字
SELECT * FROM fruits WHERE f_name = ‘apple’; //将名为apple的记录的所有信息度查询出来
SELECT * FROM fruits WHERE f_price > 15; //将价格大于15的记录的所有字段 查询出来
1.4、带IN关键字的查询
IN关键字:IN(xx,yy,…) 满足条件范围内的一个值即为匹配项
SELECT * FROM fruits WHERE f_name IN(‘apple’,‘orange’);
SELECT * FROM fruits WHERE s_id IN(101, 105); //s_id 为101 或者 105 的记录
SELECT * FROM fruits WHERE s_id NOT IN(101,105); //s_id 不为101或者105的记录
1.5、带BETWEEN AND 的范围查询
BETWEEN … AND … : 在…到…范围内的值即为匹配项,
SELECT * FROM fruits WHERE f_price BETWEEN 5 AND 15; //f_price 在5到15之间,包括5和15。
SELECT * FROM fruits WHERE f_price NOT BETWEEN 5 AND 15; //f_price 不在5到15之间。
1.6、带LIKE的字符匹配查询
LIKE: 相当于模糊查询,和LIKE一起使用的通配符有 “%”、"_"
“%”:作用是能匹配任意长度的字符。
“_”:只能匹配任意一个字符
SELECT * FROM fruits WHERE f_name LIKE ‘b%’; //f_name以b字母开头的所有记录
SELECT * FROM fruits WHERE f_name LIKE ‘b%y’; //f_name以b字母开头,y字母结尾的所有记录
SELECT * FROM fruits WHERE f_name LIKE '___y’; //此处有四个,说明要查询以y字母结尾并且y之前只有四个字符的记录
总结:’%‘和’_'可以在任意位置使用,只需要记住%能够表示任意个字符,_只能表示一个任意字符
1.7、查询空值
空值不是指为空字符串""或者0,一般表示数据未知或者在以后在添加数据,也就是在添加数据时,其字段上默认为NULL,也就是说,如果该字段上不插入任何值,就为NULL。此时就可以查询出来。
SELECT * FROM 表名 WHERE 字段名 IS NULL; //查询字段名是NULL的记录
SELECT * FROM 表名 WHERE 字段名 IS NOT NULL; //查询字段名不是NULL的记录
这里由于没有合适的数据,就不自己在创建表,添加数据,然后来测试这条语句了,很简单,看一下就应该懂了
1.8、带AND的多条件查询
AND: 相当于"逻辑与",也就是说要同时满足条件才算匹配
SELECT * FROM fruits WHERE s_id = 101 AND f_price > 5; //同时满足s_id = 101、f_price >5 这两个条件才算匹配。
1.9、带OR的多条件查询
OR: 相当于"逻辑或",也就是说只要满足其中一个条件,就算匹配上了,跟IN关键字效果差不多
SELECT * FROM fruits WHERE s_id = 101 OR f_price > 10; //s_id =101 或者 f_price >10 ,只要符合其中一个条件,就算匹配
可以看到,查询出来的记录,f_price有低于10的,那么其肯定s_id=101,s_id不等于101的,其f_price肯定大于10,这就说明了OR的效果。只要满足其中一个条件,就算匹配。
1.10、关键字DISTINCT(查询结果不重复)
SELECT s_id FROM fruits; //查询所有的s_id,会出现很多重复的值。
使用DISTINCT就能消除重复的值
SELECT DISTINCT s_id FROM fruits;
将重复的值删除后,就只留下7条记录了。
1.11、对查询结果排序(ORDER BY)
看上面输出的值没顺序,可以给他们进行排序。使用关键字 ORDER BY,有两个值供选择 DESC 降序 、 ASC 升序(默认值)
SELECT DISTINCT s_id FROM fruits ORDER BY s_id; //默认就是升序,
SELECT DISTINCT s_id FROM fruits ORDER BY s_id DESC; //使用降序,也就是从高到底排列
1.12、分组查询(GROUP BY)
分组查询很多人不知道什么意思,一开始我也是很蒙圈的,所以没关系,一起来看看。
分组查询就是将相同的东西分到一个组里面去,现实生活中举个例子,厕所分男女,这也是一个分组的应用,在还没有分男女厕所前,大家度共用厕所,后面通过分男女性别,男的跟男的分为一组,女的和女的分为一组,就这样分为了男女厕所了。这就是分组的意思, 在上面对s_id进行查询的时候,发现很多重复的值,我们也就可以对它