实习-------数据库基础

news2024/11/18 9:20:48

检索数据

1、如果使用DISTINCT关键字,它必须直接放在列名的前面。不能部分使用DISTINCT,DISTINCT关键字应用于所有列而不仅是前置它的列

例如:SELECT DISTINCT vend_id告诉MySQL只返回不同(唯一)的vend_id行

 2、带一个值的LIMIT总是从第一行开始,给出的数为返回的行数(例如LIMIT 5表示从第一行开始,读取五条数据)。带两个值的LIMIT可以指定从行号为第一个值的位置开始(例如LIMIT 5, 5表示从第六行开始,读取5条数据),检索出来的第一行为行0而不是行1。因此,LIMIT 1, 1将检索出第二行而不是第一行,LIMIT 4 OFFSET 3意为从行3开始取4行,就像LIMIT 3, 4一样

排序检索数据

1、对英文列用ORDER BY子句那么就会以字母顺序排序数据

2、为了实现按多个列排序,只要指定列名,列名之间用逗号分开即可

仅在多个行具有相同的prod_price 值时才对产品按prod_name进行排序。如果prod_price列中所有的值都是唯一的,则不会按prod_name排序。

 3、数据排序不限于升序排序(从A到Z)。这只是默认的排序顺序,还可以使用ORDER BY子句以降序(从Z到A)顺序排序。为了进行降序排序, 必须指定DESC关键字

 

 DESC关键字只应用到直接位于其前面的列名。在上例中,只对prod_price 列指定DESC ,对prod_name 列不指定。因此, prod_price列以降序排序,而prod_name列(在每个价格内)仍然按标准的升序排序。

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

5、ORDER BY子句的位置 在给出ORDER BY子句时,应该保证它位于FROM子句之后。如果使用LIMIT,它必须位于ORDER BY 之后,否则将会产生错误

过滤数据

1、在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后,否则将会产生错误

2、 WHERE子句操作符

3、MySQL在执行匹配时默认不区分大小写 

  检查WHERE prod_name=‘fuses’语句,它返回prod_name的值为Fuses的一行。MySQL在执行匹配时默认不区分大小写,所以fuses与Fuses匹配。

4、NULL是无值(no value),它与字段包含0、空字符串或仅仅包含空格不同。SELECT语句有一个特殊的WHERE子句,可用来检查具有NULL值的列。  这个WHERE子句就是IS NULL子句

 这条语句返回没有价格(空prod_price字段,不是价格为0)的所有产品 

数据过滤

1、SQL(像多数语言一样)在处理OR操作符前,优先处理AND操作符。当SQL看到下述WHERE子句时,它理解为由供应商1003制造的任何价格为10美元(含)以上的产品,或者由供应商1002制造的任何产品。换句话说,由于AND在计算次序中优先级更高

  2、IN在WHERE子句中用来指定要匹配值的清单的关键字,功能与OR相当,IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句

用通配符进行过滤

1、最常使用的通配符是百分号(%),%告诉MySQL接受jet之后的任意字符,不管它有多少字符。%匹配区分大小写 ,根据MySQL的配置方式,搜索可以是区分大小写的。如'jet%'与JetPack 1000将不匹配。

2、搜索模式'%anvil%'表示匹配任何位置包含文本anvil的值,而不论它之前或之后出现什么字符

3、重要的是要注意到,除了一个或多个字符外,%还能匹配0个字符。% 代表搜索模式中给定位置的0个、1个或多个字符

4、注意NULL ,虽然似乎%通配符可以匹配任何东西,但有一个例外,即NULL。即使是WHERE prod_name LIKE '%'也不能匹配用值NULL作为产品名的行。

5、下划线的用途与%一样,但下划线只匹配单个字符而不是多个字符。

6、正如所见,MySQL的通配符很有用。但这种功能是有代价的:通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长。这里给出一些使用通配符要记住的技巧。

  • 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
  • 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。
  • 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。

用正则表达式进行搜索

1、下面的语句检索列prod_name包含 文本1000的所有行:

除关键字LIKEREGEXP替代外,这条语句看上去非常像使用 LIKE的语句。它告诉MySQLREGEXP后所跟的东西作为正则表达式(与文字正文1000匹配的一个正则表达式)处理。

 这里使用了正则表达式.000.是正则表达式语言中一个特殊 的字符。它表示匹配任意一个字符,因此,10002000都匹配且返回。

2、MySQL中的正则表达式匹配(自版本 3.23.4后)不区分大小写(即,大写和小写都匹配)。为区分大 小写,可使用BINARY关键字,如WHERE prod_name REGEXP BINARY 'JetPack .000'。

3、为搜索两个串之一(或者为这个串,或者为另一个串),使用|,如 下所示:

语句中使用了正则表达式 1000|2000 | 为正则表达式的 OR 操作 符。它表示匹配其中之一 ,因此 1000 2000 都匹配并返回。

4、匹配任何单一字符。但是,如果你只想匹配特定的字符,怎么办?可通过指定一组用[和]括起来的字符来完成,如下所示:

这里使用了正则表达式 [123] Ton [123] 定义一组字符,它 的意思是匹配1 2 3 ,因此, 1 ton 2 ton都匹配且返回(没有返回3 ton是因为没这个数据)。
正如所见, [] 是另一种形式的 OR 语句。事实上,正则表达式 [123]Ton 为[1|2|3]Ton 的缩写,也可以使用后者。
这并不是期望的输出。两个要求的行被检索出来,但还检索出 了另外3 行。之所以这样是由于 MySQL 假定你的意思是 '1' 或 '2'或 '3 ton' 。除非把字符 | 括在一个集合中,否则它将应用于整个串。
字符集合也可以被否定,即它们将匹配除指定字符外的任何东西。 为否定一个字符集,在集合的开始处放置一个^ 即可。因此,尽管 [123] 匹配字符1 2 3 ,但 [^123] 却匹配除这些字符外的任何东西。

 5、集合可用来定义要匹配的一个或多个字符。例如,下面的集合将匹配数字09

 6、正则表达式语言由具有特定含义的特殊字符构成。我们已经看到.[]、 |和-等,还有其他一些字符。请问,如果你需要匹配这些字符,应该怎么办呢?例如,如果要找出包含.字符的值,怎样搜索?请看下面的例子:

 

