仓酷云

标题: MYSQL教程之且不说你是不是正在处置编程方面的事情或... [打印本页]

作者: 飘灵儿    时间: 2015-1-16 22:35
标题: MYSQL教程之且不说你是不是正在处置编程方面的事情或...
由于在MySQL中有如此众多的额外功能可选,诸如存储引擎等,你可以选择最适合你公司的一个,或者尝试选用多个引擎。MySQL开始非常小巧,但是可以随着公司的成长而不断地变强大。编程跟我学SQL分为三部分,个中涵盖了有关SQL尺度的基础常识。在上一篇文章里我们会商了一些数据库术语和4种最基础的数据查询范例。别的,我们还注释了WHERE子句和前提语句的用法,同时我们供应了各种查询的详细示例。


在这篇文章里,我们迁就其他一些SQL函数和子句举行论述,供你用于基础的SELECT数据查询中。


SELECT选项精制了局
正如我们从上一篇文章中所读到的那样,SELECT语句具有品种单一的各种选项,这些选项能够用来把持数据前往的体例。这些选项以子句、关头词和函数的情势存在。

子句是一种修正了局的语句。子句不是需要的语句但它对数据的内容及其显现举行了提炼。WHERE子句就是如许的子句。

关头词触发数据库的内涵功效。这些关头词在偶然乃至是查询所必须的。比方“INSERTINTOtable_name(column1)VALUES(‘data1’);”语句中的INTO和VALUE就是云云。我们将懂得DISTINCT关头词,它能触发一些十分有效的可选功效。

上面总结了一些最经常使用的子句、关头词和函数。然后我会对每部分举例申明。

ORDERBYC依照指定列排序前往了局的子句
DISTINCTC只前往了局汇合内独一行的关头词
COUNT--前往婚配查询的数据行总数数值的函数
AVGC该函数前往指定列的均匀值
SUMC该函数把指定的列中的数字加起来
MINC该函数前往列中最小的非NULL值
MAXC该函数前往列中的最年夜值
GROUPBYC按列搜集查询函数了局的子句
用ORDERBY对查询了局排序
ORDERBY子句让数据库对查询了局排序,如许你就不必本人编写使用程序举行“手工”排序了。ORDERBY子句必需放在查询语句的开头。其基础用法以下:

SELECT*FROMContactsORDERBYfirst_name;

你能够随便在任何选择语句中利用ORDERBY子句前往多列了局。你还能够用它毗连其他子句:
SELECTfirst_name,last_nameFROMContactsWHEREfirst_nameBETWEEN‘a’AND‘k’ORDERBYlast_name;

你能够对多列数据排序。优先按次按从左到右顺次下降,以是查询语句中各列的分列按次很主要。
SELECT*FROMContactsORDERBYcompany,last_name,first_name;

查询了局默许按数字大概字母的升序排序。你能够在ORDERBY子句前面加上DESC关头词改成降序分列。鄙人面的例子中,最高的net_amount排在开始(降序)。假设两行大概两行以上数据都包括了一样的net_amount值,那末偕行中last_name值在字母表中开始呈现的排先,由于last_name一列仍是依照升序排序的。
SELECT*FROMSalesORDERBYnet_amountDESC,last_name,first_name;

在依照界说的列名排序今后,年夜多半数据库随后将依照数据表内的第一列排序然后按次向右再排序。详细的完成各有变更,因而,假如排序在使用中对照主要那末你应当明白地界说所要排序的列。

别的一值得注重的成绩是,接纳ORDERBY子句(和WHERE子句),你正在用来排序了局的数据列其实不必定得是前往了局汇合的一部分。只需一切援用的列都在数据表内存在则下例完整无效:

SELECTcompany,first_name,net_amountFROMSalesORDERBYstart_date,last_name;

DISTINCT前往不反复了局


