如何真正掌握MySQL?


13

我使用mysql的时间与使用PHP的时间相同。但是我对PHP的信心提高了10倍;或任何其他编程语言。但是我似乎无法真正掌握SQL。我的意思是,我可以选择,更新,插入,删除,加入等,但是涉及到更复杂的内容时,我会迷失方向。如何编写更复杂的select语句,如何正确使用索引,使用哪个引擎等。

由于某些原因,我真的很难遵循mysql文档,但是php易于遵循。

我开始认为,也许我的大脑只是以某种方式使编程成为可能,但是SQL却使人困惑。我不知道。大多数人认为Regex是如此令人困惑,但对我而言,它比如何构造sql语句更具科学意义。请不要误会我的意思,我不是讨厌SQL,我真的很喜欢它,我只是想更好地理解它。

真正掌握MySQL的最佳/最快方法是什么?

当我说“大师”时,我并不是指大师中的大师,我的意思是足够聪明,可以在不需要帮助的情况下解决我对SO提出的大多数问题。


2
您是在谈论SQL还是MySQL,因为它们可能截然不同。设置和管理复制与编写复杂的sql查询是非常不同的任务。我怀疑这也是时间的函数。几乎可以肯定,即使您使用PHP花费了“相同的时间”,编写PHP的时间也要比使用SQL的时间多。
史蒂文·埃弗斯

@SnOrfus关于用PHP编写更多代码,您有个很好的观点。MySQL是我曾经使用过的唯一关系数据库语言。当我说“ SQL”时,我的意思通常就是这种类型的语言。
JD Isaacks

做一些有用的事情。探索您在现实世界中可能遇到的各种问题。这样,您将带领您探索比教科书理论更复杂的方案。在控制台中测试内容,看看是否可以在不使用PHP的情况下获得所需的结果。例如,斯坦福大学发起的免费数据库入门课程有一些与社交网络有关的很棒的练习。
James P.

许多人讨厌PHP(出于各种原因,其中一些很好),但是它的文档非常出色。您发现PHP文档比MySQL文档更易于理解的原因之一不是语言的性质,而是文档的性质。
TRiG 2014年

Answers:


10

用它

内部化关系数据库的工作方式对于许多人来说很困难-但这非常有价值。随着您更多地使用SQL,它将进入您的大脑。继续努力。

当某些事情看起来很奇怪时,请调查

在Chrome中,我设置了此搜索引擎,因此只需输入“ m [搜索查询]”即可搜索文档(dev.mysql.com的搜索很糟糕):{google:baseURL}搜索?{google:RLZ} {google:acceptedSuggestion} {google:originalQueryForSuggestion} sourceid = chrome&ie = {inputEncoding}&q = site:dev.mysql.com/doc/refman/5.1/en+%s

如果文档没有答案,请在freenode上进入#mysql,看看是否有人可以提供一些见解。

读!

一旦了解了关系数据库是如何工作的,您将需要进一步了解MySQL对您正在编写的那些神奇查询所做的工作。我强烈建议您使用高性能MySQL-非常值得您花时间。


1
好消息是,我已经收到您推荐的书,但还没有读完。谢谢!+1了解如何设置Chrome搜索的说明。
JD Isaacks 2010年

我有这本书,只是还没有读过。
crosenblum 2011年

@tehShrike您如何在Chrome上执行此操作?
jaybny 2014年

@jaybny右键单击网址栏,然后转到“编辑搜索引擎”
TehShrike 2014年

9

首先,要对联接有透彻的了解。不仅是内连接和左连接。了解交叉联接的功能以及完全外部联接。了解会导致您选择特定连接类型的情况。了解它们是不可互换的,并且使用左联接的查询可能返回与使用内部联接的查询不同的结果。(有人会认为这很明显,但是我读了太多的问题,人们在描述问题时随机地尝试了不同的联接。)

接下来,我们将真正了解聚合及其工作原理。Mysql将使您摆脱不以标准方式进行分组的麻烦。但是要有纪律来正确地完全定义group by子句。它可以帮助您了解自己在做什么,并使您的知识更容易转移到其他数据库。

了解案例陈述的作用。