7、存在找出你自己经常使用的数字、所有字母字符或所有数字字母字 符等的匹配。为更方便工作,可以使用预定义的字符集,称为字符类 (character class )。表 9-2 列出字符类以及它们的含义。

 

 8、目前为止使用的所有正则表达式都试图匹配单次出现。如果存在一 个匹配,该行被检索出来,如果不存在,检索不出任何行。但有时需要 对匹配的数目进行更强的控制。例如,你可能需要寻找所有的数,不管 数中包含多少数字,或者你可能想寻找一个单词并且还能够适应一个尾 随的s(如果存在)等等。 这可以用表9-3列出的正则表达式重复元字符来完成。

 

9、目前为止的所有例子都是匹配一个串中任意位置的文本。为了匹配特定位置的文本,需要使用表9-4列出的定位符。

 

 

使用数据处理函数

1、Upper()将文本转换为大写

2、些常用的文本处理函数

 SOUNDEX是一个将任何文 本串转换为描述其语音表示的字母数字模式的算法。SOUNDEX考虑了类似 的发音字符和音节,使得能对串进行发音比较而不是字母比较。虽然 SOUNDEX不是SQL概念,但MySQL(就像多数DBMS一样)都提供对SOUNDEX的支持

3、常用的日期和时间处理函数

 

 首先需要注意的是MySQL使用的日期格式。无论你什么时候指定一个日期,不管是插入或更新表值还是用WHERE子句进行过滤,日期必须为 格式yyyy-mm-dd。因此,200591日,给出为2005-09-01。虽然其他的 日期格式可能也行,但这是首选的日期格式,因为它排除了多义性(如04/05/06是200654日或200645日或200456日或……)

 

 

 4、常用的数值处理函数

 

 汇总数据

1、AVG()通过对表中行数计数并计算特定列值之和,求得该列的平均 值。AVG()可用来返回所有列的平均值,也可以用来返回特定列或行的平均值。

AVG() 只能用来确定特定数值列的平均值,而 且列名必须作为函数参数给出。为了获得多个列的平均值, 必须使用多个AVG()函数。AVG() 函数忽略列值为 NULL 的行。
2、  COUNT()函数进行计数。COUNT()函数有两种使用方式。
  • 使用COUNT(*)对表中行的数目进行计数,不管表列中包含的是空值(NULL)还是非空值。
  • 使用COUNT(column)对特定列中具有值的行进行计数,忽略 NULL值。

 3、虽然MAX()一般用来找出最大的 数值或日期值,但MySQL允许将它用来返回任意列中的最大 值,包括返回文本列中的最大值。在用于文本数据时,如果数 据按相应的列排序,则MAX()返回最后一行。MAX()函数忽略列值为NULL的行。

 4、MIN()的功能正好与MAX()功能相反,它返回指定列的最小值。与 MAX()一样,MIN()要求指定列名,MIN()函数与MAX()函数类似, MySQL允许将它用来返回任意列中的最小值,包括返回文本 列中的最小值。在用于文本数据时,如果数据按相应的列排序, 则MIN()返回最前面的行。MIN()函数忽略列值为NULL的行。

5、ALL参数不需要指定,因为它是默认行为。如果 不指定DISTINCT,则假定为ALL

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

7、实际上SELECT 语句可根据需要包含多个聚集函数

 

 

 分组数据

1、在具体使用GROUP BY子句前,需要知道一些重要的规定。

  • GROUP BY子句可以包含任意数目的列。这使得能对分组进行嵌套, 为数据分组提供更细致的控制。
  • 如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算 (所以不能从个别的列取回数据)。
  • GROUP BY子句中列出的每个列都必须是检索列或有效的表达式 (但不能是聚集函数)。如果在SELECT中使用表达式,则必须在 GROUP BY子句中指定相同的表达式。不能使用别名。
  •  除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY句中给出。
  • 如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。
  • GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。

2、事实上,目前为止所  学过的所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是WHERE过滤行,而HAVING过滤分组。所学过的有关WHERE的所有这些技术和选项都适用于HAVING。它们的句法是相同的,只是关键字有差别。

这里WHERE子句不起作用,因为过滤是基于分组聚集值而不是特定行值的。WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。 

3、GROUP BY和ORDER BY

一般在使用GROUP BY子句时,应该也给出ORDER BY子句。这是保证数据正确排序的唯一方法 

4、SELECT语句中子句的顺序

 使用子查询

1、在WHERE子句中使用子查询(如这里所示),应 该保证SELECT语句具有与WHERE子句中相同数目的列。通常, 子查询将返回单个列并且与单个列匹配,但如果需要也可以 使用多个列。

 

虽然子查询一般与 IN 操作符结合使用,但也可以用于测试等于(=)、 不等于(<> )等。
2、非相关子查询和相关子查询
  • 如果子查询中仅仅使用了自己定义的数据源, 这种查询是非相关子查询。 非相关子查询是独立于外部查询的子查询, 子查询总共执行一次, 执行完毕后将值传递给主查询。(子查询是一个单独的select语句,可以不依赖主查询单独运行。这种不依靠主查询,能够独立运行的子查询称为“非相关子查询”)
  • 如果子查询中使用了主查询的数据源, 这种查询是相关子查询, 此时主查询的执行与相关子查询的执行相互依赖。

