柔情似水 发表于 2015-1-16 22:31:33

MYSQL编程:SQL Story摘录(一)――――复杂查询初...

据我的观察,现在有一个趋势,那些经过正式培训的数据库管理员DBA更倾向于选择一个专有关系数据库,例如Oracle。对于一些具有专门数据库管理员的比较大的环境来说,MySQL很难得到宠爱,这时候,关于MySQL是否真的具有良好的可扩展性的争论已经没有意义。
在CSDN上回贴时,我老是语重心长地劝说楼上楼下的伴侣们多用连接。可呼应甚微。常常一个复杂的功效,也必定要写成子查询或游标,弄得十分庞大冗杂。切实其实,如许写关于初学者来讲,吃力不费脑,思绪对照好了解。以是常常得分的也是这些回贴。可现实上,假如你真正熟习了SQL的编程作风,你会分明,连接查询才是最间接、最明晰、最无力的办法,而更好的举措就是无招胜有招,一条复杂查询停止战役。上面我举几个例子来证实一下这个概念。
例1-1、反复纪录的查询和处置
总有一些伴侣在网上问,一个表中,有反复的纪录,怎样办?固然,一个计划作风优秀的干系型数据库,每一个表都应当有主键、有独一索引,以是压根就不应有反复纪录。不外偶然仍是会呈现不应呈现的事,好比“七.七事情”,好比“9.11”……咳咳,实在我想说的是,偶然会有人基本没无数据库的观点,他就不晓得主键是甚么,大概随便建了一个主动标识的ID列凑数(实在这也没甚么,没有人生成会计划数据库,关头是愿不肯供认本人的不敷而且改善)。更罕见的是我们的数据大概来自一些电子表格或文本文件,导进到数据库中时才发明成绩。
这里,我们创建一个表,暗示某商铺的存货。我成心没有到场任何索引和束缚,如许,它会很简单地出成绩(就像实行室里的裸鼠)。
CREATETABLEPRODUCT(
IDINT,PNAMECHAR(20),
PRICEMONEY,NUMBERINT,
PDESCRIPTIONVARCHAR(50))
如今,我们能够向个中拔出一些数据:
IDPNAMEPRICENUMBERPDESCRIPTION
1Apple123000

1Apple123000

2Banana16.997600

3Olive25.224500

4Orange15.995500

4CocoNut40.992000

5Pineapple302500

6Olive25.223000


这里有一些分明的成绩,前两行完整一样,如许的反复数据一点意义都没有,只会添乱。InterBase还好点,在它的IBConsole中能够间接修正它们。可在SQLServer中,体系基本没法辨别这两行,当我们试图对个中任一行修正时会收到一个毛病信息。现实上,这也是一个干系型数据库应有的反响。那我们应当怎样办呢?
现实上,处置它的办法比找堕落误数据还复杂,连接查询都用不到。用一条SQL语句
SELECTDISTINCT*FROMPRODUCT
就能够把反复数据紧缩失落,天生一个包含一般数据的数据集。了局以下:
IDPNAMEPRICENUMBERPDESCRIPTION
1Apple123000

2Banana16.997600

3Olive25.224500

4Orange15.995500

4CocoNut40.992000

5Pineapple302500

6Olive25.223000


关于撑持SELECT……INTO……FROM语句的数据库来讲,如许一句
SELECTDISTINCT*INTONewTableFROMPRODUCT
便可把数据导进到一个新表(NewTable)中。大概能够用INERTINTO……SELECTDISTINCT*FROM……把它导进到一个现有的表中。总之有了准确的数据集,再怎样处置就好办了。信任人人晓得这个兼并反复数据的关头字DISTINCT后,再不会用游标来处置反复数据了吧。
这是第一步,偶然大概我们不想一下把它们紧缩失落,而是想先看看究竟谁出了成绩。好的,用上面的语句能够找出反复的纪录,最右侧一列“ROW_COUNT”暗示这行数据在表中反复的次数:
SELECTID,PNAME,PRICE,NUMBER,PDESCRIPTION,COUNT(*)ROW_COUNT
FROMPRODUCT
GROUPBYID,PNAME,PRICE,NUMBER,PDESCRIPTION
HAVINGCOUNT(*)>1
IDPNAMEPRICENUMBERPDESCRIPTIONROW_COUNT
1Apple123000NULL2




(所影响的行数为1行)
实在就是关头字GROUPBY……HAVING和统计函数COUNT的一个复杂使用,记得在GROUPBY前面写上完全的字段列表。这暗示我们要的是那些完整分歧的数据,每一个字段都一样。
PRODUCT表中的数据良多时,用后面的办法间接天生准确的数据集效力很低。如今有了这个了局集,我们能够高效力事情了。如今,我们用
SELECTID,PNAME,PRICE,NUMBER,PDESCRIPTION
FROMPRODUCT
GROUPBYID,PNAME,PRICE,NUMBER,PDESCRIPTION
HAVINGCOUNT(*)>1
把反复的数据天生为一个经由紧缩的准确数据集,用前述的办法导出到一个一时表中,然后用
DELETEFROMPRODUCT
WHEREIDIN(
SELECTID
FROMPRODUCT
GROUPBYID,PNAME,PRICE,NUMBER,PDESCRIPTION
HAVINGCOUNT(*)>1
)
把反复数据从PRODUCT表中删除,再把紧缩好的数据拔出PRODUCT。如今PRODUCT表中不再有完整反复,不成标识的数据了。
MySQL采用双重授权(DualLicensed),它们是GPL和MySQLAB制定的商业许可协议。

再现理想 发表于 2015-1-19 16:09:38

where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。

简单生活 发表于 2015-1-26 22:34:59

我们学到了什么?思考问题的时候从表的角度来思考问

冷月葬花魂 发表于 2015-2-4 21:17:04

很多书籍啊,不过个人认为看书太慢,还不如自己学。多做实际的东西,就会遇到很多问题,网上搜下解决问题。不断重复这个过程,在配合sql的F1功能。

分手快乐 发表于 2015-2-10 12:19:13

我们学到了什么?思考问题的时候从表的角度来思考问

只想知道 发表于 2015-3-1 10:42:06

如果处理少量数据,比如几百条记录的数据,我不知道这两种情况哪个效率更高,如果处理大量数据呢?比如有表中有20万条记录.

小魔女 发表于 2015-3-10 15:40:59

代替了原来VB式的错误判断。比Oracle高级不少。

灵魂腐蚀 发表于 2015-3-17 08:48:53

而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。

因胸联盟 发表于 2015-3-24 04:23:31

两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书
页: [1]
查看完整版本: MYSQL编程:SQL Story摘录(一)――――复杂查询初...