|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
DBaaS向客户提供了许多与其他云服务相类似的优势:一个灵活的、可扩展的MySQL学习教程、按需服务的平台,它以自助服务和便捷管理为导向,可以对环境中的资源进行调配。择要:SELECT语句能够匡助我们从MySQL中掏出数据。SELECT也许是SQL言语中最经常使用的语句,并且如何利用它也最为考究;用它来选择纪录大概相称庞大,大概会触及很多表中列之间的对照。本节先容Select语句关于查询的最基础功效。
除非终极检索它们并使用它们来做点事变,不然将纪录放进数据库没甚么优点。这就是SELECT语句的用处,即匡助掏出数据。SELECT也许是SQL言语中最经常使用的语句,并且如何利用它也最为考究;用它来选择纪录大概相称庞大,大概会触及很多表中列之间的对照。本节先容Select语句关于查询的最基础功效。
SELECT语句的语法以下:
SELECTselection_list选择哪些列
FROMtable_list从那边选择行
WHEREPRimary_constraint行必需满意甚么前提
GROUPBYgrouping_columns如何对了局分组
HAVINGsecondary_constraint行必需满意的第二前提
ORDERBYsorting_columns如何对了局排序
LIMITcount了局限制
注重:一切利用的关头词必需准确地以下面的按次给出。比方,一个HAVING子句必需跟在GROUPBY子句以后和ORDERBY子句之前。
除词“SELECT”和申明但愿检索甚么的column_list部格外,语法中的每样器材都是可选的。有的数据库还必要FROM子句。MySQL有所分歧,它同意对表达式求值而不援用任何表。
一般查询
SELECT最复杂的情势是从一张表中检索每样器材:
mysql>SELECT*FROMpet;
其了局为:
+----------+--------+---------+------+------------+------------+
|name|owner|species|sex|birth|death|
+----------+--------+---------+------+------------+------------+
|Fluffy|Harold|cat|f|1993-02-04|NULL|
|Claws|Gwen|cat|m|1994-03-17|NULL|
|Buffy|Harold|dog|f|1989-05-13|NULL|
|Chirpy|Gwen|bird|f|1998-09-11|NULL|
|Fang|Benny|dog|m|1990-08-27|NULL|
|Bowser|Diane|dog|m|1990-08-31|1995-07-29|
|Whistler|Gwen|bird|NULL|1997-12-09|NULL|
|Slim|Benny|snake|m|1996-04-29|NULL|
|Puffball|Diane|hamster|f|1999-03-30|NULL|
+----------+--------+---------+------+------------+------------+
查询特定行:
你能从你的表中只选择特定的行。比方,假如你想要考证你对Bowser的出身日期所做的改动,像如许精选Bowser的纪录:
mysql>SELECT*FROMpetWHEREname="Bowser";
其了局为:
+--------+-------+---------+------+------------+------------+
|name|owner|species|sex|birth|death|
+--------+-------+---------+------+------------+------------+
|Bowser|Diane|dog|m|1990-08-31|1995-07-29|
+--------+-------+---------+------+------------+------------+
你能够对比前一个例子来考证。
查询特定列
假如你不想要看到你的表的全部行,就定名你感乐趣的列,用逗号分隔。比方,假如你想要晓得你的植物甚么时分出身的,精选name和birth列:
mysql>SELECTname,birthFROMpetwhereowner="Gwen";
其了局为:
+----------+------------+
|name|birth|
+----------+------------+
|Claws|1994-03-17|
|Chirpy|1998-09-11|
|Whistler|1997-12-09|
+----------+------------+
举行表达式盘算
后面的多半查询经由过程从表中检索值已发生了输入了局。MySQL还同意作为一个公式的了局来盘算输入列的值。表达式能够复杂也能够庞大。上面的查询求一个复杂表达式的值(常量)和一个触及几个算术运算符和两个函数挪用的较庞大的表达式的值。比方,盘算Browser生存的天数:
mysql>SELECTdeath-birthFROMpetWHEREname="Bowser";
其了局是:
+-------------+
|death-birth|
+-------------+
|49898|
+-------------+
因为MySQL同意对表达式求值而不援用任何表。以是也能够如许利用:
mysql>select(2+3*4.5)/2.5;
其了局为:
+---------------+
|(2+3*4.5)/2.5|
+---------------+
|6.200|
+---------------+
前提查询
不用每次查询都前往一切的行纪录,你能从你的表中只选择特定的行。为此你必要利用WHERE大概HAVING从句。HAVING从句与WHERE从句的区分是,HAVING表达的是第二前提,在与其他从句共同利用,明显不克不及在WHERE子句中的项目利用HAVING。因而本大节紧先容WHERE从句的利用,HAVING从句的利用办法相似。别的WHERE从句也能够完成HAVING从句的尽年夜部分功效。
为了限定SELECT语句检索出来的纪录集,可以使用WHERE子句,它给出选择行的前提。可经由过程查找满意各类前提的列值来选择行。
WHERE子句中的表达式可以使用表1中的算术运算符、表2的对照运算符和表3的逻辑运算符。还可使用圆括号将一个表达式分红几个部分。可以使用常量、表列和函数来完成运算。在本教程的查询中,我们偶然利用几个MySQL函数,可是MySQL的函数远不止这里给出的这些。请参阅附录一,那边给出了一切MySQL函数的清单。
表1算术运算符
运算符
申明
运算符
申明
+
-
加
减
*
/
乘
除
表2对照运算符
运算符
申明
运算符
申明
<
<=
=
小于
小于或即是
即是
!=或
>=
>
不即是
年夜于或即是
年夜于
表3逻辑运算符
运算符
申明
NOT或!
OR或||
AND或&&
逻辑非
逻辑或
逻辑与
比方,假如你想要考证你对Bowser的出身日期所做的改动,像如许精选Bowser的纪录:
mysql>SELECT*FROMpetWHEREname="Bowser";
+--------+-------+---------+------+------------+------------+
|name|owner|species|sex|birth|death|
+--------+-------+---------+------+------------+------------+
|Bowser|Diane|dog|m|1990-08-31|1995-07-29|
+--------+-------+---------+------+------------+------------+
输入证明出身年份如今准确纪录为1990,而不是1909。
字符串对照一般是巨细些有关的,因而你能够指命名字为"bowser"、"BOWSER"等等,查询了局将是不异的。
你能在任何列上指定前提,不但是name。比方,假如你想要晓得哪一个植物在1998今后出身的,测试birth列:
mysql>SELECT*FROMpetWHEREbirth>="1998-1-1";
+----------+-------+---------+------+------------+-------+
|name|owner|species|sex|birth|death|
+----------+-------+---------+------+------------+-------+
|Chirpy|Gwen|bird|f|1998-09-11|NULL|
|Puffball|Diane|hamster|f|1999-03-30|NULL|
+----------+-------+---------+------+------------+-------+
你能组合前提,比方,找出雌性的狗:
mysql>SELECT*FROMpetWHEREspecies="dog"ANDsex="f";
+-------+--------+---------+------+------------+-------+
|name|owner|species|sex|birth|death|
+-------+--------+---------+------+------------+-------+
|Buffy|Harold|dog|f|1989-05-13|NULL|
+-------+--------+---------+------+------------+-------+
下面的查询利用AND逻辑操纵符,也有一个OR操纵符:
mysql>SELECT*FROMpetWHEREspecies="snake"ORspecies="bird";
+----------+-------+---------+------+------------+-------+
|name|owner|species|sex|birth|death|
+----------+-------+---------+------+------------+-------+
|Chirpy|Gwen|bird|f|1998-09-11|NULL|
|Whistler|Gwen|bird|NULL|1997-12-09|NULL|
|Slim|Benny|snake|m|1996-04-29|NULL|
+----------+-------+---------+------+------------+-------+
AND和OR能够混用。假如你如许做,利用括号指明前提应当怎样被分组是一个好主张:
mysql>SELECT*FROMpetWHERE(species="cat"ANDsex="m")
->OR(species="dog"ANDsex="f");
+-------+--------+---------+------+------------+-------+
|name|owner|species|sex|birth|death|
+-------+--------+---------+------+------------+-------+
|Claws|Gwen|cat|m|1994-03-17|NULL|
|Buffy|Harold|dog|f|1989-05-13|NULL|
+-------+--------+---------+------+------------+-------+
查询排序
利用ORDERBY子句对查询前往的了局按一列或多列排序。ORDERBY子句的语法格局为:
ORDERBYcolumn_name[ASC|DESC][,…]
个中ASC暗示升序,为默许值,DESC为降序。ORDERBY不克不及按text、text和image数据范例举行排序。别的,能够依据表达式举行排序。
比方,这里是植物诞辰,按日期排序:
mysql>SELECTname,birthFROMpetORDERBYbirth;
+----------+------------+
|name|birth|
+----------+------------+
|Buffy|1989-05-13|
|Fang|1990-08-27|
|Bowser|1990-08-31|
|Fluffy|1993-02-04|
|Claws|1994-03-17|
|Slim|1996-04-29|
|Whistler|1997-12-09|
|Chirpy|1998-09-11|
|Puffball|1999-03-30|
+----------+------------+
为了以逆序排序,增添DESC(下落)关头字到你正在排序的列名上:
mysql>SELECTname,birthFROMpetORDERBYbirthDESC;
+----------+------------+
|name|birth|
+----------+------------+
|Puffball|1999-03-30|
|Chirpy|1998-09-11|
|Whistler|1997-12-09|
|Slim|1996-04-29|
|Claws|1994-03-17|
|Fluffy|1993-02-04|
|Bowser|1990-08-31|
|Fang|1990-08-27|
|Buffy|1989-05-13|
+----------+------------+
你能在多个列上排序。比方,按植物的品种排序,然后按诞辰,起首是植物品种中最年老的植物,利用以下查询:
mysql>SELECTname,species,birthFROMpetORDERBYspecies,birthDESC;
+----------+---------+------------+
|name|species|birth|
+----------+---------+------------+
|Chirpy|bird|1998-09-11|
|Whistler|bird|1997-12-09|
|Claws|cat|1994-03-17|
|Fluffy|cat|1993-02-04|
|Bowser|dog|1990-08-31|
|Fang|dog|1990-08-27|
|Buffy|dog|1989-05-13|
|Puffball|hamster|1999-03-30|
|Slim|snake|1996-04-29|
+----------+---------+------------+
注重DESC关头词仅合用于紧跟在它之前的列名字(birth);species值仍旧以升序被排序。注重,输入起首依照species排序,然后具有不异species的宠物再依照birth降序分列。
查询分组与行计数
GROUPBY从句依据所给的列名前往分组的查询了局,可用于查询具有不异值的列。其语法为:
GROUPBYcol_name,….
你能够为多个列分组。
比方:
mysql>SELECT*FROMpetGROUPBYspecies;
+----------+--------+---------+------+------------+-------+
|name|owner|species|sex|birth|death|
+----------+--------+---------+------+------------+-------+
|Chirpy|Gwen|bird|f|1998-09-11|NULL|
|Fluffy|Harold|cat|f|1993-02-04|NULL|
|Buffy|Harold|dog|f|1989-05-13|NULL|
|Puffball|Diane|hamster|f|1999-03-30|NULL|
|Slim|Benny|snake|m|1996-04-29|NULL|
+----------+--------+---------+------+------------+-------+
由以上了局能够看出:
查询显现了局时,被分组的列假如有反复的值,只前往靠前的纪录,而且前往的纪录集是排序的。这并非一个很好的了局。仅仅利用GROUPBY从句并没有甚么意义,该从句的真正感化在于与各类组合函数共同,用于行计数。
1、COUNT()函数计数非NULL了局的数量。
你能够如许盘算表中纪录行的数量:
mysql>selectcount(*)frompet;
+----------+
|count(*)|
+----------+
|9|
+----------+
盘算sex为非空的纪录数量:
mysql>selectcount(sex)frompet;
+------------+
|count(sex)|
+------------+
|8|
+------------+
如今共同GROUPBY从句利用。
比方:要晓得每一个仆人有几宠物
mysql>SELECTowner,COUNT(*)FROMpetGROUPBYowner;
+--------+----------+
|owner|COUNT(*)|
+--------+----------+
|Benny|2|
|Diane|2|
|Gwen|3|
|Harold|2|
+--------+----------+
又如,每种宠物的个数:
mysql>SELECTspecies,count(*)FROMpetGROUPBYspecies;
+---------+----------+
|species|count(*)|
+---------+----------+
|bird|2|
|cat|2|
|dog|3|
|hamster|1|
|snake|1|
+---------+----------+
假如你除计数还前往一个列的值,那末必需利用GROUBY语句,不然难以估计纪录。比方上例,利用GROUPBY对每一个owner分组一切纪录,没有它,你失掉的统统是一条毛病动静:
mysql>SELECTowner,COUNT(owner)FROMpet;
ERROR1140atline1:MixingofGROUPcolumns(MIN(),MAX(),COUNT()...)
withnoGROUPcolumnsisillegalifthereisnoGROUPBYclause
也能够依据多个列分组,比方:
按品种和性别组合的植物数目:
mysql>SELECTspecies,sex,COUNT(*)FROMpetGROUPBYspecies,sex;
+---------+------+----------+
|species|sex|COUNT(*)|
+---------+------+----------+
|bird|NULL|1|
|bird|f|1|
|cat|f|1|
|cat|m|1|
|dog|f|1|
|dog|m|2|
|hamster|f|1|
|snake|m|1|
+---------+------+----------+
查询多个表
查询多个表,FROM子句列出表名,并用逗号分开,由于查询必要从他们两个拉出信息。
当组合(联合-join)来自多个表的信息时,你必要指定在一个表中的纪录如何能婚配别的表的纪录。这很复杂,由于它们都有一个name列。查询利用WHERE子句基于name值来婚配2个表中的纪录。
由于name列呈现在两个表中,当援用列时,你必定要指定哪一个表。这经由过程把表名附在列名前做到。
如今有一个event表:
mysql>select*fromevent;
+----------+------------+----------+-----------------------------+
|name|date|type|remark|
+----------+------------+----------+-----------------------------+
|Fluffy|1995-05-15|litter|4kittens,3female,1male|
|Buffy|1993-06-23|litter|5puppies,2female,3male|
|Buffy|1994-06-19|litter|3puppies,3female|
|Chirpy|1999-03-21|vet|neededbeakstraightened|
|Slim|1997-08-03|vet|brokenrib|
|Bowser|1991-10-12|kennel|NULL|
|Fang|1991-10-12|kennel|NULL|
|Fang|1998-08-28|birthday|Gavehimanewchewtoy|
|Claws|1998-03-17|birthday|Gavehimanewfleacollar|
|Whistler|1998-12-09|birthday|Firstbirthday|
+----------+------------+----------+-----------------------------+
当他们有了一窝小植物时,假定你想要找出每只宠物的岁数。event表指出什么时候产生,可是为了盘算母亲的岁数,你必要她的出身日期。既然它被存储在pet表中,为了查询你必要两张表:
mysql>SELECTpet.name,(TO_DAYS(date)-TO_DAYS(birth))/365ASage,remark
->FROMpet,event
->WHEREpet.name=event.nameANDtype="litter";
+--------+------+-----------------------------+
|name|age|remark|
+--------+------+-----------------------------+
|Fluffy|2.27|4kittens,3female,1male|
|Buffy|4.12|5puppies,2female,3male|
|Buffy|5.10|3puppies,3female|
+--------+------+-----------------------------+
一样办法也可用于统一张表中,你不用有2个分歧的表来实行一个联合。假如你想要将一个表的纪录与统一个表的其他纪录举行对照,联合一个表到本身偶然是有效的。比方,为了在你的宠物当中滋生夫妇,你能够用pet联合本身来举行类似品种的雄雌配对:
mysql>SELECTp1.name,p1.sex,p2.name,p2.sex,p1.species
->FROMpetASp1,petASp2
->WHEREp1.species=p2.speciesANDp1.sex="f"ANDp2.sex="m";
+--------+------+--------+------+---------+
|name|sex|name|sex|species|
+--------+------+--------+------+---------+
|Fluffy|f|Claws|m|cat|
|Buffy|f|Fang|m|dog|
|Buffy|f|Bowser|m|dog|
+--------+------+--------+------+---------+
在这个查询中,我们为表名指定别号以便能援用列而且使得每个列援用联系关系于哪一个表实例更直不雅。
总结
本文总结了SELECT语句检索纪录的复杂利用办法。个中触及到的内容次要包含以下一些内容:
1、WHERE从句的用法
2、GROUPBY从句的用法
3、ORDERBY从句的用法
4、毗连多个表的复杂先容
通过支付一定费用,客户可以得到优先的24/7支持,访问内容丰富的在线知识库和联系一个专门的技术负责经理。 |
|