如何快速区分非相关子查询和相关子查询呢?最简单的办法的就是直接看子查询本身能否执行。比如执行下面的例子中的子查询

mysql> select avg(score)
    -> from choose
    -> where student.student_no = choose.student_no and student_name = '张三';

 会报错:1054 - Unknown column 'student.student_no' in 'where clause' 这样的查询语句构成的子查询便为相关子查询。

联结表

1、联结的创建非常简单

 完全限定列名  在引用的列可能出现二义性时,必须使用完全限定列名(用一个点分隔的表名和列名)。如果引用一个没有用表名限制的具有二义性的列名,MySQL将返回错误。

2、笛卡儿积(cartesian product) 由没有联结条件的表关系返回的结果为笛卡儿积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数

3、应该保证所有联结都有WHERE子句,否则MySQL将返回比想要的数据多得多的数据。同理,应保证WHERE子句的正确性。不正确的过滤条件将导致MySQL返回不正确的数据。

4、基于两个表之间的相等测试。这种联结也称为内部联结

5、ANSI SQL规范首选INNER JOIN语法。此外, 尽管使用WHERE子句定义联结的确比较简单,但是使用明确的 联结语法能够确保不会忘记联结条件,有时候这样做也能影响性能。

6、SQL 对一条 SELECT 语句中可以联结的表的数目没有限制。创建联结 的基本规则也相同。首先列出所有表,然后定义表之间的关系。

 MySQL在运行时关联指定的每个表以处理联结。 这种处理可能是非常耗费资源的,因此应该仔细,不要联结 不必要的表。联结的表越多,性能下降越厉害。

创建高级联结

1、别名除了用于列名和计算字段外,SQL还允许给表名起别名,别名不仅能用于WHERE子句,它还可以用于SELECT的列表、ORDER BY子句 以及语句的其他部分。应该注意,表别名只在查询执行中使用。与列别名不一样,表别名 不返回到客户机。

 2、自联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句(简单说就是自己一个表用两次或者多次,自己联结自己)。虽然最终的结果是相同的,但有时候处理联结远比处理子查询快得多。

子查询

 自联结

 上面这个例子查询的结果是一样的

3、MySQL不支持简化字符*==*的使用,这两种操作符在其他DBMS中是很流行的

4、存在两种基本的外部联结形式:左外部联结(LEFT JOIN)和右外部联结(RIGHT JOIN)。它们之间的唯一差别是所关联的表的顺序不同。换句话说,左外部联结可通过颠倒FROMWHERE子句中,表的顺序转换为右外部联结。因此,两种类型的外部联结可互换使用,而究竟使用哪一种纯粹是根据方便而定。

5、事实上,迄今为止我们建立的每个内部联结都是自然联结,很可能 我们永远都不会用到不是自然联结的内部联结。

内联结 

 

自然联结 

6、汇总一下关于联结及其使用的 某些要点。

  • 注意所使用的联结类型。一般我们使用内部联结,但使用外部联结也是有效的。
  • 保证使用正确的联结条件,否则将返回不正确的数据。
  • 应该总是提供联结条件,否则会得出笛卡儿积。
  • 在一个联结中可以包含多个表,甚至对于每个联结可以采用不同的联结类型。虽然这样做是合法的,一般也很有用,但应该在一 起测试它们前,分别测试每个联结。这将使故障排除更为简单。

7、驱动表与被驱动表

mysql中的表连接分为三种

1. 左连接 left join
左连接以左表为基础,查询出左表所有数据并且去匹配右表的数据,如果右表没有数据,则为空

2. 右连接 right join
右连接以右表为基础,查询出右表所有数据并且去匹配左表的数据,如果左表没有数据,则为空

3. 内连接 inner join
内连接会把左右表匹配的数据查询出来,不存在的数据直接忽略

驱动表与被驱动表的概念
驱动表是表连接中的基础表,也就是通过驱动表的数据结果集作为循环基础数据,然后一条一条的通过这个结果集的数据作为过滤条件到被驱动表中查询数据,然后合并

驱动与被驱动
左连接中左表是驱动表,右表是被驱动表
右连接中右表是驱动表,左表是被驱动表
内连接中表数据量较小的表会由mysql自动选择作为驱动表去驱动大表
有一个重点是,如果where条件存在的话 mysql会根据where实际条件进行驱动表的选择
sql优化中,一个比较重要的点就是要用小表驱动大表

原因
mysql表关联的算法,是通过驱动表去循环被驱动表,比如说,20w的大表和200条的小表,如果大表驱动,那么是20w条记录外循环,内循环200条去连接查找,需要通过20w次连接,如果小表驱动,那么是200条记录外循环,内循环20w条去连接查找,只需要通过200次连接就可以了,并且驱动表是不会使用索引的

组合查询

1、可用UNION操作符来组合数条SQL查询。利用UNION,可给出多条SELECT语句,将它们的结果组合成单个结果集。多数情况下,组合相同表的两个 查询完成的工作与具有多个WHERE子句条件的单条查询完成的 工作相同。换句话说,任何具有多个WHERE子句的SELECT语句都可以作为一个组合查询给出,在以下段落中可以看到这一点。 这两种技术在不同的查询中性能也不同。因此,应该试一下这 两种技术,以确定对特定的查询哪一种性能更好。

用Union(简单来说就是满足任意个select条件,但是注意两个select的字段是相同的)

 用Where

