`
hejiajunsh
  • 浏览: 401715 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

mysql必知必会读书笔记

阅读更多

第1章 

1.1 数据库基础 

1.1.1 什么是数据库 


  数据库(database) 保存有组织的数据的容器(通常是一个文件或一组文件)。 
   
  误用导致混淆: 人们通常用数据库这个术语来代表他们使用的数据库软件。这是不正确的,它是引起混淆的根源。确切地说,数据库软件应称为DBMS(数据库管理系统) 
  数据库是通过DBMS创建和操纵的容器。数据库可以是保存在硬设备上的文件,但也可以不是。在很大程度上说,数据库究竟是文件还是别的什么东西并不重要,因为你并不直接访问数据库;你使用的是DBMS,它替你访问数据库。 

1.1.2 表 

  表(table) 某种特定类型数据的结构化清单。 
   
  表名在数据库中是唯一的。 
   
  模式(schema) 关于数据库和表的布局及特性的信息。 
   
  是模式还是数据库? 有时,模式用作数据库的同义词。遗憾的是,模式的含义通常在上下文中并不是很清晰。 
   
  表由列组成。列中存储着表中某部分的信息。 
  列(column) 表中的一个字段。所有表都是由一个或多个列组成的。 
  数据库中每个列都有相应的数据类型。数据类型定义列可以存储的数据种类。 
  数据类型(datatype) 所容许的数据的类型。 
   
  行(row) 表中的一个记录。 
  是记录还是行? 你可能听到用户在提到行(row)时称其为数据库记录(record)。在很大程度上,这两个术语是可以互相代   替的,但从技术上说,行才是正确的术语。 
   
1.1.5 主键 

  主键(primary key) 一列(或一组列),其值能够唯一区分表中每个行。 
   
  应该总是定义主键  虽然并不总是都需要主键,但大多数数据库设计人员都应该保证他们创建的每个表具有一个主键,以   便于以后的数据操纵和管理。 
   
  主键应满足以下条件: 
    1. 任意两行都不具有相同的主键值; 
    2. 每个行都必须具有一个主键值(主键列不允许为NULL值)。 

  主键的最好习惯:  
  除MYSQL强制实施的规则外,应该坚持的几个普遍认可的最好习惯为: 
    1. 不要更新主键列中的值; 
    2. 不要重用主键列的值; 
    3. 不在主键列中使用可能会更改的值。 

  还有一个非常重要的键,称为外键,我们将在第15章中介绍。 
   
1.2 什么是SQL 

  SQL 结构化查询语言的缩写。 
   
  SQL 有以下优点: 
    1. SQL 不是某个特定数据库供应商专有的语言。几乎所有重要的DBMS都支持SQL,所以,学习此语言使你几乎能与所有数据库打交道。 
    2. SQL 简单易学。它的语句全都是由描述性很强的英语单词组成,而且这些单词的数目不多。 
    3. SQL 尽管看上去很简单,但它实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作。 

1.4 小结 

  这一章讲述了MYSQL的基本术语。 

第2章 MYSQL 简介 

2.1 什么是MYSQL 

  使用MYSQL的原因: 
    1. 成本----Mysql是开放源代码的,一般可以免费使用(甚至可以免费修改)。 
    2. 性能----Mysql执行很快(非常快)。 
    3. 可信赖----某些非常重要和声望很高的公司、站点使用Mysql,这些公司和站点都用Mysql来处理自己的重要数据。 
    4. 简单----Mysql很容易安装和使用。 
  
  DBMS可分为两类: 一类为基于共享文件系统的DBMS,另一类为基于客户机-服务器的DBMS。前者(包括诸如Microsoft Access和FileMaker)用于桌面用途,通常不用于高端或更关键的应用。 
   
第3章 使用MYSQL 

3.2 选择数据库 
  USE DATABASE_NAME; (mysql有无分号均可) 
  记住,必须先使用USE打开数控库,才能读取其中的数据。 
   
3.3 了解数据库和表 

  SHOW DATABASES; 返回可用数据库的一个列表。 
  SHOW TABLES;    返回当前选择的数据库内可用表的列表。SHOW也可以用来显示表列: SHOW COLUMNS FROM TABLE_NAME; 
   
  什么是自动增量? 某些表列需要唯一值。例如,订单编号、雇员ID或顾客ID。在每个行添加到表中时,Mysql可用自动地为每个行分配下一个可用编号,不用在添加一行时手动分配唯一值(这样做必须记住最后一次使用的值)。这个功能就是所谓的自动增量。如果需要它,则必须用CREATE语句创建表时把它作为表定义的组成部分。我们将在第21章中介绍CREATE语句。 
   
  DESCRIBE TABLE_NAME; 
  Mysql支持用DESCRIBE作为SHOW COLUMNS FROM TABLES_NAME 的一种快捷方式。 
   
  所支持的其他SHOW语句还有: 
    SHOW STATUS, 用于显示广泛的服务器状态信息; 
    SHOW CREATE DATABASE 和 SHOW CREATE TABLE,分别用来显示创建特定数据库或表的Mysql语句。 
    SHOW GRANTS, 用来显示授予用户(所有用户或特定用户)的安全权限。 
    SHOW ERRORS 和 SHOW WARNINGS,用来显示服务器错误或警告消息。 

3.4 小结 
   
  本章介绍了如何连接和登录Mysql,如何用USE选择数据库,如何用SHOW查看Mysql数据库、表和内部信息。 
   
第4章 检索数据 

4.1 SELECT 语句 
  
  SELECT 用途: 从一个或多个表中检索信息。 
   
4.2 检索单个列 

  结束SQL语句 多条SQL语句必须以分号(;)分隔。Mysql如同多数DBMS一样,不需要在单条SQL语句后加分号。但特定的DBMS可能必须在单条SQL语句后加上分号。当然,如果愿意可以总是加上分号。事实上,即使不一定需要,但加上分号肯定没有坏处。如果你使用的是Mysql命令行,必须加上分号来结束SQL语句。 
  SQL语句不区分大小写。 
   
  使用空格  在处理SQL语句时,其中所有空格都被忽略。SQL语句可以在一行上给出,也可以分成许多行。多数SQL开发人员认为将SQL语句分成多行更容易阅读和调试。 
   
   
4.3 检索多个列 
  <无> 
   
4.4 检索所有列 
  <无> 
   
4.5 检索不同的行 

  DISTINCT关键字 指示Mysql只返回不同的值。 
   
  不能部分使用DISTINCT  DISTINCT 关键字应用于所有列而不仅是前置它的列。 
   
4.6 限制结果 

  例: SELECT prod_name FROM products LIMIT 5; 
    此语句使用SELECT语句检索单个列。 LIMIT 5 指示Mysql返回不多于5行。 
    为得出下一个5行,可指定要检索的开始行和行数,如下所示: 
          SELECT prod_name FROM products LIMIT 5, 5; 第一个5代表开始的行数,第二个5代表要检索的行数。 
    所以,带一个值的LIMIT总是从第一行开始,给出的数为返回的行数。带两个值的LIMIT可以指定从行号为第一个值的位置开始。 

  行0  检索出来的第一行为行0而不是行1.因此,LIMIT 1,1将检索出第二行而不是第一行。 
  行数不够时  LIMIT中指定要检索的行数为检索的最大行数。如果没有足够的行(例如,给出LIMIT 10, 5,但只有13行),Mysql将只返回它能返回的那么多行。 
   
  Mysql 5 支持LIMIT的另一种代替语法。 LIMIT 4 OFFSET 3 意为从行3开始去4行,就像 LIMIT 3,4一样。 
   
4.7 使用完全限定的表名(同时使用表名和列名,如products.prod_name) 
  <无> 

4.8 小结 
  本章学习了如何使用SQL的SELECT语句来检索单个表列、多个表列以及所有表列。下一章将讲授如何排序检索出来的数据。 
   
   
第5章 排序检索数据 

5.1 排序数据 

  子句(clause) SQL语句由子句构成,有些子句是必须的,而有的是可选的。一个子句通常由一个关键字和所提供的数据组成。 
   
  为了明确地排序用SELECT检索出的数据,可使用ORDER BY子句。ORDER BY子句取一个或多个列的名字,根据对输出进行排序。 
   
  通过非选择列进行排序  通常,ORDER BY 子句中使用的列将是为显示所选择的列。但是,实际上并不一定要这样,用非检索的列排序数据是完全合法的。 
   
5.2 按多个列排序 

  经常需要按不止一个列进行数据排序。例如,如果要显示雇员清单,可能希望安姓和名排序(首先按姓排序,然后在每个姓中再按名排序)。 
  例: 
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name; 

5.3 指定排序方向 

  数据排序不限于升序排序,这只是默认的排序顺序,还可以使用ORDER BY 子句以降序排序。为了进行降序排序,必须指定DESC关键字。 
  例: 
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC; 
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC, prod_name; 
DESC关键字只应用到直接位于其前面的列名。 

  在多个列上降序排序  如果想在多个列上进行降序排序,必须对每个列指定DESC关键字。 
   
  与DESC相反的关键字是ASC,在升序排序时可以指定它。但实际上,ASC没有多大用处,因为升序是默认的。 
   
  区分大小写和排序顺序  在对文本性的数据进行排序时,A与a相同吗? a位于B之前还是位于Z之后?这些问题不是理论问题,其答案取决于数据库如何设置。在字典(dictionary) 排序顺序中,A 被视为与a相同,这是Mysql(和大多数数据库管理系统)的默认行为。但是,许多数据库管理员能够在需要时改变这种行为(如果你的数据库包含大量外语字符,可能必须这样做)。这里,关键的问题是,如果确实需要改变这种排序顺序,用简单的ORDER BY 子句做不到。你必须请求 数据库管理员的帮助。 
   
  使用 ORDER BY 和 LIMIT 的组合,能够找到一个列中最高或最低的值。 
   
  ORDER BY子句的位置  在给出ORDER BY子句是,应该保证它位于FROM子句之后。如果使用LIMIT,它必须位于ORDER BY之后。使用子句的次序不对将产生错误消息。 
   
5.4 小结 
  本章学习了如何使用SELECT语句的ORDER BY 子句对检索出的数据进行排序。这个子句必须是SELECT语句中最后一个子句。可根据需要,利用它在一个或多个列上对数据进行排序。 
   
第6章 过滤数据 

6.1 使用WHERE子句 

  WHERE子句后面的条件称为搜索条件或过滤条件。 
  WHERE子句在表名(FROM子句)之后给出。 
   
  SQL过滤与应用过滤  数据也可以在应用层过滤。为此目的,SQL的SELECT语句为客户机应用检索出超出实际所需的数据,然后客户机代码对返回数据进行循环,以提取出需要的行。通常,这种实现并不令人满意。因此,对数据库进行了优化,以便快速有效地对数据进行过滤。让客户机应用(或开发语言)处理数据库的工作将会极大地影响应用的性能,并且是所创建的应用完全不具备可伸缩性。此外,如果在客户机上过滤数据,服务器不得不通过网络发送多余的数据,这将导致网络带宽的浪费。 
   
  WHERE子句的位置  在同时使用ORDER BY 和WHERE子句时,应该让ORDER BY位于WHERE之后,否则将会产生错误。 
   
6.2 WHERE子句操作符 

  何时使用引号  如果仔细观察 上述WHERE子句中使用的条件,会看到有的值括在单引号内,而有的值未括起来。单引号用来限定字符串。如果将值与串类型的列进行比较,则需要限定引号。用来与数值列进行比较的值不用引号。 
   
  使用BETWEEN时必须指定两个值----所需范围的低端值和高端值。这两个值必须用AND关键字分隔。BETWEEN匹配范围中所有的值,包括指定的开始值和结束值。 
   
  检查该值是否为空,应该用 IS 或 IS NOT来判断。 
   
  NULL与不匹配  在通过过滤选择出不同有特定值的行时,你可能希望返回具有NULL值的行。但是,不行。因为未知具有特殊的含义,数据库不知道它们是否 
  匹配,所以在匹配过滤或不匹配过滤时不返回它们。 
   
  因此,在过滤数据时,一定要验证返回数据中确实给出了被过滤具有NULL的行。 
   
6.3 小结 
  本章介绍了如何用SELECT语句的WHERE子句过滤返回的数据。我们学习了如何对相等、不相等、大于、小于、值的范围以及NULL值等进行测试。 

第7章 数据过滤

7.1 组合WHERE子句


  WHERE可包含任意数目的AND和OR操作符。允许两者结合以进行复杂和高级的过滤。
  AND操作符的优先级比OR高。
  在WHERE子句中使用圆括号  任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认计算次序,即使它确实是你想要的东西也是如此。
  
7.2 IN操作符


  圆括号在WHERE子句中还有另外一种用法。IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值的由逗号分隔的清单,全都在圆括号中。
  
  使用IN操作符的有点如下:
1. 在使用长的合法选项清单时,IN操作符的语法更清楚且更直观;
2. 在使用IN时,计算的次序更容易管理(因为使用的操作符更少);
3. IN操作符一般比OR操作符清单执行更快;
4. IN的最大优点是可以含其他SELECT语句,使得能够更动态地建立WHERE子句。第14章将对此进行详细介绍。

  IN  WHERE子句中用来指定要匹配值的清单的关键字,功能与OR相当。
  
7.3 NOT操作符


  WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。
  
  Mysql中的NOT  Mysql支持使用NOT对IN、BETWEEN和EXISTS子句取反,这与多数其他DBMS允许使用NOT对各种条件取反有很大的差别。
  
7.4 小结


  本章讲授如何用AND和OR操作符组合成WHERE子句,而且还讲授了如何明确地管理计算的次序,如何使用IN和NOT操作符。
  
第8章 用通配符进行过滤


8.1 LIKE操作符


  通配符(wiildcard) 用来匹配值的一部分的特殊字符。
  搜索模式(search pattern) 由字面值、通配符或者两者组合构成的搜索条件。
  谓词 操作符何时不是操作符?答案是在它作为谓词(predicate)时。从技术上说,LIKE是谓词而不是操作符。虽然最终的结果是相同的,但应该对此术语有所了解,以免在SQL文档中遇到此术语而不知道。
  
  通配符:
1. 百分号通配符  表示任何字符出现任意次数。
注意: 虽然似乎%通配符可以匹配任何东西,但有一个例外,即NULL。即使是 WHERE prod_name LIKE '%'也不能匹配用值NULL作为产品名的行。
2. 下划线通配符  总是匹配一个字符,不能多也不能少。

8.2 使用通匹配的技巧

  1. 不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
  2. 在确定需要使用通配符时,除非绝对必要,否则不要把它们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。
  3. 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。
  
  总之,通配符是一种极重要和有用的搜索工具,以后我们经常会用到它。
  
8.3 小结
  本章介绍了什么是通配符以及如何在WHERE子句中使用SQL通配符,并且还说明了通配符应该细心使用,不要过度使用。

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

9.1 正则表达式介绍

  Mysql仅支持多数正则表达式实现的一个很小的子集。
  Mysql中的正则表达式匹配不区分大小写,为区分大小写,可使用BINARY关键字。
  | 为正则表达式中的OR操作符。
  正则表达式[123]Ton 为[1 | 2 | 3] Ton的缩写,但[^123]却匹配除这些字符外的任何东西。
  [0-9]匹配范围;
  匹配特殊字符用\\转义(escaping);
  
  匹配字符类:
[:alnum:] 任意字母和数字(同[a-zA-Z0-9]);
[:alpha:] 任意字符(同[a-zA-Z]);
[:blank:] 空格和制表(同[\\t]);
[:cntrl:] ASCII控制字符(ASCII 0到31和127);
[:digit:] 任意数字(同[0-9]);
[:graph:] 与[:print:]相同,但不包括空格;
[:lower:] 任意小写字母;
[:print:] 任意可打印字符;
[:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符;
[:space:] 包括空格在内的任意空白字符(同[\\f\\n\\r\\t\\v]);
[:upper:] 任意大写字母;
[:xdigit:] 任意十六进制数字(同[a-fA-F0-9)。

  重复元字符:
* 0个或多个匹配
+ 1个或多个匹配
? 0个或1个匹配
{n} 指定数目匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目的范围(m不超过255)

  定位元字符:
^ 文本的开始
$ 文本的结尾
[[:<:]] 词的开始
[[:>:]] 词的结尾

  ^的双重用途  ^有两种用法。在集合中(用[和]定义),用它来否定该集合,否则,用来指串的开始处。
  使用REGEXP起类似LIKE的作用  本章前面说过,LIKE和REGEXP的不同在于,LIKE匹配整个串而REGEXP匹配子串。利用定位符,通过用^开始每个表达式,用$来结束每个表达式,可以使REGEXP的作用与LIKE一样。
  
  简单的正则表达式测试  可以在不使用数据库表的情况下用SELECT来测试正则表达式。REGEXP检查总是返回0(没有匹配)或1(匹配)。可以用带文字串的REGEXP来测试表达式,并试验它们。相应的语法如下:
SELECT 'hello' REGEXP '[0-9]';

9.3 小结
  本章介绍了正则表达式的基础知识,学习了如何在Mysql的SELECT语句中通过REGEXP关键字使用它们。
  
第10章 创建计算字段

10.1 计算字段

  我们需要直接从数据库中检索出转换、计算或格式化之后的数据;而不是检索出数据,然后再在客户机应用程序或报告程序中重新格式化。 这就是计算字段发挥作用的所在了。计算字段并不是实际存在于数据库表中。计算字段是运行时在SELECT语句内创建的。
  
  字段(field) 基本上与列(column)的意思相同,经常呼唤使用,不过数据库列一般称为列,而术语字段通常用在计算字段的连接上。
  
  重要的是注意到,只有数据库知道SELECT语句中哪些列是实际的表列,哪些列是计算字段。从客户机(如应用程序)的角度来看,计算字段的数据是以与其他列的数据相同的方式返回的。
  
  客户机与服务器的格式  可在SQL语句内完成的许多转换盒格式化工作都可以直接在客户机应用程序内完成。但一般来说,在数据库服务器上完成这些操作比在客户机中完成要快得多,因为DBMS是设计来快速有效地完成这种处理的。
  
10.2 拼接字段

  拼接(concatenate) 将值连接到一起构成单个值。
  
  在Mysql的SELECT语句中,可以使用concat()函数来拼接两个列。
  
  Mysql的不同之处 多数DBMS使用+或||来实现拼接,Mysql则使用concat()函数来实现。当把SQL语句转换成Mysql语句时一定要把这个区别铭记在心。
  
SELECT CONCAT(vend_name, '(', vend_country, ')' ) FROM venddors ORDER BY vend_name;
concat()拼接串,即把多个串连接起来形成一个较长的串。concat()需要一个或多个指定的串,各个串之间用逗号分隔。

  Trim函数  Mysql除了支持RTrim() (去掉串右边的空格),还支持LTrim()(去掉串左边的空格)以及Trim()(去掉串左右两边的空格)。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics