MySQL必知必会(精华提取)

※食用指南:文章内容为《MySQL必知必会》此书个人HIGHLIGHT的文字(部分章节没有)、书中所有表格的汇总,建议小白先跟着视频学完一遍之后再来看此书,更易理解的同时达到查漏补缺的效果。

推荐学习的视频:

【中字】SQL进阶教程 | 史上最易懂SQL教程!10小时零基础成长SQL大师!!icon-default.png?t=N7T8https://www.bilibili.com/video/BV1UE41147KC/?spm_id_from=333.1007.0.0&vd_source=b287f1f4a1fa54cc438e31a0f87ef4e2

本人的笔记专栏:

MySQL干货笔记(近4万字)——PAULEENHUIicon-default.png?t=N7T8http://t.csdnimg.cn/vouUr

目录:

第一章:了解SQL

误用导致混淆

主键的最好习惯(除MySQL强制实施的规则外)

DBMS专用的SQL

第三章:使用MySQL

DESCRIBE语句 

进一步了解SHOW 

第四章:检索单个列

结束SQL语句

使用通配符

不能部分使用DISTINCT

行0 

第五章:排序检索数据

通过非选择列进行排序

第六章:WHERE子句操作符

何时使用引号

第七章:数据过滤

在WHERE子句中使用圆括号

使用IN的优点

MySQL 中的NOT

第八章:用通配符进行过滤

谓词

注意尾空格

注意NULL

通配符的代价

使用通配符的技巧

第九章:用正则表达式进行搜索

匹配不区分大小写

一般来说LIKE匹配整个列

LIKE和REGEXP的不同

正则表达式测试

第十章:创建计算字段

MySQL的不同之处

第十一章:使用数据处理函数

函数没有SQL的可移植性强

SOUNDEX

如果要的是日期,请使用Date()

获得某月下的所有订单的方法

第十二章:汇总数据

只用于单个列

NULL值

DISTINCT

第十三章:分组数据

GROUP BY子句的规定

HAVING支持所有WHERE操作符

第十五章:联结表

不要忘了WHERE子句

第十八章:全文本搜索

第十九章:插入数据

总是使用列的列表

第二十一章:创建和操作表

引擎

第二十八章:创建和操作表

附录D:MySQL数据类型


第一章:了解SQL

误用导致混淆

人们通常用数据库这个术语来代表他们使用的数据库软件。这是不正确的,它是引起混淆的根源。

数据库软件应称为DBMS(数据库管理系统)。

数据库是通过DBMS创建和操纵的容器。

使用的是DBMS,它替你访问数据库。

主键的最好习惯(除MySQL强制实施的规则外)

不更新主键列中的值;

不重用主键列的值;

不在主键列中使用可能会更改的值。(如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其名字时,必须更改这个主键。)

DBMS专用的SQL

SQL不是一种专利语言,而且存在一个标准委员会,他们试图定义可供所有DBMS使用的SQL语法,但事实上任意两个DBMS实现的SQL都不完全相同。

本书讲授的SQL是专门针对MySQL的,虽然书中所讲授的多数语法也适用于其他DBMS,这些SQL语法不是完全可移植的

第三章:使用MySQL

DESCRIBE语句 

MySQL支持用DESCRIBE作为SHOW COLUMNS

FROM的一种快捷方式。换句话说,DESCRIBE customers;是 SHOW COLUMNS FROM customers;的一种快捷方式。

进一步了解SHOW 

请在mysql命令行实用程序中,执行命令

HELP SHOW;显示允许的SHOW语句。

第四章:检索单个列

结束SQL语句

多条SQL语句必须以分号(;)分隔。

MySQL如同多数DBMS一样,不需要在单条SQL语句后加分号

但特定的DBMS可能必须在单条SQL语句后加上分号。

当然,如果愿意可以总是加上分号。事实上,即使不一定需要,但加上分号肯定没有坏处。

