首页 > 数据库 >MySQL必知必会(精华提取)

MySQL必知必会(精华提取)

时间:2024-08-15 18:54:29浏览次数:11  
标签:必知 通配符 必会 子句 使用 SQL MySQL WHERE

※食用指南:文章内容为《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

标签:必知,通配符,必会,子句,使用,SQL,MySQL,WHERE
From: https://blog.csdn.net/2401_86505958/article/details/141185649

相关文章

  • 记录一次从mysql到sql的数据库迁移
    使用的是c#+SqlSugar。1.获取表数据///<summary>///获取数据库访问对象///</summary>///<returns></returns>publicSqlSugarClientGetSqlSugar(){SqlSugarClientdb=newSqlSugarClient(newConnectionConfig(){Db......
  • 【MySQL核心】误删除表?帮你时间倒流!!!
    背景开发同事在操作测试库的时候,误删除了一张业务表,她问我能不能帮她找回来,我说滚!!!经不住她的软磨硬泡,我还是软了下来。简述:在真实的业务场景中,有时候误删除表可能不止是将这个表找回来那么简单,还需要经过业务方确认是否要补数据等处理方式。我这里是通过备份+截取binlo......
  • mysql数据库 行级锁,间隙锁和临键锁详解
    目录准备查看锁命令演示普通的select语句共享锁与排他锁无索引行锁升级为表锁间隙锁&临键锁索引上的等值查询(索引为唯一索引)索引上的等值查询(索引为普通索引)索引上的范围查询(唯一索引)准备我的mysql版本是8。CREATETABLE`user`(`id`intunsignedN......
  • 最完整版Linux安装mysql8.0(保姆教程)
    目录前言删除已安装的mysql通过yum源安装mysql前言安装mysql可以通过yum源和压缩包两种方式安装,压缩包安装的mysql通常使用的是旧的SysVinit脚本,使用命令如:servicemysqlstart。如果想要交给服务器的任务管理器管理需要进行额外配置,配置中可能会出现一些问题,推荐使......
  • MySql添加用户权限问题
    MySql添加用户权限问题要为MySQL中的test用户授予所有权限,可以按照以下步骤进行:1.连接到MySQL数据库服务器mysql-uroot-p2.授予root用户所有权限grantallon*.*to'test'@'%'identifiedby'yourpassword'withgrantoption;请注意,上述命令中的lo......
  • mysql或者mariadb修改密码不生效
    /etc/init.d/mysqlstop vim/etc/my.cnf添加skip-grant-tablesmysql-urootusemysql;updateusersetpassword=PASSWORD("mynewpassword")whereUser='root';updateusersetplugin="mysql_native_password";flushprivileges;或者/etc/......
  • 基于PHP+MySQL组合开发的同城二手市场便民小程序源码系统 带完整的安装代码包以及搭建
    系统概述随着消费观念的转变和环保意识的增强,越来越多的人开始选择二手商品作为消费首选。然而,传统的二手交易方式往往存在信息不对称、交易效率低下等问题,严重制约了二手市场的发展。因此,开发一款集信息发布、搜索浏览、在线沟通、安全交易于一体的同城二手市场小程序,显得尤......
  • 【待做】【MySQL安全】内网渗透测试:MySql的利用与提权思路总结
    一、MySQL相关信息收集二、通过MySql获取服务器权限2.1获取MySql连接密码2.2MySQL口令爆破2.3MySQL哈希值爆破2.4从网站泄露的源代码中寻找数据库密码2.5通过MySql向服务器写WebShell2.6利用Unionselect写入WebShell2.7利用分......
  • docker 安装 mysql
    docker安装MySQL命令软件的共享目录统一在 /mydata 目录下安装mysql5.7版本 #docker拉取镜像命令dockerpullmysql:5.7#宿主机新建目录mkdir-p/mydata/mysql/conf/#启动一个临时的mysql容器dockerrun-p3306:3306--namemysql-eMYSQL_ROOT_PASSWORD=root......
  • 基于SpringBoot+MySQL+SSM+Vue.js的药房药品采购系统(附论文)
    获取见最下方名片获取见最下方名片获取见最下方名片演示视频技术描述开发工具:Idea/Eclipse数据库:MySQLJar包仓库:Maven前端框架:Vue/ElementUI后端框架:Spring+SpringMVC+Mybatis+SpringBoot文字描述基于SpringBoot+MySQL+SSM+Vue.js的药房药品采购系统(附论文......