[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的复杂查询部分会在后面的文章中介绍。