Daniel-Handsome
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note No publishing access yet

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.

      Your account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

      Your team account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

      Explore these features while you wait
      Complete general settings
      Bookmark and like published notes
      Write a few more notes
      Complete general settings
      Write a few more notes
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note No publishing access yet

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.

    Your account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

    Your team account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

    Explore these features while you wait
    Complete general settings
    Bookmark and like published notes
    Write a few more notes
    Complete general settings
    Write a few more notes
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    # MySql 必知必會 ## data ![](https://i.imgur.com/93KDVNC.png) ## WAL https://vicxu.medium.com/%E6%B7%BA%E5%85%A5%E6%B7%BA%E5%87%BA-mysql-ep3-transaction-%E8%A7%A3%E6%9E%90-%E6%96%B0%E5%A2%9E%E4%BF%AE%E6%94%B9%E5%88%AA%E9%99%A4%E6%98%AF%E5%A6%82%E4%BD%95%E8%A2%AB%E8%99%95%E7%90%86%E7%9A%84-380cae2eebca ## case ![](https://i.imgur.com/Q8MTigp.png) ![](https://i.imgur.com/07pbYEk.png) ## 索引 b TREE ![](https://i.imgur.com/uZjIZ19.png) ![](https://i.imgur.com/QL0RgNm.png) 位圖索引 ![](https://i.imgur.com/IzRmx1l.png) ![](https://i.imgur.com/uRtq1mC.png) 文黨索引 ![](https://i.imgur.com/CJKhjE9.png) ## 約束跟索引 ![](https://i.imgur.com/GVb7NBU.png) ## 主键 表中每一行都应该有可以唯一标识自己的一列(或一组列)。一个顾 客表可以使用顾客编号列,而订单表可以使用订单ID,雇员表可以使用 雇员ID或雇员社会保险号。 主键(primary key)①一一列(或一组列),其值能够唯一区分表 中每个行。 唯一标识表中每行的这个列(或这组列)称为主键。主键用来表示 一个特定的行。没有主键,更新或删除表中特定行很困难,因为没有安 全的方法保证只涉及相关的行。 应该总是定义主键 虽然并不总是都需要主键,但大多数数据 ``` 库设计人员都应保证他们创建的每个表具有一个主键,以便于 以后的数据操纵和管理。 ``` ``` 表中的任何列都可以作为主键,只要它满足以下条件:  任意两行都不具有相同的主键值;  每个行都必须具有一个主键值(主键列不允许NULL值)。 ``` `主键值规则 这里列出的规则是MySQL本身强制实施的。` 主键通常定义在表的一列上,但这并不是必需的,也可以一起使用 多个列作为主键。在使用多列作为主键时,上述条件必须应用到构成主 键的所有列,所有列值的组合必须是唯一的(但单个列的值可以不唯一)。 ``` 主键的最好习惯 除MySQL强制实施的规则外,应该坚持的 几个普遍认可的最好习惯为:  不更新主键列中的值;  不重用主键列的值;  不在主键列中使用可能会更改的值。(例如,如果使用一个 名字作为主键以标识某个供应商,当该供应商合并和更改其 名字时,必须更改这个主键。 ``` ## MySql ``` 我们在前一章中介绍了数据库和SQL。正如所述,数据的所有存储、 检索、管理和处理实际上是由数据库软件——DBMS(数据库管理系统) 完成的。MySQL是一种DBMS,即它是一种数据库软件。 ``` ## Select 如果你 Select from 出來的可能都不一樣 **未排序数据** 如果读者自己试验这个查询(selct語句),可能会发现显示输 出的数据顺序与这里的不同。出现这种情况很正常。如果没有 明确排序查询结果(下一章介绍),则返回的数据的顺序没有 特殊意义。返回数据的顺序可能是数据被添加到表中的顺序, 也可能不是。只要返回相同数目的行,就是正常的。 **结束SQL语句** 多条SQL语句必须以分号(;)分隔。MySQL 如同多数DBMS一样,不需要在单条SQL语句后加分号。但特 定的DBMS可能必须在单条SQL语句后加上分号。当然,如果 愿意可以总是加上分号。事实上,即使不一定需要,但加上 分号肯定没有坏处。如果你使用的是mysql命令行,必须加上 分号来结束SQL语句。 **SQL语句和大小写** 请注意,SQL语句不区分大小写,因此 SELECT与select是相同的。同样,写成Select也没有关系。 许多SQL开发人员喜欢对所有SQL关键字使用大写,而对所有 列和表名使用小写,这样做使代码更易于阅读和调试 **使用空格** 在处理SQL语句时,其中所有空格都被忽略。SQL 语句可以在一行上给出,也可以分成许多行。多数SQL开发人 员认为将SQL语句分成多行更容易阅读和调试 **检索多个列** 要想从一个表中检索多个列,使用相同的SELECT语句。唯一的不同 是必须在SELECT关键字后给出多个列名,列名之间必须以逗号分隔。 当心逗号 在选择多个列时,一定要在列名之间加上逗号,但 最后一个列名后不加。如果在最后一个列名后加了逗号,将出 现错误 ## DISTINCT 只能唯一 ![](https://i.imgur.com/6oQctJ9.png) 要放在列前面 不能部分使用DISTINCT DISTINCT关键字应用于所有列而 不仅是前置它的列。如果给出SELECT DISTINCT vend_id, prod_price,除非指定的两个列都不同,否则所有行都将被 检索出来 ## limit 限制結果 ![](https://i.imgur.com/e9woqjK.png) 第一个数为开始 位置,第二个数为要检索的行数 ``` 行0 检索出来的第一行为行0而不是行1。因此,LIMIT 1, 1 将检索出第二行而不是第一行。 ``` ``` 在行数不够时 LIMIT中指定要检索的行数为检索的最大行 数。如果没有足够的行(例如,给出LIMIT 10, 5,但只有13 行),MySQL将只返回它能返回的那么多行。 ``` MySQL 5的LIMIT语法 LIMIT 3, 4的含义是从行4开始的3 行还是从行3开始的4行?如前所述,它的意思是从行3开始的4 行,这容易把人搞糊涂。 由于这个原因,MySQL 5支持LIMIT的另一种替代语法。LIMIT 4 OFFSET 3意为从行3开始取4行,就像LIMIT 3, 4一样 ## order By 如果分组列中包含具有 NULL 值的行,则 NULL 将作为一个分组返回。 如果列中有多行 NULL 值,它们将分为一组 ![](https://i.imgur.com/MbCIMeb.png) ![](https://i.imgur.com/BEuI8r6.png) 不一定要select的才能排序 通过非选择列进行排序 通常,ORDER BY子句中使用的列将 是为显示所选择的列。但是,实际上并不一定要这样,用非 检索的列排序数据是完全合法的 ``` 区分大小写和排序顺序 在对文本性的数据进行排序时,A与 a相同吗?a位于B之前还是位于Z之后?这些问题不是理论问 题,其答案取决于数据库如何设置。 在字典(dictionary)排序顺序中,A被视为与a相同,这是MySQL (和大多数数据库管理系统)的默认行为。但是,许多数据库 管理员能够在需要时改变这种行为(如果你的数据库包含大量 外语字符,可能必须这样做)。 这里,关键的问题是,如果确实需要改变这种排序顺序,用简 单的ORDER BY子句做不到。你必须请求数据库管理员的帮助。 ``` ## WHERE子句操作符 SQL(像多数语言一样)在处理OR操作符前,优先处理AND操 作符。 ![](https://i.imgur.com/rLJcgW0.png) 有between ![](https://i.imgur.com/VAiNj1g.png) ![](https://i.imgur.com/n280K0X.png) 要用and連結 空值檢查 ![](https://i.imgur.com/rdft9co.png) ### IN操作符 ![](https://i.imgur.com/JbZaV5L.png) 为什么要使用IN操作符?其优点具体如下。 * 在使用长的合法选项清单时,IN操作符的语法更清楚且更直观。 * 在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。 * IN操作符一般比OR操作符清单执行更快。 * IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建 立WHERE子句。第14章将对此进行详细介绍。 IN WHERE子句中用来指定要匹配值的清单的关键字,功能与OR 相当 ### NOT操作符 在where後面 跟in那些一樣 为什么使用NOT?对于简单的WHERE子句,使用NOT确实没有什么优 势。但在更复杂的子句中,NOT是非常有用的。例如,在与IN操作符联合 使用时,NOT使找出与条件列表不匹配的行非常简单 ``` MySQL中的NOT MySQL支持使用NOT对IN、BETWEEN和 EXISTS子句取反,这与多数其他DBMS允许使用NOT对各种条件 取反有很大的差别。 ``` ## 通識符 ![](https://i.imgur.com/Ei0sli7.png) ![](https://i.imgur.com/yFg2r15.png) ![](https://i.imgur.com/HeCsaL8.png) 区分大小写 根据MySQL的配置方式,搜索可以是区分大小 写的。如果区分大小写,'jet%'与JetPack 1000将不匹配 可以用 like binary 二進制的會只會找一樣的 但這個 也可以用 sounds like ![](https://i.imgur.com/J639i96.png) 使用通配符的技巧 正如所见,MySQL的通配符很有用。但这种功能是有代价的:通配 符搜索的处理一般要比前面讨论的其他搜索所花时间更长。这里给出一 些使用通配符要记住的技巧。 1.  不要过度使用通配符。如果其他操作符能达到相同的目的,应该 使用其他操作符。 1.  在确实需要使用通配符时,除非绝对有必要,否则不要把它们用 在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起 来是最慢的。 1.  仔细注意通配符的位置。如果放错地方,可能不会返回想要的数 ## 用正则表达式 进行搜索 ### 基本字符匹配 Like 換成 REGEXP ![](https://i.imgur.com/3LbWgcj.png) ![](https://i.imgur.com/zHnBISv.png) LIKE匹配整个列。如果被匹配的文本在列值中出现 REGEXP在列值内进行匹配,如果被匹配的文本在 列值中出现 那么,REGEXP能不能用来匹配整个列值(从而起与LIKE相同的作用)?答案是肯定的,使用^和$定位符(anchor)即可, 本章后面介绍。 ``` 匹配不区分大小写 MySQL中的正则表达式匹配(自版本 3.23.4后)不区分大小写(即,大写和小写都匹配)。为区分大 小写,可使用BINARY关键字,如WHERE prod_name REGEXP BINARY 'JetPack .000'。 ``` ### 进行OR匹配 用 | ![](https://i.imgur.com/Mo3vfUv.png) []是另一种形式的OR语句。事实上,正则表达式[123]Ton 为[1|2|3]Ton的缩写,也可以使用后者。但是,需要用[]来定义OR语句 查找什么。为更好地理解这一点 ![](https://i.imgur.com/ClZu8J0.png) ### 匹配特殊字符 为了匹配特殊字符,必须用\\为前导。\\-表示查找-,\\.表示查找.。 注意注意 ![](https://i.imgur.com/VylszcV.png) ## 创建计算字段 存储在数据库表中的数据一般不是应用程序所需要的格式。下面举 几个例子。 1.  如果想在一个字段中既显示公司名,又显示公司的地址,但这两个信息一般包含在不同的表列中。 1.  城市、州和邮政编码存储在不同的列中(应该这样),但邮件标签 打印程序却需要把它们作为一个恰当格式的字段检索出来。 1.  列数据是大小写混合的,但报表程序需要把所有数据按大写表示 出来。 3.  物品订单表存储物品的价格和数量,但不需要存储每个物品的总价格(用价格乘以数量即可)。为打印发票,需要物品的总价 格。 5.  需要根据表数据进行总数、平均数计算或其他计算。 计算字段是运行时在SELECT语句 内创建的 `拼接(concatenate) 将值联结到一起构成单个值。` ``` MySQL的不同之处 多数DBMS使用+或||来实现拼接, MySQL则使用Concat()函数来实现。当把SQL语句转换成 MySQL语句时一定要把这个区别铭记在心 ``` ![](https://i.imgur.com/wHDEJY1.png) ## 函數 用于处理文本串(如删除或填充值,转换值为大写或小写 用于在数值数据上进行算术操作(如返回绝对值,进行代数运算) 的数值函数。 用于处理日期和时间值并从这些值中提取特定成分(例如,返回 两个日期之差,检查日期有效性等)的日期和时间函数。 返回DBMS正使用的特殊信息(如返回用户登录信息,检查版本 细节)的系统函数 **表11-1 常用的文本处理函数** 函 数 说 明 1. Left() 返回串左边的字符 1. Length() 返回串的长度 1. Locate() 找出串的一个子串 1. Lower() 将串转换为小写 1. LTrim() 去掉串左边的空格 1. Right() 返回串右边的字符 1. RTrim() 去掉串右边的空格 1. Soundex() 返回串的SOUNDEX值 1. SubString() 返回子串的字符 1. Upper() 将串转换为大写 ![](https://i.imgur.com/frZyAjL.png) ### 日期和时间处理函数 * AddDate() 增加一个日期(天、周等) * AddTime() 增加一个时间(时、分等) * CurDate() 返回当前日期 * CurTime() 返回当前时间 * Date() 返回日期时间的日期部分 * DateDiff() 计算两个日期之差 * Date_Add() 高度灵活的日期运算函数 * Date_Format() 返回一个格式化的日期或时间串 * Day() 返回一个日期的天数部分 * DayOfWeek() 对于一个日期,返回对应的星期几 * Hour() 返回一个时间的小时部分 * Minute() 返回一个时间的分钟部分 * Month() 返回一个日期的月份部分 * Now() 返回当前日期和时间 * Second() 返回一个时间的秒部分 * Time() 返回一个日期时间的时间部分 * Year() 返回一个日期的年份部 使用`WHERE order_date = '2005-09-01'`可靠吗?``` ``` order_ date ``` 的数据类型为datetime。这种类型存储日期及时间值。样例表中 的值全都具有时间值00:00:00,但实际中很可能并不总是这样。如果 用当前日期和时间存储订单日期(因此你不仅知道订单日期,还知道 下 订 单 当 天 的 时 间 ), 怎 么 办 ? 比 如 , 存 储 的 order_date 值 为 `2005-09-01 11:30:05`,则`WHERE order_date = '2005-09-01'`失败。 即使给出具有该日期的一行,也不会把它检索出来,因为WHERE匹配失 败。 解决办法是指示MySQL仅将给出的日期与列中的日期部分进行比 较,而不是将给出的日期与整个列值进行比较。为此,必须使用Date() 函数。Date(order_date)指示MySQL仅提取列的日期部分, ![](https://i.imgur.com/Psj2fCJ.png) ### SQL聚集函数 ![](https://i.imgur.com/MvU8Jor.png) * AVG() 返回某列的平均值 * COUNT() 返回某列的行数 * MAX() 返回某列的最大值 * MIN() 返回某列的最小值 * SUM() 返回某列值之和 #### **AVG** 只用于单个列 AVG()只能用来确定特定数值列的平均值,而 且列名必须作为函数参数给出。为了获得多个列的平均值, 必须使用多个AVG()函数。 NULL值 AVG()函数忽略列值为NULL的行。 **COUNT()函数** 进行计数。可利用COUNT()确定表中行的数目或符合特 定条件的行的数目。 COUNT()函数有两种使用方式。 * 使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是空 值(NULL)还是非空值。 * 使用COUNT(column)对特定列中具有值的行进行计数,忽略 NULL值 **MAX()函数** 对非数值数据使用MAX() 虽然MAX()一般用来找出最大的 数值或日期值,但MySQL允许将它用来返回任意列中的最大 值,包括返回文本列中的最大值。在用于文本数据时,如果数 据按相应的列排序,则MAX()返回最后一行。 NULL值 MAX()函数忽略列值为NULL的行 **MIN()函数** 跟max一樣 **SUM()函数** ![](https://i.imgur.com/bKSrVak.png) 在多个列上进行计算 如本例所示,利用标准的算术操作符, 所有聚集函数都可用来执行多个列上的计算。 **涵式中用DISTINCT** ![](https://i.imgur.com/URnIUuX.png) ``` 如果指定列名,则DISTINCT只能用于COUNT()。 DISTINCT不能用于COUNT(*),因此不允许使用COUNT(DISTINCT), 否则会产生错误。类似地,DISTINCT必须使用列名,不能用 于计算或表达式。 将DISTINCT用于MIN()和MAX() 虽然DISTINCT从技术上可 用于MIN()和MAX(),但这样做实际上没有价值。一个列中的 最小值和最大值不管是否包含不同值都是相同的。 ``` **组合聚集函数** ![](https://i.imgur.com/ZsAZSmS.png) ##  分 组 数 据 分组数据,以便能汇总表内容的子集。这涉及两个 新SELECT语句子句,分别是GROUP BY子句和HAVING子句 ### group By GROUP BY子句可以包含任意数目的列。这使得能对分组进行嵌套, 为数据分组提供更细致的控制。  如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上 进行汇总。换句话说,在建立分组时,指定的所有列都一起计算 (所以不能从个别的列取回数据)。  GROUP BY子句中列出的每个列都必须是检索列或有效的表达式 (但不能是聚集函数)。如果在SELECT中使用表达式,则必须在 GROUP BY子句中指定相同的表达式。不能使用别名。  除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子 句中给出。  如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列 中有多行NULL值,它们将分为一组。  GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前 **ROLLUP** ROLLUP是GROUP BY子句的擴充套件。 ROLLUP選項允許包含表示小計的額外行,通常稱為超級聚合行,以及總計行。 通過使用ROLLUP選項,可以使用單個查詢生成多個分組集。 ROLL UP 搭配 GROUP BY 使用,可以为每一个分组返回一个小计行,为所有分组返回一个总计行 https://zhuanlan.zhihu.com/p/58639733 **HAVING** 因为WHERE过滤指定的是行而不是分组。事实 上,WHERE没有分组的概念。 那么,不使用WHERE使用什么呢?MySQL为此目的提供了另外的子 句,那就是HAVING子句。HAVING非常类似于WHERE。事实上,目前为止所 学过的所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是 WHERE过滤行,而HAVING过滤分组 **不要忘记ORDER BY 一般在使用GROUP BY子句时,应该也给 出ORDER BY子句。这是保证数据正确排序的唯一方法。千万 不要仅依赖GROUP BY排序数据。** https://www.1keydata.com/tw/sql/sqlhaving.html 請讀者注意: 如果被 SELECT 的只有函數欄, 那就不需要 GROUP BY 子句 ## subQuery 子查詢 ``` 相关子查询(correlated subquery) 涉及外部查询的子查询。 这种类型的子查询称为相关子查询。任何时候只要列名可能有多义 性,就必须使用这种语法(表名和列名由一个句点分隔) ``` ## 拼接字串 ![](https://i.imgur.com/0sfc8S2.png) ![](https://i.imgur.com/uzxwj11.png) ![](https://i.imgur.com/oIXzPBM.png) ## 算法操作符 ![](https://i.imgur.com/8AtwD9c.png) ![](https://i.imgur.com/mbaiI3O.png) ![](https://i.imgur.com/IYUEr0O.png) ## 联结 现在,假如有由同一供应商生产的多种物品,那么在何处存储供应 商信息(如,供应商名、地址、联系方法等)呢?将这些数据与产品信 息分开存储的理由如下。 *  因为同一供应商生产的每个产品的供应商信息都是相同的,对每 个产品重复此信息既浪费时间又浪费存储空间。 *  如果供应商信息改变(例如,供应商搬家或电话号码变动),只需 改动一次即可。 *  如果有重复数据(即每种产品都存储供应商信息),很难保证每次 输入该数据的方式都相同。不一致的数据在报表中很难利用。 ``` 完全限定列名 在引用的列可能出现二义性时,必须使用完 全限定列名(用一个点分隔的表名和列名)。如果引用一个 没有用表名限制的具有二义性的列名,MySQL将返回错误。 ``` ``` 笛卡儿积(cartesian product) 由没有联结条件的表关系返回 的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘 以第二个表中的行数。 ``` ### 等值連結 等值联结(equijoin),它基于两个表之间的 相等测试。这种联结也称为内部联结。其实,对于这种联结可以使用稍 ![](https://i.imgur.com/T9nDfoz.png) 上面等於下面 用where過濾兩個表的inner 等於 下面用on的用法 ![](https://i.imgur.com/62Pb2qk.png) 此语句中的SELECT与前面的SELECT语句相同,但FROM子句不 同。这里,两个表之间的关系是FROM子句的组成部分,以INNER JOIN指定。在使用这种语法时,联结条件用特定的ON子句而不是WHERE 子句给出。传递给ON的实际条件与传递给WHERE的相同。 ### 自联结 用自联结而不用子查询 自联结通常作为外部语句用来替代 从相同表中检索数据时使用的子查询语句。虽然最终的结果是 相同的,但有时候处理联结远比处理子查询快得多。应该试一 下两种方法,以确定哪一种的性能更好 无论何时对表进行联结,应该至少有一个列出现在不止一个表中(被 联结的列)。标准的联结(前一章中介绍的内部联结)返回所有数据,甚 至相同的列多次出现。自然联结排除多次出现,使每个列只返回一次 Jim Jones 同一公司的所有顾客发送一封信件。这个查询要求 首先找出 Jim Jones 工作的公司,然后找出在该公司工作的顾客 subquery ![](https://i.imgur.com/hD5eDjT.png) ![](https://i.imgur.com/1bCwY1Q.png) ![](https://i.imgur.com/odvANRF.png) ### 外部联结 许多联结将一个表中的行与另一个表中的行相关联。但有时候会需 要包含没有关联行的那些行。例如,可能需要使用联结来完成以下工作:  对每个客户下了多少订单进行计数,包括那些至今尚未下订单的 客户;  列出所有产品以及订购数量,包括没有人订购的产品;  计算平均销售规模,包括那些至今尚未下订单的客户。 在上述例子中,联结包含了那些在相关表中没有关联行的行。这种 类型的联结称为外部联结 inner是内联结 ## 组 合 查 询 多数SQL查询都只包含从一个或多个表中返回数据的单条SELECT语 句。MySQL也允许执行多个查询(多条SELECT语句),并将结果作为单个 查询结果集返回。这些组合查询通常称为并(union)或复合查询 (compound query)。 ## UNION规则 并(union)或复合查询 (compound query) 主要有两种情况需要使用组合查询:  在一个查询中从不同的表返回结构数据;  对一个表执行多个查询,按一个查询返回数据 UNION必须由两条或两条以上的SELECT语句组成,语句之间用关 键字UNION分隔(因此,如果组合4条SELECT语句,将要使用3个 UNION关键字)。  UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出)。  列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以 隐含地转换的类型(例如,不同的数值类型或不同的日期类型)。 UNION从查询结果集中自动去除了重复的行(换句话说,它的行为与 单条SELECT语句中使用多个WHERE子句条件一样)。 ## 插 入 数 据 不好 ![](https://i.imgur.com/wkDpvwR.png) 好 ![](https://i.imgur.com/ZC3eN1q.png) column跟 value都要完整 其优点是,即使表的结构改变, 此INSERT语句仍然能正确工作 ``` 总是使用列的列表 一般不要使用没有明确给出列的列表的 INSERT语句。使用列的列表能使SQL代码继续发挥作用,即使 表结构发生了变化。 ``` ## update ![](https://i.imgur.com/fn2cVO7.png) 從表名開始 set 欄位 然後Where指定 ## view ### 为什么使用视图 我们已经看到了视图应用的一个例子。下面是视图的一些常见应用。  重用SQL语句。  简化复杂的SQL操作。在编写查询后,可以方便地重用它而不必 知道它的基本查询细节。  使用表的组成部分而不是整个表。  保护数据。可以给用户授予表的特定部分的访问权限而不是整个 表的访问权限。  更改数据格式和表示。视图可返回与底层表的表示和格式不同的 数据 ### 视图的规则和限制 下面是关于视图创建和使用的一些最常见的规则和限制。  与表一样,视图必须唯一命名(不能给视图取与别的视图或表相 同的名字)。  对于可以创建的视图数目没有限制。  为了创建视图,必须具有足够的访问权限。这些限制通常由数据 库管理人员授予。  视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造 一个视图。  ORDER BY可以用在视图中,但如果从该视图检索数据SELECT中也 含有ORDER BY,那么该视图中的ORDER BY将被覆盖。  视图不能索引,也不能有关联的触发器或默认值。  视图可以和表一起使用。例如,编写一条联结表和视图的SELECT 语句。 ## 视图的创建。  视图用CREATE VIEW语句来创建。  使用SHOW CREATE VIEW viewname;来查看创建视图的语句。  用DROP删除视图,其语法为DROP VIEW viewname;。  更新视图时,可以先用DROP再用CREATE,也可以直接用CREATE OR REPLACE VIEW。如果要更新的视图不存在,则第2条更新语句会创 建一个视图;如果要更新的视图存在,则第2条更新语句会替换原 有视图 ## 利用视图简化复杂的联结 视图的最常见的应用之一是隐藏复杂的SQL,这通常都会涉及联结 ###### tags: `MySql`

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password
    or
    Sign in via Facebook Sign in via X(Twitter) Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    By signing in, you agree to our terms of service.

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully