[mysql基础文档]-24-select查询基础

引言

本文构建了一个练习数据表,并给出大量的select查询实例,通过这些查询实例返回的结果集,理解select的功能。

文章目录

0×1.练习数据表

本文以及后面的文章中大部分的查询实例都会用到这张练习表:

					--创建一张存放手机商品信息的数据表
					mysql> create table cellphone(
					    -> goods_id int primary key not null default 0,
					    -> goods_name varchar(100) not null default '',
					    -> cat_id int not null default 0,
					    -> sale_price decimal(9,2) not null default 0.00,
					    -> selling_price decimal(9,2) not null default 0.00 
					    -> ) engine=InnoDB charset=utf8;

					--goods_id列作为主键储存商品id,goods_name列储存商品名称,cat_id(category)储存商品类别,相同类别商品cat_id相同,sale_price是商品打折后的价格,selling_price列是商品标价
					mysql> desc cellphone;
					+---------------+--------------+------+-----+---------+-------+
					| Field         | Type         | Null | Key | Default | Extra |
					+---------------+--------------+------+-----+---------+-------+
					| goods_id      | int(11)      | NO   | PRI | 0       |       |
					| goods_name    | varchar(100) | NO   |     |         |       |
					| cat_id        | int(11)      | NO   |     | 0       |       |
					| sale_price    | decimal(9,2) | NO   |     | 0.00    |       |
					| selling_price | decimal(9,2) | NO   |     | 0.00    |       |
					+---------------+--------------+------+-----+---------+-------+

					--批量插入20台不同类型手机信息
					mysql> insert into cellphone values
					    -> (1,'hongMI2a',1,549,699),
					    -> (2,'MInote',1,1799,1999),
					    -> (3,'hongMI2',1,699,869),
					    -> (4,'MI4',1,1499,1660),
					    -> (5,'GalaxyN9200',2,5388,5988),
					    -> (6,'iPhone6A1586',3,4288,4886),
					    -> (7,'MeizuNote2',4,899,1199),
					    -> (8,'Huawei4X',5,999,1299),
					    -> (9,'GalaxyG9250',2,5288,5488),
					    -> (10,'Huawei4A',5,699,888),
					    -> (11,'MX5',4,1899,2199),
					    -> (12,'iPhone5s',3,3188,3619),
					    -> (13,'GalaxyN9109W',2,2698,2998),
					    -> (14,'MX4',4,1399,1599),
					    -> (15,'iPhone4s',3,1398,1688),
					    -> (16,'Huawei6',5,1499,1699),
					    -> (17,'iPhone6s',3,5288,5888),
					    -> (18,'MX4Pro',4,1599,1899),
					    -> (19,'GalaxyS6',2,4499,4699),
					    -> (20,'Huawei7',5,2499,2699);

					--完整表结构
					mysql> select * from cellphone;
					+----------+--------------+--------+------------+---------------+
					| goods_id | goods_name   | cat_id | sale_price | selling_price |
					+----------+--------------+--------+------------+---------------+
					|        1 | hongMI2a     |      1 |     549.00 |        699.00 |
					|        2 | MInote       |      1 |    1799.00 |       1999.00 |
					|        3 | hongMI2      |      1 |     699.00 |        869.00 |
					|        4 | MI4          |      1 |    1499.00 |       1660.00 |
					|        5 | GalaxyN9200  |      2 |    5388.00 |       5988.00 |
					|        6 | iPhone6A1586 |      3 |    4288.00 |       4886.00 |
					|        7 | MeizuNote2   |      4 |     899.00 |       1199.00 |
					|        8 | Huawei4X     |      5 |     999.00 |       1299.00 |
					|        9 | GalaxyG9250  |      2 |    5288.00 |       5488.00 |
					|       10 | Huawei4A     |      5 |     699.00 |        888.00 |
					|       11 | MX5          |      4 |    1899.00 |       2199.00 |
					|       12 | iPhone5s     |      3 |    3188.00 |       3619.00 |
					|       13 | GalaxyN9109W |      2 |    2698.00 |       2998.00 |
					|       14 | MX4          |      4 |    1399.00 |       1599.00 |
					|       15 | iPhone4s     |      3 |    1398.00 |       1688.00 |
					|       16 | Huawei6      |      5 |    1499.00 |       1699.00 |
					|       17 | iPhone6s     |      3 |    5288.00 |       5888.00 |
					|       18 | MX4Pro       |      4 |    1599.00 |       1899.00 |
					|       19 | GalaxyS6     |      2 |    4499.00 |       4699.00 |
					|       20 | Huawei7      |      5 |    2499.00 |       2699.00 |
					+----------+--------------+--------+------------+---------------+
					

0×2.select查询实例

实例1:取出goods_id为13的产品的名称

					--以前我们看到的select后面跟随的是"*"符号,星号告诉数据库,将查询结果的所有列都显示出来,在实际工作环境中很少那样做,而是指定仅显示哪几列的数据,使用逗号分割每一列
					mysql> select goods_id,goods_name from cellphone where goods_id=13;
					+----------+--------------+
					| goods_id | goods_name   |
					+----------+--------------+
					|       13 | GalaxyN9109W |
					+----------+--------------+
					

