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