在这个简单的例子中,使用 UNION 可能比使用 WHERE 子句更为复杂。 但对于更复杂的过滤条件,或者从多个表(而不是单个表)中检索数据的情形,使用UNION 可能会使处理更简单
2、  UNION 规则
正如所见,并是非常容易使用的。但在进行并时有几条规则需要注意。
  • UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔(因此,如果组合4SELECT语句,将要使用3UNION关键字)。
  • UNION中的每个查询必须包含相同的列、表达式或聚集函数(不过各个列不需要以相同的次序列出)。
  •  列数据类型必须兼容:类型不必完全相同,但必须是DBMS可以 隐含地转换的类型(例如,不同的数值类型或不同的日期类型)。
如果遵守了这些基本规则或限制,则可以将并用于任何数据检索任务。
3、UNION从查询结果集中自动去除了重复的行(换句话说,它的行为与单条SELECT语句中使用多个WHERE子句条件一样)。这是UNION的默认行为,但是如果需要,可以改变它。事实上,如果想返回所有匹配行,可使用UNION ALL而不是UNION。

 4、SELECT语句的输出用ORDER BY子句排序。在用UNION组合查询时,只 能使用一条ORDER BY子句,它必须出现在最后一条SELECT语句之后。对 于结果集,不存在用一种方式排序一部分,而又用另一种方式排序另一 部分的情况,因此不允许使用多条ORDER BY子句。

 全文本搜索

1、MySQL支持几种基本的数据库引擎。并非所有的引擎都支持全文本搜索。两个最常使用的引擎为MyISAM InnoDB , 前者支持全文本搜索,而后者不支持。
2、一般在创建表时启用全文本搜索。CREATE TABLE语句接受FULLTEXT子句,它给出被索引列的一个逗号分隔的列表。在索引之后,SELECT可与Match()和Against()一起使用以实际执行搜索。所谓的全文本检索就是从一个装着文章或者段落的字段中检索需求的关键字

只需知道这条 CREATE TABLE语句定义表 productnotes 并列出它所包含的列 即可。这些列中有一个名为note_text 的列,为了进行全文本搜索, MySQL根据子句 FULLTEXT(note_text) 的指示对它进行索引。这里的 FULLTEXT索引单个列,如果需要也可以指定多个列。 在定义之后,MySQL 自动维护该索引。在增加、更新或删除行时, 索引随之自动更新。 可以在创建表时指FULLTEXT ,或者在稍后指定
3、不要在导入数据时使用FULLTEXT 更新索引要花时间,虽然不是很多,但毕竟要花时间。如果正在导入数据到一个新表,此时不应该启用FULLTEXT索引。应该首先导入所有数据,然后再修改表,定义FULLTEXT。这样有助于更快地导入数据(而且使索引数据的总时间小于在导入每行时分别进行索引所需的总时间)。
4、在索引之后,使用两个函数Match()和Against()执行全文本搜索,其中Match()指定被搜索的列,Against()指定要使用的搜索表达式。

 此SELECT语句检索单个列note_text。由于WHERE子句,一个全 文本搜索被执行Match(note_text)指示MySQL针对指定的 列进行搜索,Against('rabbit')指定词rabbit作为搜索文本。由于有两行包含词rabbit,这两个行被返回

5、传递给 Match() 的值必须与 FULLTEXT()定义中的相同。如果指定多个列,则必须列出它们(而且次序正确)。

6、除非使用BINARY方式, 否则全文本搜索不区分大小写。

7、全文本搜索的一个重要部分就是对结果排序。具有较高等级的行先返回(因为这些行很

可能是你真正想要的行)。

 这里,在SELECT而不是WHERE子句中使用Match()Against()。这 使所有行都被返回(因为没有WHERE子句)。Match()Against() 用来建立一个计算列(别名为rank),此列包含全文本搜索计算出的等级值。等级由MySQL根据行中词的数目、唯一词的数目、整个索引中词的 总数以及包含该词的行的数目计算出来。正如所见,不包含词rabbit的 行等级为0(因此不被前一例子中的WHERE子句选择)。确实包含词rabbit 的两个行每行都有一个等级值,文本中词靠前的行的等级值比词靠后的 行的等级值高。

8、查询扩展用来设法放宽所返回的全文本搜索结果的范围。考虑下面 的情况。你想找出所有提到anvils的注释。只有一个注释包含词anvils, 但你还想找出可能与你的搜索有关的所有其他行,即使它们不包含词anvils

首先进行一个简单的全文本搜索,没有查询扩展

 下面是相同的搜索,这次使用查询扩展

这次返回了 7 行。第一行包含词 anvils ,因此等级最高。第二 行与anvils 无关,但因为它包含第一行中的两个词( customer 和recommend ),所以也被检索出来。第 3 行也包含这两个相同的词,但它 们在文本中的位置更靠后且分开得更远,因此也包含这一行,但等级为 第三。第三行确实也没有涉及anvils (按它们的产品名)。
正如所见,查询扩展极大地增加了返回的行数,但这样做也增加了你实际上并不想要的行的数目。
9、布尔方式不同于迄今为止使用的全文本搜索语法的地方在于,即使没有定义FULLTEXT索引,也可以使用它。但这是一种非常缓慢的操作(其性能将随着数据量的增加而降低)。

 此全文本搜索检索包含词heavy的所有行(有两行)。其中使用 了关键字IN BOOLEAN MODE,但实际上没有指定布尔操作符, 因此,其结果与没有指定布尔方式的结果相同

为了匹配包含 heavy 但不包含任意以 rope 开始的词的行,可使用以下查询:
这一次仍然匹配词 heavy ,但 -rope* 明确地 指示MySQL 排除包含 rope*(任何以rope开始的词,包括 ropes)的行,-排除一个词,而*是截断操作符(可想象为用于词尾的一个通配符)。

 

 在布尔方式中,不按等级值降序排序返回的行。

