MySQL如何实现单表查询
这篇文章给大家分享的是有关MySQL如何实现单表查询的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
单表查询指从一张表数据中查询所需的数据。
(1)查询所有字段
(2)查询指定字段
(3)查询指定记录
(4)带in关键字的查询
(5)带between and的范围的查询
(6)带like的字符匹配查询
(7)查询空值
(8)带and的多条件查询
(9)带or的多条件查询
(10)查询结果不重复
(11)对查询结果排序
(12)分组查询
(13)使用limit限制查询结果的数量
(1)查询所有字段
1.select * from fruits
2.select f_id,s_id,f_name,f_price from fruits;
上面两个语句执行后的结果都是查询所有字段:
mysql>select*fromfruits;+------+------+------------+---------+|f_id|s_id|f_name|f_price|+------+------+------------+---------+|12|104|lemon|6.40||a1|101|apple|5.20||a2|103|apricot|2.20||b1|101|blackberry|10.20||b2|104|berry|7.60||b5|107|xxxx|3.60||bs1|102|orange|11.20||bs2|105|melon|8.20||c0|101|cherry|3.20||m1|106|mango|15.70||m2|105|xbabay|2.60||m3|105|xxtt|11.60||o2|103|coconut|9.20||t1|102|banana|10.30||t2|102|grape|5.30||t4|107|xbabay|3.60|+------+------+------------+---------+16rowsinset(0.00sec)(2)查询指定字段
1.查询单个字段:select 列名 from 表名;
【例】查询fruits表中f_name列所有水果名称,SQL语句如下:
mysql>selectf_namefromfruits;+------------+|f_name|+------------+|lemon||apple||apricot||blackberry||berry||xxxx||orange||melon||cherry||mango||xbabay||xxtt||coconut||banana||grape||xbabay|+------------+16rowsinset(0.00sec)
2.查询多个字段:select 字段名1,字段名2,...字段名n from 表名;
【例】从fruits表中获取名称为f_name和f_price两列,SQL语句如下:
mysql>selectf_name,f_pricefromfruits;+------------+---------+|f_name|f_price|+------------+---------+|lemon|6.40||apple|5.20||apricot|2.20||blackberry|10.20||berry|7.60||xxxx|3.60||orange|11.20||melon|8.20||cherry|3.20||mango|15.70||xbabay|2.60||xxtt|11.60||coconut|9.20||banana|10.30||grape|5.30||xbabay|3.60|+------------+---------+16rowsinset(0.00sec)(3)查询指定记录
select字段名1,字段名2,。。。,字段名nfrom表名where查询条件
【例1】查询价格为10.2元的水果名称,SQL语句如下:
mysql>selectf_name,f_price->fromfruits->wheref_price=10.2;+------------+---------+|f_name|f_price|+------------+---------+|blackberry|10.20|+------------+---------+1rowinset(0.00sec)
【例2】查找名称为"apple"的水果价格,SQL语句如下:
mysql>selectf_name,f_price->fromfruits->wheref_name='apple';+--------+---------+|f_name|f_price|+--------+---------+|apple|5.20|+--------+---------+1rowinset(0.00sec)
【例3】查询价格小于10的水果名称,SQL语句如下:
mysql>selectf_name,f_price->fromfruits->wheref_price<10.00;+---------+---------+|f_name|f_price|+---------+---------+|lemon|6.40||apple|5.20||apricot|2.20||berry|7.60||xxxx|3.60||melon|8.20||cherry|3.20||xbabay|2.60||coconut|9.20||grape|5.30||xbabay|3.60|+---------+---------+11rowsinset(0.00sec)(4)带in关键字的查询
in操作符用来查询满足指定范围内的条件的记录,使用in操作符,将所有检索条件用括号括起来,检索条件之间用逗号分隔开,只要满足条件范围内的一个值即为匹配项。
【例1】s_id为101和102的记录,SQL语句如下;
mysql>selects_id,f_name,f_price->fromfruits->wheres_idin(101,102)->orderbyf_name;+------+------------+---------+|s_id|f_name|f_price|+------+------------+---------+|101|apple|5.20||102|banana|10.30||101|blackberry|10.20||101|cherry|3.20||102|grape|5.30||102|orange|11.20|+------+------------+---------+6rowsinset(0.00sec)
【例2】查询所有s_id既不等于101也不等于102的记录,SQL语句如下:
mysql>selects_id,f_name,f_price->fromfruits->wheres_idnotin(101,102)->orderbyf_name;+------+---------+---------+|s_id|f_name|f_price|+------+---------+---------+|103|apricot|2.20||104|berry|7.60||103|coconut|9.20||104|lemon|6.40||106|mango|15.70||105|melon|8.20||105|xbabay|2.60||107|xbabay|3.60||105|xxtt|11.60||107|xxxx|3.60|+------+---------+---------+10rowsinset(0.00sec)(5)带between and的范围的查询
between and 用来查询某个范围内的值,该操作符需要两个参数,即范围的开始值和结束值。
【例1】查询价格在2.00元到10.20元之间的水果名称和价格,SQL语句如下:
mysql>selectf_name,f_pricefromfruitswheref_pricebetween2.00and10.20;+------------+---------+|f_name|f_price|+------------+---------+|lemon|6.40||apple|5.20||apricot|2.20||blackberry|10.20||berry|7.60||xxxx|3.60||melon|8.20||cherry|3.20||xbabay|2.60||coconut|9.20||grape|5.30||xbabay|3.60|+------------+---------+12rowsinset(0.00sec)
【例2】查询价格在2.00元到10.20元之外的水果名称和价格,SQL语句如下;
mysql>selectf_name,f_price->fromfruits->wheref_pricenotbetween2.00and10.20;+--------+---------+|f_name|f_price|+--------+---------+|orange|11.20||mango|15.70||xxtt|11.60||banana|10.30|+--------+---------+4rowsinset(0.00sec)(6)带like的字符匹配查询
1.%通配符,匹配任意长度的字符,甚至包括零字符。
【例1】查找所有以"b"字母开头的水果,SQL语句如下:
mysql>selectf_id,f_name->fromfruits->wheref_namelike'b%';+------+------------+|f_id|f_name|+------+------------+|b1|blackberry||b2|berry||t1|banana|+------+------------+3rowsinset(0.00sec)
【例2】在fruits表中,查询f_name中包含字母"g"的记录,SQL语句如下:
mysql>selectf_id,f_name->fromfruits->wheref_namelike'%g%';+------+--------+|f_id|f_name|+------+--------+|bs1|orange||m1|mango||t2|grape|+------+--------+3rowsinset(0.00sec)
【例3】查询以"b"开头,并以‘y’结尾的水果的名称,SQL语句如下:
mysql>selectf_id,f_name->fromfruits->wheref_namelike'b%y';+------+------------+|f_id|f_name|+------+------------+|b1|blackberry||b2|berry|+------+------------+2rowsinset(0.00sec)
2._通配符,一次只能匹配任意一个字符。
【例】在fruits表中,查询以字母‘y’结尾,且‘y’前面只有4个字母的记录,SQL语句如下:
mysql>selectf_id,f_name->fromfruits->wheref_namelike'____y';+------+--------+|f_id|f_name|+------+--------+|b2|berry|+------+--------+1rowinset(0.00sec)(7)查询空值
数据表创建时,可以指定某列中是否可以包含空值null。空值不同于0,也不同于空字符串。空值一般表示数据位置、不使用或将在以后添加数据。在select语句中使用is null子句,可以查询某字段内容为空记录。
下面创建数据表customers来演示:
createtablecustomers(c_idintnotnullauto_increment,c_namechar(50)notnull,c_addresschar(50)null,c_citychar(50)null,c_zipchar(10)null,c_contactchar(50)null,c_emailchar(255)null,primarykey(c_id));
插入下列语句:
mysql>insertintocustomers(c_id,c_name,c_address,c_city,c_zip,c_contact,c_email)->values->(10001,'redhool','200Street','Tianjin','300000','LiMing','LMing@163.com'),->(10002,'Stars','333FromageLane','Dalian','116000','Zhangbo','Jerry@hotmail.com'),->(10003,'Netbhood','1SunnyPlace','Qingdao','266000','LuoCong',null),->(10004,'JOTO','829RiversideDrive','Haikou','570000','YangShan','sam@hotmail.com');QueryOK,4rowsaffected(0.06sec)Records:4Duplicates:0Warnings:0
【例1】查询customers表中c_email为空的记录的c_id、c_name和c_email字段值,SQL语句如下:
mysql>selectc_id,c_name,c_emailfromcustomerswherec_emailisnull;+-------+----------+---------+|c_id|c_name|c_email|+-------+----------+---------+|10003|Netbhood|NULL|+-------+----------+---------+1rowinset(0.00sec)
【例2】查询customers表中c_email不为空的记录的c_id、c_name、和c_email字段值,SQL语句如下:
mysql>selectc_id,c_name,c_email->fromcustomers->wherec_emailisnotnull;+-------+---------+-------------------+|c_id|c_name|c_email|+-------+---------+-------------------+|10001|redhool|LMing@163.com||10002|Stars|Jerry@hotmail.com||10004|JOTO|sam@hotmail.com|+-------+---------+-------------------+3rowsinset(0.00sec)(8)带and的多条件查询
【例1】在fruits表中查询s_id=101,且f_price大于5的水果的价格和名称,SQL语句如下:
mysql>selectf_id,f_price,f_name->fromfruits->wheres_id='101'andf_price>=5;+------+---------+------------+|f_id|f_price|f_name|+------+---------+------------+|a1|5.20|apple||b1|10.20|blackberry|+------+---------+------------+2rowsinset(0.00sec)
【例2】在fruits表中查询s_id=101或者102,且f_price大于5,且f_name='apple’的水果价格和名称,SQL语句如下:
mysql>selectf_id,f_price,f_name->fromfruits->wheres_idin('101','102')andf_price>=5andf_name='apple';+------+---------+--------+|f_id|f_price|f_name|+------+---------+--------+|a1|5.20|apple|+------+---------+--------+1rowinset(0.05sec)(9)带or的多条件查询
【例1】查询s_id=101或者s_id=102的水果供应商的f_price和f_name,SQL语句如下:
mysql>selects_id,f_name,f_price->fromfruits->wheres_id=101ors_id=102;+------+------------+---------+|s_id|f_name|f_price|+------+------------+---------+|101|apple|5.20||101|blackberry|10.20||102|orange|11.20||101|cherry|3.20||102|banana|10.30||102|grape|5.30|+------+------------+---------+6rowsinset(0.00sec)
【例2】查询s_id=101或者s_id=102的水果供应商的f_price和f_name,SQL语句如下:
mysql>selects_id,f_name,f_price->fromfruits->wheres_idin(101,102);+------+------------+---------+|s_id|f_name|f_price|+------+------------+---------+|101|apple|5.20||101|blackberry|10.20||102|orange|11.20||101|cherry|3.20||102|banana|10.30||102|grape|5.30|+------+------------+---------+6rowsinset(0.00sec
注意
or可以和and一起使用,但是要注意两者的优先级,由于and的优先级高于or,旖旎次先对and两边的操作数进行操作,再与or中的操作数结合。
语法格式:select distinct 字段名 from 表名;
【例】查询fruits表中s_id字段的值,返回s_id字段值且不得重复,SQL语句如下;
mysql>selectdistincts_idfromfruits;+------+|s_id|+------+|104||101||103||107||102||105||106|+------+7rowsinset(0.05sec)(11)对查询结果排序
1.单列排序order by
【例】查询fruits表的f_name字段值,并对其进行排序,SQL语句如下:
mysql>selectf_namefromfruitsorderbyf_name;+------------+|f_name|+------------+|apple||apricot||banana||berry||blackberry||cherry||coconut||grape||lemon||mango||melon||orange||xbabay||xbabay||xxtt||xxxx|+------------+16rowsinset(0.00sec)
2.多列排序
多列排序首先排序的第一列必须有相同的列值,才会对第二列进行排序。如果第一列数据中所有值都是唯一的,将不再对第二列进行排序。
【例】查询fruits表中的f_name和f_price字段,先按f_name排序,再按f_price排序,SQL语句如下:
mysql>selectf_name,f_price->fromfruits->orderbyf_name,f_price;+------------+---------+|f_name|f_price|+------------+---------+|apple|5.20||apricot|2.20||banana|10.30||berry|7.60||blackberry|10.20||cherry|3.20||coconut|9.20||grape|5.30||lemon|6.40||mango|15.70||melon|8.20||orange|11.20||xbabay|2.60||xbabay|3.60||xxtt|11.60||xxxx|3.60|+------------+---------+16rowsinset(0.00sec)
3.指定排序方向desc
desc是降序排列,与之对应的是asc升序排列,但asc是默认的,可以不加。
【例1】查询fruits表中的f_name和f_price字段,对结果按f_price降序方式排序,SQL语句如下:
mysql>selectf_name,f_price->fromfruits->orderbyf_pricedesc;+------------+---------+|f_name|f_price|+------------+---------+|mango|15.70||xxtt|11.60||orange|11.20||banana|10.30||blackberry|10.20||coconut|9.20||melon|8.20||berry|7.60||lemon|6.40||grape|5.30||apple|5.20||xxxx|3.60||xbabay|3.60||cherry|3.20||xbabay|2.60||apricot|2.20|+------------+---------+16rowsinset(0.00sec)
【例2】查询fruits表,先按f_price降序排序,再按f_name字段升序排序,SQL语句如下:
mysql>selectf_price,f_name->fromfruits->orderbyf_pricedesc,f_name;+---------+------------+|f_price|f_name|+---------+------------+|15.70|mango||11.60|xxtt||11.20|orange||10.30|banana||10.20|blackberry||9.20|coconut||8.20|melon||7.60|berry||6.40|lemon||5.30|grape||5.20|apple||3.60|xbabay||3.60|xxxx||3.20|cherry||2.60|xbabay||2.20|apricot|+---------+------------+16rowsinset(0.00sec)(12)分组查询
分组查询是对数据按照某个或多个字段进行分组,MySQL中使用group by 关键字对数据进行分组,基本语法形式为:[group by 字段][having<条件表达式>]
字段值为进行分组时所依据的列名称,"having<条件表达式>"指定满足表达式限定条件的结果将被显示。
1.创建分组
【例1】根据s_id对fruits表中的数据进行分组,SQL语句如下;
mysql>selects_id,count(*)astotal->fromfruits->groupbys_id;+------+-------+|s_id|total|+------+-------+|104|2||101|3||103|2||107|2||102|3||105|3||106|1|+------+-------+7rowsinset(0.05sec)
可以看到group by 子句按照s_id排序并对数据分组。
如果需要查看每个供应商提供的水果种类名称,可以在group by子句中使用group_concat()函数,将每个分组中各个字段的值显示出来。
【例2】根据s_id对fruits表中的数据进行分组,将每个供应商的水果名称显示出来,SQL语句如下:
mysql>selects_id,group_concat(f_name)asNames->fromfruits->groupbys_id;+------+-------------------------+|s_id|Names|+------+-------------------------+|101|apple,blackberry,cherry||102|orange,banana,grape||103|apricot,coconut||104|lemon,berry||105|melon,xbabay,xxtt||106|mango||107|xxxx,xbabay|+------+-------------------------+7rowsinset(0.05sec)
2.使用having过滤分组
groub by可以和having一起限定显示记录所需满足的条件,只有满足条件的分组才会被显示。
having和where都是用来过滤数据的,having在数据分组之后进行过滤来选择分组,而where在分组之前用来选择记录。where排除的记录不再包括在分组中。
【例】根据s_id对fruits表中的数据进行分组,并显示水果种类大于1的分组信息,SQL语句如下:
mysql>selects_id,group_concat(f_name)asNames->fromfruits->groupbys_idhavingcount(f_name)>1;+------+-------------------------+|s_id|Names|+------+-------------------------+|101|apple,blackberry,cherry||102|orange,banana,grape||103|apricot,coconut||104|lemon,berry||105|melon,xbabay,xxtt||107|xxxx,xbabay|+------+-------------------------+6rowsinset(0.00sec)
3.在group by 子句中使用with rollup
使用with rolluo关键字之后,在所有查询出的分组记录之后增加一条记录,该记录计算查询出的所有记录的总和,即统计记录数量。
【例】根据s_id对fruits表中的数据进行分组,并显示记录数量,SQL语句如下:
mysql>selects_id,count(*)asTotal->fromfruits->groupbys_idwithrollup;+------+-------+|s_id|Total|+------+-------+|101|3||102|3||103|2||104|2||105|3||106|1||107|2||NULL|16|+------+-------+8rowsinset(0.05sec)
4.多字段分组
使用group by可以对多个字段进行分组,group by 关键字后面跟需要分组的字段,MySQL根据多字段的值来进行层次分组,分组层次从左到右,即先按第1个字段分组,然后在第1个字段值相同的记录中,再根据第2个字段的值进行分组,以此类推。
【例】根据s_id和f_name字段对fruits表中的数据进行分组,SQL语句如下:
mysql>select*fromfruitsgroupbys_id,f_name;+------+------+------------+---------+|f_id|s_id|f_name|f_price|+------+------+------------+---------+|12|104|lemon|6.40||a1|101|apple|5.20||a2|103|apricot|2.20||b1|101|blackberry|10.20||b2|104|berry|7.60||b5|107|xxxx|3.60||bs1|102|orange|11.20||bs2|105|melon|8.20||c0|101|cherry|3.20||m1|106|mango|15.70||m2|105|xbabay|2.60||m3|105|xxtt|11.60||o2|103|coconut|9.20||t1|102|banana|10.30||t2|102|grape|5.30||t4|107|xbabay|3.60|+------+------+------------+---------+16rowsinset(0.00sec)
5.group by 和order by一起使用
某些情况下需要对分组进行排序,order by用来对查询的记录排序,如果和group by一起使用可以完成对分组的排序。
创建数据表演示:
mysql>createtableorderitems->(->o_numintnotnull,->o_itemintnotnull,->f_idchar(10)notnull,->quantityintnotnull,->item_pricedecimal(8,2)notnull,->primarykey(o_num,o_item)->);QueryOK,0rowsaffected(0.13sec)mysql>insertintoorderitems(o_num,o_item,f_id,quantity,item_price)->values(30001,1,'a1',10,5.2),->(30001,2,'b2',3,7.6),->(30001,3,'bs1',5,11.2),->(30001,4,'bs2',15,9.2),->(30002,1,'b3',2,20.0),->(30003,1,'c0',100,10),->(30004,1,'o2',50,2.50),->(30005,1,'c0',5,10),->(30005,2,'b1',10,8.99),->(30005,3,'a2',10,2.2),->(30005,4,'m1',5,14.99);QueryOK,11rowsaffected(0.06sec)Records:11Duplicates:0Warnings:0
【例】查询订单价格大于100的订单号和总订单价格,SQL语句如下;
mysql>selecto_num,sum(quantity*item_price)asorderTotal->fromorderitems->groupbyo_num->havingsum(quantity*item_price)>=100;+-------+------------+|o_num|orderTotal|+-------+------------+|30001|268.80||30003|1000.00||30004|125.00||30005|236.85|+-------+------------+4rowsinset(0.00sec)
可以看到orderTotal列的总订单价格并没有按照一定的顺序显示,接下来使用order by关键字按总订单价格排列显示结果,SQL语句如下:
mysql>selecto_num,sum(quantity*item_price)asorderTotal->fromorderitems->groupbyo_num->havingsum(quantity*item_price)>=100->orderbyorderTotal;+-------+------------+|o_num|orderTotal|+-------+------------+|30004|125.00||30005|236.85||30001|268.80||30003|1000.00|+-------+------------+4rowsinset(0.00sec)
可以看到,group by 子句按订单号对数据进行分组,sum()函数便可以返回总的订单价格,having子句对分组数据进行过滤,使得只返回总价格大于100的订单,最后使用order by子句排序输出。
(13)使用limit限制查询结果的数量select返回所有匹配的行,有可能是表中所有的行,如仅仅需要返回第一行或者前几行,使用limit关键字,基本语法如下:
limit[位置偏移量,]行数
第一个"位置偏移量"参数只是MySQL从哪一行开始显示,是一个可选参数,如果不指定"位置偏移量",将会从表中的第一条记录开始(第一条记录的位置偏移量是0,第二条记录的位置偏移量是1,以此类推);第二个参数"行数指示返回的记录条数"。
【例1】显示fruits表查询结果的前4行,SQL语句如下:
mysql>select*fromfruitslimit4;+------+------+------------+---------+|f_id|s_id|f_name|f_price|+------+------+------------+---------+|12|104|lemon|6.40||a1|101|apple|5.20||a2|103|apricot|2.20||b1|101|blackberry|10.20|+------+------+------------+---------+4rowsinset(0.00sec)
【例2】在fruits表中,使用limit子句,返回从第5个记录开始的、行数长度为3的记录,SQL语句如下:
mysql>select*fromfruitslimit4,3;+------+------+--------+---------+|f_id|s_id|f_name|f_price|+------+------+--------+---------+|b2|104|berry|7.60||b5|107|xxxx|3.60||bs1|102|orange|11.20|+------+------+--------+---------+3rowsinset(0.00sec)
也可以使用"limit 4 offset 3
"也是获取从第5条记录开始后面的3条记录。
感谢各位的阅读!关于“MySQL如何实现单表查询”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。