在进行复杂的查询时,要学会分块地工作。在每个块上验证您是否具有期望的结果。因此,举例来说,假设您需要针对最近3个月内退回的订单,退货原因以及客户的联系信息编写报告查询。第一步是获取最近三个月内退回的订单。知道您有那个实体后,就可以添加有关退货原因的信息。一旦有了该实体,就可以添加退回该实体的客户。有了该实体后,请添加该人的联系信息。在每个阶段,检查您的结果,看看它们是否有意义。在这种情况下,我可能只想在每个退回订单中只保留一条记录。如果在任何中间阶段,结果的数量增加或减少,您就会知道查询存在问题。有时在构建基块中,您将希望看到其他字段,只是为了验证信息是否正确。我将它们放在单独的行上,并在下一步进行操作时将它们注释掉(一旦我知道我是对的,在最后将它们删除),以便可以再次轻松查看它们是否增加了其他皱纹,从而使查询变得有趣。如果不全面了解结果的外观,就无法正确执行复杂的查询。认为它看起来不错,因为它返回了一些结果,几乎可以保证您在大部分时间内都有错误的结果。m右),因此如果再次添加皱纹使查询变得有趣,则可以轻松再次看到它们。如果不全面了解结果的外观,就无法正确执行复杂的查询。认为它看起来不错,因为它返回了一些结果,几乎可以保证您在大部分时间内都有错误的结果。m右),因此如果再次添加皱纹使查询变得有趣,则可以轻松再次看到它们。如果不全面了解结果的外观,就无法正确执行复杂的查询。认为它看起来不错,因为它返回了一些结果,几乎可以保证您在大部分时间内都有错误的结果。

下面列出了一些您无需考虑即可在SQL中完成的基本操作:

  1. 首先是没有连接(没有选择*)但具有选择条件的直接选择
  2. 您应该知道如何合并两个或多个表并获取所有表中的记录
  3. 您应该知道如何合并两个或多个表并获取所有表中的记录,但是从表中仅返回一条记录,且该记录具有一对多关系的许多方面。
  4. 您应该能够在一个表中但不在关联表中获取记录
  5. 您应该能够汇总报告的数据
  6. 您应该能够在一张表中插入一条记录
  7. 您应该能够更新表中的一条记录
  8. 您应该能够删除表中的一条记录
  9. 您应该能够在没有游标的情况下将一组记录插入到表中
  10. 您应该能够在没有游标的情况下更新表中的一组记录
  11. 您应该能够删除没有光标的表中的一组记录
  12. 您应该能够在一个事务中执行多个操作并处理错误捕获
  13. 您应该能够创建记录的合并,并且知道何时使用UNION Vice UNION ALL。
  14. 您应该能够根据某些条件(使用CASE)更改一个字段的数据

一旦您对基本的SQL知识感到满意之后,就可以了解数据库结构。我可以针对我所支持的非常复杂的数据库编写复杂的查询,其速度比其他人快得多,因为我了解结构,而不必考虑存储在何处。如果您了解表的结构和外键关系以及查找值的存储位置以及列的含义(不仅是它们的名称,还包含它们中包含的数据),那么您可以是查询该数据库的专家。在任何新工作中,我要做的第一件事是彻底了解数据库结构。


3

我认为要学习SQL(这确实是您的要求,MySQL特定特性可能会在以后出现),您应该将自己从PHP风格编程的控制流程中删除。在声明性语言范式中特别思考:

SQL定义了您想要的东西,而不是如何做到的。如果您可以尝试从精神上删除后者,那么前者将及时跟进。在您的脑海中抽象出这一层,并让MySQL(或Oracle或其他)担心该如何做

应用程序逻辑可以在SQL与PHP中的过程/ OO代码中发生。例如,当对数据库进行查询时,您可以一致地加入一个用户表和一个权限表,以确保适当的权限,而不必进行多个预查询。可以通过类似的选择(insert into ... select ...)而不是命名值来进行插入,以确保数据验证。

无论如何,我强烈建议您专注于Codd原始语,并理解选择,投射,加入,并集和区别。归根结底,这些概念直截了当,您可以通过它们完成80%的工作。其余的可以跟随。


+1为第二段提供了很好的建议,我从来没有那样想过!
JD Isaacks 2010年

2

我发现“掌握”任何东西的最快方法就是挑战自己。收集一组数据并写下您想查询的八到十种不同的东西。您可能希望找到一组学生的平均年龄,该平均年龄按平均成绩四舍五入到最接近的整数。然后为它们编写查询。从一个表开始,然后添加更多表。练习数据联接和内置功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.