如果你使用的是mysql命令行,必须加上分号来结束SQL语句。

使用通配符

一般,除非你确实需要表中的每个列,否则最好别使用*通配符

虽然使用通配符可能会使你自己省事,不用明确列出所需列,但检索不需要的列通常会降低检索和应用程序的性能。

不能部分使用DISTINCT

DISTINCT关键字应用于所有列而不仅是前置它的列。

如果给出SELECT DISTINCT vend_id, prod_price,除非指定的两个列都不同,否则所有行都将被检索出来。

行0 

检索出来的第一行为行0而不是行1。

因此,LIMIT 1, 1  将检索出第二行而不是第一行。

第五章:排序检索数据

通过非选择列进行排序

通常,ORDER BY子句中使用的列将是为显示所选择的列。但是,实际上并不一定要这样,用非检索的列排序数据是完全合法的。

在多个列上降序排序 如果想在多个列上进行降序排序,必须对每个列指定DESC关键字

第六章:WHERE子句操作符

何时使用引号

如果仔细观察上述WHERE子句中使用的条件,会看到有的值括在单引号内(如前面使用的'fuses'),而有的值未括起来。

单引号用来限定字符串。

如果将值与串类型的列进行比较,则需要限定引号。

用来与数值列进行比较的值不用引号。

第七章:数据过滤

在WHERE子句中使用圆括号

任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。

不要过分依赖默认计算次序,即使它确实是你想要的东西也是如此。使用圆括号没有什么坏处,它能消除歧义。

使用IN的优点

①在使用长的合法选项清单时,IN操作符的语法更清楚且更直观。

②在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。

③IN操作符一般比OR操作符清单执行更快。

⑤IN的最大优点:可以包含其他SELECT语句,使得能够更动态地建立WHERE子句。

MySQL 中的NOT

MySQL 支持使用NOT 对IN 、BETWEEN 和 EXISTS子句取反,这与多数其他DBMS允许使用NOT对各种条件取反有很大的差别

第八章:用通配符进行过滤

谓词

操作符在它作为谓词(predi- cate)时, 不是操作符。

从技术上说,LIKE是谓词而不是操作符。虽然最终的结果是相同的,但应该对此术语有所了解,以免在SQL文档中遇到此术语时不知道。

注意尾空格

尾空格可能会干扰通配符匹配。

例如,在保存词 anvil 时, 如果它后面有一个或多个空格,则子句WHERE prod_name LIKE '%anvil'将不会匹配它们,因为在最后的l后有多余的字符。

解决办法:在搜索模式最后附加一个%。(最好是使用函数去掉首尾空格)

注意NULL

虽然似乎%通配符可以匹配任何东西,但有一个例外,即NULL。

即使是WHERE prod_name LIKE '%'也不能匹配用值NULL作为产品名的行。

通配符的代价

搜索的处理一般要比前面讨论的其他搜索所花时间更长。

使用通配符的技巧

①不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。

②在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。

③仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据

第九章:用正则表达式进行搜索

MySQL仅支持多数正则表达式实现的一个很小的子集

匹配不区分大小写

MySQL中的正则表达式匹配不区分大小写(即,大写和小写都匹配)。

为区分大小写,可使用BINARY关键字,如WHERE prod_name REGEXP BINARY 'JetPack .000'。

一般来说LIKE匹配整个列

如果被匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不被返回(除非使用通配符)。REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。这是一个非常重要的差别。

LIKE和REGEXP的不同

LIKE匹配整个串

REGEXP匹配子串

利用定位符,通过用^开始每个表达式,用$结束每个表达式,可以使REGEXP的作用和LIKE一样

正则表达式测试

可以在不使用数据库表的情况下用 SELECT来测试正则表达式。

REGEXP检查总是返回0(没有匹配)或1(匹配)。可以用带文字串的REGEXP来测试表达式,并试验它们。相应的语法如下:

这个例子显然将返回0(因为文本hello中没有数字)。