10、邻近搜索是许多全文本搜索支持的一个特性,它能搜索相邻的词(在相同的句子中、相同的段落中或者在特定数目的词的部分中等等)。

插入数据

1、INSERT语句一般不会产生输出

2、不管使用哪种INSERT语法,都必须给出 VALUES的正确数目。如果不提供列名,则必须给每个表列提供 一个值。如果提供列名,则必须对每个列出的列给出一个值。 如果不这样,将产生一条错误消息,相应的行插入不成功。

3、如果表的定义允许,则可以在INSERT操作中省略某 些列。省略的列必须满足以下某个条件。

  • 该列定义为允许NULL值(无值或空值)。
  • 在表定义中给出默认值。这表示如果不给出值,将使用默认值。
如果对表中不允许 NULL 值且没有默认值的列不给出值,则 MySQL将产生一条错误消息,并且相应的行插入不成功。
4、数据库经常被多个客户访问,对处理什么请求以及用什么次序处理进行管理是MySQL的任务。INSERT操作可能很耗时(特别是有很多索引需要更新时),而且它可能降低等待处理的SELECT语句的性能。如果数据检索是最重要的(通常是这样),则你可以通过在INSERT和INTO之间添加关键字LOW_PRIORITY,指示MySQL降低INSERT语句的优先级,如下所示:

 5、INSERT可以插入一行到一个表中。但如果你想插入多个行怎么办?可以使用多条INSERT语句,甚至一次提交它们,每条语句用一个分号结束,如下所示:

 或者,只要每条INSERT语句中的列名(和次序)相同,可以如下组 合各语句:

 其中单条INSERT语句有多组值,每组值用一对圆括号括起来, 用逗号分隔。此技术可以提高数据库处理的性能,因 为MySQL用单条INSERT语句处理多个插入比使用多条INSERT 语句快

6、INSERT还存在 另一种形式,可以利用它将一条SELECT语句的结果插入表中。这就是所 谓的INSERT SELECT,顾名思义,它是由一条INSERT语句和一条SELECT 语句组成的

 

这个例子使用 INSERT SELECT custnew 中将所有数据导入 customers。 SELECT 语句从 custnew 检索出要插入的值,而不 是列出它们。SELECT 中列出的每个列对应于 customers 表名后所跟的列 表中的每个列。这条语句将插入多少行有赖于custnew 表中有多少行。 如果这个表为空,则没有行被插入(也不产生错误,因为操作仍然是合法的)。如果这个表确实含有数据,则所有数据将被插入到customers
INSERT SELECT 中的列名 为简单起见,这个例子在 INSERT 和 SELECT语句中使用了相同的列名。但是,不一定要求列名匹配。 事实上,MySQL 甚至不关心 SELECT 返回的列名。它使用的是 列的位置,因此SELECT中的第一列(不管其列名)将用来填充 表列中指定的第一个列,第二列将用来填充表列中指定的第二个列,如此等等。这对于从使用不同列名的表中导入数据是非 常有用的。简单说就是列的数量对应就好,INSERT SELECT SELECT 语句可包含 WHERE 子句以过滤插入的数据。

更新和删除数据

1、如果用UPDATE语句更新多行,并且在更新这些 行中的一行或多行时出一个现错误,则整个UPDATE操作被取消 (错误发生前更新的所有行被恢复到它们原来的值)。为即使是发 生错误,也继续进行更新,可使用IGNORE关键字,如下所示:

UPDATE IGNORE customers…

2、为了删除某个列的值,可设置它为NULL(假如表定义允许NULL值)。 如下进行:

其中NULL用来去除cust_email列中的值 

3、在使用DELETE或者UPDATE语句时一定要注意细心(也就是要用Where语句来限制更新条件)。因为稍不注意,就会错误地删除/修改表中所有行。

4、DELETE不需要列名或通配符。DELETE删除整行而不是删除列。为了删除指定的列,请使用UPDATE语句。

5、DELETE语句从表中删除行,甚至是删除表中所有行。但是,DELETE不删除表本身。

6、下面是许多SQL程序员使用UPDATEDELETE时所遵循的习惯。

  •  除非确实打算更新和删除每一行,否则绝对不要使用不带WHERE 子句的UPDATEDELETE语句。
  • 保证每个表都有主键,尽可能 WHERE子句那样使用它(可以指定各主键、多个值或值的范围)。
  • 在对UPDATEDELETE语句使用WHERE子句前,应该先用SELECT行测试,保证它过滤的是正确的记录,以防编写的WHERE子句不正确。
  • 使用强制实施引用完整性的数据库,这样MySQL将不允许删除具有与其他表相关联的数据的行。
  • MySQL 没有撤销( undo )按钮。应该非常小心地 使用UPDATE DELETE ,否则你会发现自己更新或删除了错误的数据

创建和操纵表

1、为利用CREATE TABLE创建表,必须给出下列信息:

  • 新表的名字,在关键字CREATE TABLE之后给出;
  • 表列的名字和定义,用逗号分隔。
CREATE TABLE 语句也可能会包括其他关键字或选项,但至少要包括表的 名字和列的细节。
 