DISTINCT关头词只前往了局汇合内不反复的数据行。比方,偶然你大概必要找出Sales表内的公司,可是你又不想瞥见每一个条目。因而你能够用DISTINCT对应每公司名前往一行数据:

SELECTDISTINCTcompanyFROMSales;

在利用DISTINCT时,它合用于一切的哀求列。假如你盘算列出表内的一切发卖职员和他们所代表的公司而非每发卖纪录,那末你可使用以下语句。注重,如许操纵还大概前往统一公司的多少条目等等。

SELECTDISTINCTcompany,last_name,first_nameFROMSales;

你还能够在对了局减少局限和举行排序时分离SELECT语句利用DISTINCT。为了断定显现的内容,数据库起首会证明简练的哀求是不是婚配数据行,然后使用DISTINCT功效。在全体了局汇合都得以断定以后即处置ORDERBY子句。以下例所示,只要net_amount年夜于100的数据行才被前往。因为DISTINCT保存碰见的第1个婚配查询前提的数据行而抛弃其他婚配行,以是ORDERBY语句所援用的net_amount看起来就好象发生了随机的了局。

SELECTDISTINCTcompany,last_name,first_nameFROMSalesWHER_amount>100ORDERBYcompany,net_amount;


函数使用逻辑
前往单一值的函数称做会萃函数(aggregatefunction)。经由过程使用程序会见以下会萃函数的了局时,包括了局的“字段名”就是你所利用的实践函数。比方,在剖析你的数据库了局时,了局数组的键值大概以下所示:

$keyname=“COUNT(*)”;
$resultkey=“AVG(net_amount)”;

COUNT
COUNT函数盘算出了局汇合中的数据行数。和其他函数一样它承受一个参数。以下的基础示例能告知你数据表内的行数:SELECTCOUNT(*)FROMSales;

你也能够用它来盘算任何了局汇合中的行数。

SELECTCOUNT(*)FROMSalesWHER_amount>100;

假如你想看看某特定列有几行包括非空值,那你无妨对该列利用COUNT函数。注重,除非数据库设置为字段为空时缺省添补NULL不然将前往表内数据行的总数。别的,列出的列在超越一个的情形下会引发毛病。

SELECTCOUNT(company)FROMSales;

COUNT还能够用来盘算DISTINCT了局汇合中的行数。
SELECTCOUNT(DISTINCTcompany,last_name)FROMSales;

COUNT语句一般用在程序中断定FOR轮回的轮回次数。


AVG
AVG前往某列一切字段的均匀值,该列必需是数字数据范例。该函数用列的名字作为其参数,假如列字段数据范例长短数字范例的则函数前往“0”。SELECTAVG(net_amount)FROMSales;

你能够分离子句限定该函数的使用局限。

SELECTAVG(net_amount)FROMSalesWHEREcompanyLIKE‘%ABCDCo%’;

就象一切会萃函数一样,ORDERBY语句将被疏忽。

SUM

SUM的事情体例和AVG差未几,只不外该函数前往了局汇合中一切字段值的和。
SELECTSUM(net_amount)FROMSalesWHER_amount>100;

AVG、SUM、MIN和MAX函数在没有指定列的情形下城市前往毛病,以是你不克不及利用“*”通配符。

MIN
MIN前往指定列中最小的非空值。假如指定列是数字数据范例则了局将是最小的数字。假如它是一种字符串数据范例则函数将前往按字母表按次呈现的第1个值。SELECTMIN(net_amount)FROMSalesWHERElast_name=“Smith”;
SELECTMIN(last_name)FROMSales;


MAX

MAX的事情体例和MIN函数一样,只不外该函数前往最年夜的非空值。该函数也能够用于字符串大概数字列
SELECTMAX(net_amount)FROMSales;
SELECTMAX(company)FROMSalesWHER_amount>100;

MAX函数偶然还用在包括主动递增键字段的列上断定下一条目标键ID。除非你正在运转一个非公然的数据库,不然在利用这一信息拔出下一条目时务必审慎,以防其他用户先你实行数据操纵。
GROUPBY令函数更有效