实例2:取出类型不属于1,2,5的所有商品的名称

					--如果不添加not参数,则是取出cat_id属于1,2,5这三个类别的所有商品
					mysql> select cat_id,goods_name from cellphone where cat_id not in(1,2,5);
					+--------+--------------+
					| cat_id | goods_name   |
					+--------+--------------+
					|      3 | iPhone6A1586 |
					|      4 | MeizuNote2   |
					|      4 | MX5          |
					|      3 | iPhone5s     |
					|      4 | MX4          |
					|      3 | iPhone4s     |
					|      3 | iPhone6s     |
					|      4 | MX4Pro       |
					+--------+--------------+

					--这条命令还有另外一种写法,效果相同
					mysql> select cat_id,goods_name from cellphone where cat_id!=1 and cat_id!=2 and cat_id!=5;
					

实例3:取出打折后的价格大于等于5000的商品名称

					mysql> select goods_name,sale_price from cellphone where sale_price>=5000;
					+-------------+------------+
					| goods_name  | sale_price |
					+-------------+------------+
					| GalaxyN9200 |    5388.00 |
					| GalaxyG9250 |    5288.00 |
					| iPhone6s    |    5288.00 |
					+-------------+------------+

					--如果要取出打折后价格在某个范围的所有商品,可以使用and连接符或between参数,比如取出打折后价格大于等于500且小于900的所有商品名称,有以下两种方法
					mysql> select goods_name,sale_price from cellphone where sale_price>=500 and sale_price<=900;
					+------------+------------+
					| goods_name | sale_price |
					+------------+------------+
					| hongMI2a   |     549.00 |
					| hongMI2    |     699.00 |
					| MeizuNote2 |     899.00 |
					| Huawei4A   |     699.00 |
					+------------+------------+

					--结果同上
					mysql> select goods_name,sale_price from cellphone where sale_price between 500 and 900;
					

实例4:取出打折后价格在500~800之间或价格在2000~3000之间的商品名称

					--当where后面and以及or混合出现的时候,使用括号是一个好习惯
					mysql> select goods_name,sale_price from cellphone where (sale_price>=500 and sale_price<=800) or (sale_price>=2000 and sale_price<=3000);
					+--------------+------------+
					| goods_name   | sale_price |
					+--------------+------------+
					| hongMI2a     |     549.00 |
					| hongMI2      |     699.00 |
					| Huawei4A     |     699.00 |
					| GalaxyN9109W |    2698.00 |
					| Huawei7      |    2499.00 |
					+--------------+------------+

					--或
					mysql> select goods_id,goods_name,sale_price from cellphone where (sale_price between 500 and 800) or (sale_price between 2000 and 3000);
					

实例5:取出打折后价格在900~3000之间,并且类别是1的商品名称

					--select后面的列数目可以根据要求更改,仅显示相关的列可以避免不必要的资源浪费,列显示的先后顺序可以任意调整
					mysql> select cat_id,goods_name,sale_price from cellphone where (sale_price>=900 and sale_price<=3000) and cat_id=1;
					+--------+------------+------------+
					| cat_id | goods_name | sale_price |
					+--------+------------+------------+
					|      1 | MInote     |    1799.00 |
					|      1 | MI4        |    1499.00 |
					+--------+------------+------------+

					--或
					mysql> select goods_id,goods_name,sale_price from cellphone where (sale_price between 900 and 3000) and cat_id=1;
					

实例6:取出商品名称以"MX"开头的商品名称以及产品ID

					--使用like参数,单引号中的百分号是一个通配符,表示MX后面可以有一个或者多个字符,只要匹配MX开头,就将其取出
					mysql> select goods_id,goods_name from cellphone where goods_name like 'MX%';
					+----------+------------+
					| goods_id | goods_name |
					+----------+------------+
					|       11 | MX5        |
					|       14 | MX4        |
					|       18 | MX4Pro     |
					+----------+------------+

					--如果本例是要求取出商品名称包含MX,那么like后面就应该变成'%MX%',只要字符串包含MX,MX前后单个或多个字符用通配符%代替
					

实例7:取出商品名称以"Huawei4"开头,并且后面仅包含一个字符的所有商品的名称和ID

					--下划线在like运算中可以代替任意一个字符,要包含几个任意字符就用几个下划线代替,例如like 'iPh__e%',可以匹配到iPhone开头的数据
					mysql> select goods_id,goods_name from cellphone where goods_name like 'Huawei4_';
					+----------+------------+
					| goods_id | goods_name |
					+----------+------------+
					|        8 | Huawei4X   |
					|       10 | Huawei4A   |
					+----------+------------+

					--若是要取出名称不以"iPhone"开头的商品,可以在like前面添加not参数
					mysql> select goods_id,goods_name from cellphone where goods_name not like 'iPhone%';
					

实例8:取出打折后商品价格在500~3000之间,并且商品名称以"Meizu"开头,并且商品类别是4的商品的名称,以及打折后的价格

					mysql> select cat_id,goods_name,sale_price from cellphone where (sale_price>=500 and sale_price<=3000) and (goods_name like 'Meizu%') and (cat_id=4);
					+--------+------------+------------+
					| cat_id | goods_name | sale_price |
					+--------+------------+------------+
					|      4 | MeizuNote2 |     899.00 |
					+--------+------------+------------+
					

以上8个实例,涵盖了简单select的大部分内容,并未涉及select复杂查询以及除where外的子查询技巧,select的复杂查询部分会在后面的文章中介绍。