第十章:创建计算字段

MySQL的不同之处

多数DBMS使用+或||来实现拼接,

MySQL则使用Concat()函数来实现。

当把SQL语句转换成 MySQL语句时一定要把这个区别铭记在心。

第十一章:使用数据处理函数

函数没有SQL的可移植性强

能运行在多个系统上的代码称为可移植的(portable)

多数SQL语句是可移植的,在SQL实现之间有差异时,这些差异通常不那么难处理。

函数的可移植性不强。几乎每种主要的DBMS的实现都支持其他实现不支持的函数,而且有时差异还很大。

为了代码的可移植,许多SQL程序员不赞成使用特殊实现的功能。虽然这样做很有好处,但不总是利于应用程序的性能。

如果不使用这些函数,编写某些应用程序代码会很艰难。必须利用其他方法来实现DBMS非常有效地完成的工作。

如果你决定使用函数,应该保证做好代码注释,以便以后你(或其他人)能确切地知道所编写SQL代码的含义。

SOUNDEX

是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。

SOUNDEX考虑了类似的发音字符和音节,使得能对串进行发音比较而不是字母比较。

虽然 SOUNDEX不是SQL概念,但MySQL(就像多数DBMS一样)都提供对 SOUNDEX的支持。

customers表中有一个顾客Coyote Inc.,其联系名为Y.Lee。但如果这是输入错误,此联系名实际应该是Y.Lie

如果要的是日期,请使用Date()

如果你想要的仅是日期,则使用Date()是一个良好的习惯,即使你知道相应的列只包含日期也是如此。这样,如果由于某种原因表中以后有日期和时间值,你的SQL代码也不用改变。当然,也存在一个Time()函数,在你只想要时间时应该使用它

获得某月下的所有订单的方法

如果你想检索出2005年9月下的所有订单

不需要记住每个月中有多少天或不需要操心闰年2月的办法

Year()是一个从日期(或日期时间)中返回年份的函数。类似, Month()从日期中返回月份。

第十二章:汇总数据

只用于单个列

()只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出。为了获得多个列的平均值,必须使用多个AVG()函数。

NULL值

如果指定列名,则指定列的值为空的行被COUNT()函数忽略,但如果COUNT()函数中用的是星号(*),则不忽略。

DISTINCT

如果指定列名,则DISTINCT只能用于COUNT()。DISTINCT不能用于COUNT(*),因此不允许使用COUNT(DISTINCT),否则会产生错误。类似地,DISTINCT必须使用列名,不能用于计算或表达式。

第十三章:分组数据

GROUP BY子句的规定

①GROUP BY子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制。

②如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别的列取回数据)。

③GROUP  BY子句中列出的每个列都必须是检索列或有效的表达式

(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在

GROUP BY子句中指定相同的表达式。不能使用别名。

④除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出。

⑤如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。

⑥GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。

HAVING支持所有WHERE操作符

目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代。

唯一的差别是:WHERE过滤行HAVING过滤分组

第十五章:联结表

不要忘了WHERE子句

应该保证所有联结都有WHERE子句,否则MySQL将返回比想要的数据多得多的数据。

同理,应该保证WHERE子句的正确性。不正确的过滤条件将导致MySQL返回不正确的数据。

第十八章:全文本搜索

第十九章:插入数据

总是使用列的列表

一般不要使用没有明确给出列的列表的 INSERT语句。

使用列的列表能使SQL代码继续发挥作用,即使表结构发生了变化。

第二十一章:创建和操作表

引擎

①InnoDB是一个可靠的事务处理引擎(参见第26章),它不支持全文本搜索;

②MEMORY在功能等同于MyISAM,但由于数据存储在内存(不是磁盘)中,速度很快(特别适合于临时表);

③MyISAM是一个性能极高的引擎,它支持全文本搜索(参见第18章),但不支持事务处理。

第二十八章:创建和操作表

附录D:MySQL数据类型

————END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值