固然以上提到的一切这些函数都能供应相称有效的信息,可是,假如有GROUPBY子句协助的话更能让你在列的字段子会合使用这些函数。不要对你的Sales表中每家公司一次又一次地实行MAX函数查询――你完整能够带GROUPBY子句取得一样的了局:

SELECTcompany,MAX(net_amount)FROMSalesGROUPBYcompany;

如许做能够取得每家公司net_amount的的最年夜值。在选择多列名的时分也能够接纳该语句,你还能够用多列来对函数了局分组。

上面的例子演示了以上各类体例。起首,包含GROUPBY子句能够令你指定要显现的其他列。但是,你得晓得这个例子将前往在组中碰到的第1个last_name值;Sum(net_amount)将显现全体公司的了局而不单单针对婚配姓氏的数据行。这是由于,我们只利用了Company字段来界说我们的组。

SELECTcompany,last_name,SUM(net_amount)FROMSalesGROUPBYcompany;

在下面的例子中,last_name列实践上并没有供应甚么有效的信息,但如许做是为了鄙人一个例子中要用到的功效做筹办。你能够创立多列界说的组。如许就能够在了局汇合中发生针对特定行的函数了局,而了局汇合则是由一切指定的GROUPBY列团结起来创立的:

SELECTcompany,AVG(net_amount),last_nameFROMSalesGROUPBYcompany,last_name;


下面的例子给每家公司中每姓氏给出了均匀的net_amount。你列出GROUPBY列的按次把持着了局的排序,可是实践的函数值了局是一样的。


上面的例子标明怎样构造了局而不显现分组的列。在有些场所如许做是很有效的,比方,假如要显现团体的发卖量但却不显现姓名就可以用高低面的例子了:

SELECTcompany,COUNT(sale_id)FROMSalesGROUPBYcompany,last_name;


限定利用GROUPBY的查询
如你在以上示例中所看到的那样,你能够分离WHERE字句使用以上的观点限定查询的局限。WHERE子句会起首被盘算,然后实行函数。在利用组的时分就是如许的。

SELECTcompany,AVG(net_amount),FROMSalesWHER_amount>100GROUPBYcompany;

下面的例子只对那些满意WHERE限定前提的数据行合用AVG函数。注重,WHERE子句必需放在GROUPBY子句之前。你还能够用HAVING语句对分组盘算以后限定前往的了局汇合。

SELECTcompany,AVG(net_amount),FROMSalesWHERElast_nameBETWEEN‘a’AND‘m’GROUPBYcompanyHAVINGAVG(net_amount)>500;


下面的语句盘算每家公司net_amount的均匀值,并且只盘算那些姓氏满意限定前提的发卖职员的发卖量,同时只显现年夜于500的了局。


即使对于MySQL的商业化的企业版来说,也没有高昂的许可证成本,当你将其与像甲骨文和微软之类的大型专有商业数据库比较的话。
作者: 海妖    时间: 2015-1-17 17:26
外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。
作者: 深爱那片海    时间: 2015-1-18 07:39
外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。
作者: 冷月葬花魂    时间: 2015-1-21 13:30
我个人认为就是孜孜不懈的学习
作者: 仓酷云    时间: 2015-1-30 19:10
一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。)
作者: 兰色精灵    时间: 2015-2-6 15:12
这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。
作者: 不帅    时间: 2015-2-16 19:53
财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..
作者: 再现理想    时间: 2015-3-5 08:46
光写几个SQL实在叫无知。
作者: 因胸联盟    时间: 2015-3-12 02:25
索引视图2k就有。但是2005对其效率作了一些改进但是schema.viewname的作用域真是太限制了它的应用面。还有一大堆的环境参数和种种限制都让人对它有点却步。
作者: admin    时间: 2015-3-19 17:36
你可以简单地认为适合的就是好,不适合就是不好。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2