※食用指南:文章内容为《MySQL必知必会》此书个人HIGHLIGHT的文字(部分章节没有)、书中所有表格的汇总,建议小白先跟着视频学完一遍之后再来看此书,更易理解的同时达到查漏补缺的效果。
推荐学习的视频:
【中字】SQL进阶教程 | 史上最易懂SQL教程!10小时零基础成长SQL大师!!https://www.bilibili.com/video/BV1UE41147KC/?spm_id_from=333.1007.0.0&vd_source=b287f1f4a1fa54cc438e31a0f87ef4e2
本人的笔记专栏:
MySQL干货笔记(近4万字)——PAULEENHUIhttp://t.csdnimg.cn/vouUr
目录:
第一章:了解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
标签:必知,通配符,必会,子句,使用,SQL,MySQL,WHERE From: https://blog.csdn.net/2401_86505958/article/details/141185649