表的主键可以在创建表时用 PRIMARY KEY关键字指定。这里,列 cust_id 指定作为主键列。整条语句由右圆括号后的分号结 束 。
2、如果你仅想在一个表不存在时创建它,应该在表名后给出IF NOT EXISTS。这样做不检查已有表的模式是否与你打算创建的表模式相匹配。它只是查看表名是否存在,并且仅在表名不存在时创建它。
3、NULL值就是没有值或缺值。允许NULL值的列也允许在插入行时不给出该列的值。不允许NULL值的列不接受该列没有值的行,换句话说,在插入或更新行时,该列必须有值。
4、不要把NULL值与空串相混淆。NULL值是没有值,它不是空串。如果指定''(两个单引号,其间没有字符),这在NOT NULL列中是允许的。空串是一个有效的值,它不是无值。NULL值用关键字NULL而不是空串指定。
5、主键值必须唯一。即,表中的每个行必须具有唯一的主键值。如果主键使用单个列,则它的值必须唯一。如果使用多个列,则这些列的组合值必须唯一。
6、主键为其值唯一标识表中每个行的列。主键中只能使用不允许NULL值的列。允许NULL值的
列不能作为唯一标识。
7、AUTO_INCREMENT告诉MySQL,本列每当增加一行时自动增量。每次执行一个INSERT操作时,MySQL自动对该列增量(从而才有这个关键字AUTO_INCREMENT),给该列赋予下一个可用的值。这样给每个行分配一个唯一的cust_id,从而可以用作主键值。 每个表只允许一个AUTO_INCREMENT 列,而且它必须被索引(如通过使它成为主键)。
8、如何在使用AUTO_INCREMENT列时获得这个值呢?可使用last_insert_id()函数获得这个值,如下所示:
此语句返回最后一个 AUTO_INCREMENT 值,然后可以将它用于 后续的MySQL 语句。
9、如果在插入行时没有给出值,MySQL允许指定此时使用的默认值。默认值用CREATE TABLE语句的列定义中的DEFAULT关键字指定。

 

 10、与大多数DBMS不一样,MySQL不允许使用函数作为默认值,它只支持常量。

 11、如果省略ENGINE=语句,则 使用默认引擎(很可能是MyISAM),多数SQL语句都会默认使用它。但并不是所有语句都默认使用它,可以通过ENGINE=语句来指定引擎

 以下是几个需要知道的引擎:

  •  InnoDB是一个可靠的事务处理引擎(参见第26章),它不支持全文本搜索;
  • MEMORY在功能等同于MyISAM,但由于数据存储在内存(不是磁盘)中,速度很快(特别适合于临时表);
  • MyISAM是一个性能极高的引擎,它支持全文本搜索但不支持事务处理。

12、引擎类型可以混用。混用引擎类型有一个大缺陷。外键(用于强制实施引用完整性)不能跨引擎,即使用一个引擎的表不能引用具有使用不同引擎的表的外键。对事务没有要求通常用MyISAM 引擎。

13、为更新表定义,可使用ALTER TABLE语句。

 ALTER TABLE的一种常见用途是定义外键。上面是给orderitems表增加一个fk_orderitems_orders表的外键约束,这个外键是order_num并且关联着orders

14、删除表(删除整个表而不是其内容)非常简单,使用DROP TABLE语 句即可:

 15、使用RENAME TABLE语句可以重命名一个表:

 管理事务处理

1、MyISAM和InnoDB是两种最常使用 的引擎。前者不支持明确的事务处理管理,而后者支持

2、事务处理是一种 机制,用来管理必须成批执行的MySQL操作,以保证数据库不包含不完整的操作结果。利用事务处理,可以保证一组操作不会中途停止,它们 或者作为整体执行,或者完全不执行(除非明确指示)。如果没有错误发 生,整组语句提交给(写到)数据库表。如果发生错误,则进行回退(撤 销)以恢复数据库到某个已知且安全的状态。

3、下面是关于事务处理需要知道的几个术语:

  • 事务transaction)指一组SQL语句;
  • 回退rollback)指撤销指定SQL语句的过程;
  • 提交commit)指将未存储的SQL语句结果写入数据库表;
  • 保留点savepoint)指事务处理中设置的临时占位符(plac-holder),你可以对它发布回退(与回退整个事务处理不同)。

4、MySQL使用下面的语句来标识事务的开始:

5、MySQL的ROLLBACK命令用来回退(撤销)MySQL语句,请看下面的语句:

 

这个例子从显示 ordertotals 的内容开始。首先执行一条SELECT 以显示该表不为空。然后开始一 个事务处理,用一条DELETE 语句删除 ordertotals 中的所有行。另一条 SELECT语句验证 ordertotals 确实为空。这时用一条 ROLLBACK 语句回退 START TRANSACTION之后的所有语句,最后一条 SELECT 语句显示该表不为 空。 显然,ROLLBACK 只能在一个事务处理内使用(在执行一条 START TRANSACTION命令之后)。
6、事务处理用来管理INSERT、UPDATE和DELETE语句。你不能回退SELECT语句。(这样做也没有什么意义)你不能回退CREATE或DROP操作。事务处理块中可以使用这两条语句,但如果你执行回退,它们不会被撤销
7、 一般的MySQL 语句都是直接针对数据库表执行和编写的。这就是 所谓的隐含提交 implicit commit ),即提交(写或保存)操作是自动进行的。 但是,在事务处理块中,提交不会隐含地进行。为进行明确的提交, 使用COMMIT 语句,如下所示
在这个例子中,从系统中完全删除订单 20010 。因为涉及更新两个数据库表orders orderItems ,所以使用事务处理块来保证订单不被部分删除。最后的COMMIT 语句仅在不出错时写出更改。如
果第一条 DELETE 起作用,但第二条失败,则 DELETE 不会提交(实际上,它是被自动撤销的)。
8、可以在MySQL代码中设置任意多的保留点,越多越好。为什么呢?因为保留点越多,你就越能按自己的意愿灵活地进行回退。保留点在事务处理完成(执行一条ROLLBACK或COMMIT)后自动释放。

 9、默认的MySQL行为是自动提交所有更改。换句话说,任何 时候你执行一条MySQL语句,该语句实际上都是针对表执行的,而且所做的更改立即生效。为指示MySQL不自动提交更改,需要使用以下语句:

autocommit标志是针对每个连接而不是服务器的。

 改善性能

1、下面的内容并不能完全决定 MySQL 的性能。我们只是想回顾一下前面各章的重点,提供进行性能优化探讨和分析的一个出发点。
  • 首先,MySQL(与所有DBMS一样)具有特定的硬件建议。在学习和研究MySQL时,使用任何旧的计算机作为服务器都可以。但 对用于生产的服务器来说,应该坚持遵循这些硬件建议。
  • 一般来说,关键的生产DBMS应该运行在自己的专用服务器上。
  •  MySQL是用一系列的默认设置预先配置的,从这些设置开始通常 是很好的。但过一段时间后你可能需要调整内存分配、缓冲区大小等。(为查看当前设置,可使用SHOW VARIABLES;SHOW STATUS;
  • MySQL一个多用户多线程的DBMS,换言之,它经常同时执行多 个任务。如果这些任务中的某一个执行缓慢,则所有请求都会执 行缓慢。如果你遇到显著的性能不良,可使用SHOW PROCESSLIST 显示所有活动进程(以及它们的线程ID和执行时间)。你还可以用KILL命令终结某个特定的进程(使用这个命令需要作为管理员登录)。
  • 总是有不止一种方法编写同一条 SELECT 语句。应该试验联结、并、子查询等,找出最佳的方法。
  • 使用EXPLAIN语句让MySQL解释它将如何执行一条SELECT语句。
  •   一般来说,存储过程执行得比一条一条地执行其中的各条 MySQL 语句快。
  •   应该总是使用正确的数据类型。
  • 决不要检索比需求还要多的数据。换言之,不要用 SELECT * (除 非你真正需要每个列)。
  • 有的操作(包括 INSERT )支持一个可选的 DELAYED 关键字,如果 使用它,将把控制立即返回给调用程序,并且一旦有可能就实际 执行该操作。
  •   在导入数据时,应该关闭自动提交。你可能还想删除索引(包括 FULLTEXT 索引),然后在导入完成后再重建它们。
  •   必须索引数据库表以改善数据检索的性能。确定索引什么不是一 件微不足道的任务,需要分析使用的 SELECT 语句以找出重复的 WHERE ORDER BY 子句。如果一个简单的 WHERE 子句返回结果所花 的时间太长,则可以断定其中使用的列(或几个列)就是需要索 引的对象。
  • 你的 SELECT 语句中有一系列复杂的 OR 条件吗?通过使用多条 SELECT 语句和连接它们的 UNION 语句,你能看到极大的性能改 进。
  •   索引改善数据检索的性能,但损害数据插入、删除和更新的性能。 如果你有一些表,它们收集数据且不经常被搜索,则在有必要之 前不要索引它们。(索引可根据需要添加和删除)
  •   LIKE 很慢。一般来说,最好是使用 FULLTEXT 而不是 LIKE
  • 数据库是不断变化的实体。一组优化良好的表一会儿后可能就面 目全非了。由于表的使用和内容的更改,理想的优化和配置也会 改变。
  • 最重要的规则就是,每条规则在某些条件下都会被打破。

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/128574.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(六)devops持续集成开发——jenkins的全局工具配置之node环境安装及配置

前言 本节内容主要是关于jenkins集成node组件&#xff0c;从而实现前端node项目的流水线CICD发布功能。我们需要先安装好前端组件node,并在jenkins中配置好node组件&#xff0c;这样就可以流水线发布一个前端工程了。 正文 安装node组件①上传node安装包 ②解压node安装包 t…

用纯python脚本玩转UU加速器

1. 前言 之前几期内容&#xff0c;我们出过纯py形式的Android自动化脚本。同学们一直让再出一下纯py形式的Windows脚本&#xff0c;今天我们以UU加速器为例&#xff0c;给大家出一个简单的学习demo。 2. UU加速器的自动化demo 今天的练习demo也非常简单&#xff0c;大致内容…

张勇用最严厉的内部信,敲打阿里云,也在提振阿里士气

“「客户第一」的价值观&#xff0c;从来都不是高高挂在公司墙上的标语&#xff0c;而是支撑我们每一天获得成长的基石”。这应该是阿里巴巴董事局主席兼CEO张勇&#xff0c;自2015年来最严厉的一封内部信。信件里&#xff0c;张勇一改往日温情形象&#xff0c;措辞严厉的批评了…

pybind11 | 绑定CGAL几何算法(numpy数据交换)

文章目录一 前言二 numpy数据交换2.1 pybind11对numpy的支持2.2 Numpy VF(py::array_t)与CGAL mesh(Surface Mesh)之间的转换三 绑定CGAL算法示例3.1 示例函数3.2 绑定部分代码3.3 示例完整代码四 编译生成和测试4.1 编译生成pyd文件4.2 Python调用测试五 总结参考和拓展一 前言…

day04 IDEA数组

第一部分 : IDEA开发工具 参见 &#xff1a;IEDA的安装请参考文件夹PPT中的 04_IDEA.ppt 1.数组 1.1 数组介绍 ​ 数组就是存储数据长度固定的容器&#xff0c;存储多个数据的数据类型要一致。 1.2 数组的定义格式 1.2.1 第一种格式 ​ 数据类型[] 数组名 ​ 示例&…

【Linux】进程创建|进程终止|进程等待|进程程序替换

索引1.进程创建fork函数初识&#x1f60a;我们先来看这样的一个程序:写时拷贝fork返回值的三个问题2.进程终止进程退出场景进程常见退出方法进程退出码&#xff1a;3.进程等待进程等待的方法wait方法waitpid方法获取子进程status进程的阻塞等待方式&#xff1a;进程的非阻塞等待…

vue实现导入表格数据【纯前端实现】

一、文章引导 #mermaid-svg-3VJi5rNvrLDOy2MT {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3VJi5rNvrLDOy2MT .error-icon{fill:#552222;}#mermaid-svg-3VJi5rNvrLDOy2MT .error-text{fill:#552222;stroke:#55222…

WSL Ubuntu SSH

WSL中的IP wsl中的ubuntu的ip是动态分配的&#xff0c;每次开机都不一样&#xff0c;而且动态分配的ip和windows系统中的ip不在同一网段&#xff0c;但是我发现在windows中能ping通wsl中ubuntu的ip&#xff0c;这说明子系统与虚拟机不同&#xff0c;在查看ubuntu系统ip时&…

第010课 - docker安装mysql

第010课 - docker安装mysql docker run -p 3306:3306 --name mysql \ -v /mydata/mysql/log:/var/log/mysql \ # 这个里面是容器内mysql相关的日志 -v /mydata/mysql/data:/var/lib/mysql \ # 这个里面是msyql数据相关的内容 -v /mydata/mysql/conf:/etc/mysql \ # 这个里面是容…

数据结构进阶 二叉树OJ题

作者&#xff1a;小萌新 专栏&#xff1a;数据结构进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍几道二叉树的oj题 二叉树OJ题题目一 根据二叉树创建字符串题目二 二叉树的层序遍历题目三 二叉树的最近公共祖先题目一 根据…

华为机试 HJ35 蛇形矩阵

华为机试 HJ35 蛇形矩阵[HJ35 蛇形矩阵](https://www.nowcoder.com/practice/649b210ef44446e3b1cd1be6fa4cab5e)方法一&#xff1a;顺序填表方法2&#xff1a;数学规律HJ35 蛇形矩阵 描述 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。 例如&#xff0c;当输入5…

【数据结构】链表基础知识讲解

文章目录链表链表的结构使用链表的优点模拟实现链表链表 在之前的学习中我们讲解了顺序表ArrayList&#xff0c;Java模拟实现顺序表&#xff0c;如果需要大家可以去看一看&#xff0c;顺序表底层的实现逻辑其实就是数组&#xff0c;在物理存储结构和逻辑上都是连续的&#xff…

Eth 03 -以太网驱动Eth的配置

以太网的配置,下面这张图描述了以太网的配置参数: EthCtrlConfig:单个控制器的配置EthCtrlEnableMii :启用/禁用用于收发器访问的媒体独立接口 (MII)EthCtrlEnableRxInterrupt:启用/禁用接收中断EthCtrlEnableTxInterrupt:启用/禁用传输中断EthCtrlIdx:指定已配置控制…

【BUUCTF】MISC(第一页wp)

文章目录签到金三胖二维码你竟然赶我走大白N种方法解决乌镇峰会种图基础破解wireshark文件中的秘密图片exifLSBLSB隐写&#xff08;最低有效位隐写&#xff09;&#xff1a;zip伪加密ZIP 文件由**三个部分**组成&#xff1a;**压缩源文件数据区**&#xff1a;**压缩源文件目录区…

FS4412环境搭建

目录 一、开发板硬件资源介绍 二、交叉开发环境 2.1安装交叉编译工具链 2.2配置全局变量​编辑 2.3测试​编辑 2.4终端 2.5安装串口驱动 2.6上电测试 三、地址映射表 一、开发板硬件资源介绍 中间红色的是samsung的主控&#xff0c;四个粉色的256M的内存条&#xff0…

STM32F4SysTick记录

滴哒主要用于延时和实时系统 模板为原子串口实验源码&#xff0c;入口为24行 120行为滴哒定时器的CTRL寄存器位时钟源设置 这个参数的必要性是用于溢出时间的计算参数之一 可以设置为HCLK或HCLK的8分频 延时函数理解 设置LOAD是设置重装载值 设置VAL清空计数值以及标志位 …

强大的ANTLR4(2)

每次在命令行里输入文本有点麻烦&#xff0c;可以将hello slb保存于hello.txt文本文件中&#xff0c;然后运行命令&#xff1a; antlr4-parse Hello.g4 r -tokens hello.txt出现如下内容&#xff1a; [0,0:4hello,<hello>,1:0] [1,6:8slb,<ID>,1:6] [2,9:8<EO…

JDBC开荒

docker 创建MySQL 一、简介 Java DataBase Connectivity &#xff0c;是Java程序访问数据库的标准接口 Java访问DB的时候&#xff0c;并不是直接通过TCP连接的&#xff0c;而是通过JDBC接口&#xff0c;而JDBC接口又是通过JDBC驱动来访问的 JDBC是Java标准库自带的&#xff0…

(HP)next.js入门

推荐文档&#xff1a;生成<head> - 《next.js v7.0 中文文档》 - 书栈网 BookStack 1&#xff0c;解决的问题 SPA单页面应用的两个问题&#xff1a;首屏加载过慢&#xff0c;不能SEO(搜索引擎抓取&#xff09; 2&#xff0c;它是一个react服务端渲染框架 3&#xff0c;…

ArcGIS去除黑边方法汇总

概述 在使用ArcGIS对影像进行应用的时候&#xff0c;如果出现了黑边&#xff0c;除了影响美观之外&#xff0c;进行镶嵌处理也可能会有问题&#xff0c;这里&#xff0c;我们介绍一下几种ArcGIS去除黑边的方法&#xff0c;希望能够对大家有所帮助。 数据来源 教程所使用的实…