《MySQL必知必会》知识点总结

创建样例表

下载链接:http://www.forta.com/books/0672327120/

下载脚本之后,开始创建和填充书中各章所用的表:

(1)创建一个新的数据源

create database crashcourse; (这里使用书中的数据源名称)

(2)选择新的数据源

 use crashcourse;

(3)执行creat.sql脚本

 source d:/downloads/create.sql;   (使用mysql命令行使用程序的方法,source+文件的完全路径)

(4)用populate.sql文件填充各个新表

 source d:/downloads/populate.sql; 

第1章 了解SQL

  • 数据库(database) 保存有组织的数据的容器(通常是一个文
    件或一组文件
  • 表(table) 某种特定类型数据的结构化清单
  • 模式(schema) 关于数据库和表的布局及特性的信息
  • 列(column) 表中的一个字段。所有表都是由一个或多个列组
    成的。
  • 数据类型(datatype) 所容许的数据的类型。每个表列都有相
    应的数据类型,它限制(或容许)该列中存储的数据。
  • 行(row) 表中的一个记录。
  • 主键(primary key)①一一列(或一组列),其值能够唯一区分表
    中每个行。

没有主键,更新或删除表中特定行很困难,因为没有安全的方法保证只涉及相关的行。
应该总是定义主键 虽然并不总是都需要主键,但大多数数据库设计人员都应保证他们创建的每个表具有一个主键,以便于以后的数据操纵和管理。

主键的最好习惯 除MySQL强制实施的规则外,应该坚持的
几个普遍认可的最好习惯为:
 不更新主键列中的值;
 不重用主键列的值;
 不在主键列中使用可能会更改的值。(例如,如果使用一个
名字作为主键以标识某个供应商,当该供应商合并和更改其
名字时,必须更改这个主键

  • SQL(发音为字母S-Q-L或sequel)是结构化查询语言(Structured Query
    Language)的缩写。SQL是一种专门用来与数据库通信的语言。

第2章 MySQL简介

数据的所有存储、检索、管理和处理实际上是由数据库软件——DBMS(数据库管理系统)完成的。
MySQL是一种DBMS,即它是一种数据库软件。
为什么有那么多的公司和开发人员使用MySQL?
 成本——MySQL是开放源代码的,一般可以免费使用(甚至可以
免费修改)。
 性能——MySQL执行很快(非常快)。
 可信赖——某些非常重要和声望很高的公司、站点使用MySQL,
这些公司和站点都用MySQL来处理自己的重要数据。
 简单——MySQL很容易安装和使用。
事实上,MySQL受到的唯一真正的批评是它并不总是支持其他
DBMS提供的功能和特性。然而,这一点也正在逐步得到改善,MySQL
的各个新版本正不断增加新特性、新功能。

MySQL基于客户机-服务器的DBMS。
数据库服务器:与数据文件打交道,是负责所有数据访问和处理的一个软件,完成关于数据、数据添加、删除和数据更新的所有请求
数据库客户机:是与用户打交道,和服务器通信,可以是MySQL提供的工具和其他程序语言。请求或更改来自运行客户机软件

版本变化:
4 —— InnoDB引擎,增加事务处理、并、改进全文本搜索。
5 —— 存储过程、触发器、游标、视图
8 —— 性能提升,提供 NoSQL 存储功能,改进了对 JSON 的支持…

mysql命令行实用程序
 命令输入在mysql>之后;
 命令用;或\g结束,换句话说,仅按Enter不执行命令;
 输入help或\h获得帮助,也可以输入更多的文本获得特定命令的
帮助(如,输入help select获得使用SELECT语句的帮助);
 输入quit或exit退出命令行实用程序。

第3章 使用MySQL

连接MySQL数据库: mysql -u root -p
退出: exit 或quit
显示所有的数据库列表: SHOW DATABASES;
选择数据库: USE 数据库名;
必须先使用US打开数据库,才能读取其中的数据。
显示数据库中表信息:SHOW TABLES;
显示某个表的列信息:SHOW COLUMNS FROM 表名;
对每个字段返回一行,行中包含字段名、数据
类型、是否允许NULL、键信息、默认值以及其他信息(如字段cust_id
的auto_increment
《MySQL必知必会》知识点总结_第1张图片

SHOW STATUS; 显示服务器状态信息
SHOW GRANTS; 显示授予用户的安全权限
SHOW GRANTS FOR user;显示某用户安全权限
SHOW CREATE DATABASE db_name;显示创建特定数据库
SHOW CREATE TABLE tbl_name; 显示创建特定数据库表;
SHOW ERRORS ; SHOW WARNINGS ; 显示服务器错误或警告信息

第4章 检索数据

  • 检索单个列: SELECT 列名 FROM 表名;
    结束SQL语句:多条SQL语句必须以分号(;)分隔
    带小写问题:SQL语句不区分大小写。对所有SQL关键字使用大写,而对所有列和表名使用小写代码更易于阅读和调试
    使用空格:在处理SQL语句时会忽略空格,SQL语句分成多行更容易阅读和调试。
  • 检索多个列(如选择三列 ): SELECT 列名1,列名2,列名3 FROM 表名;
  • 检索所有列: SELECT * FROM 表名;
    检索所有的列而不必逐个列出,星号(*)通配符来达到
  • 检索不同的行 DISTINCT :SELECT DISTINCT 列名 FROM 表名;
    不能部分使用DOSTINCT。该关键字应用于所有的列,而不仅仅是前置它的列。select多个列则选出组合不同的列。SELECT DISTINCT 列名1,列名2 FROM 表名;两列的列名1,列名2值都不同,才认为不同。
  • 限制结果 LIMIT : SELECT 列名 FROM 表名 LIMIT 5;
LIMIT 5;返回结果不多于5行 等价于LIMIT 0, 5; (第一个表示第一行)
LIMIT 5, 5; 第一个数为开始的位置,第二个数为要检索的行数。(只有一个值的时候默认从0行开始)
LIMIT 4 OFFSET 3; MySQL5的新写法,从行3(第四行)开始取4行,等价于 LIMIT 3, 4

;

第5章 排序检索数据

  • 子句(clause): SQL语句由子句构成,有些子句是必需的,而有的是可选的。一个子句通常由一个关键字和所提供的数据组成。子句的例子有SELECT语句的FROM子句

  • 排序 ORDER BY:
    单列排序:SELECT 选择的列名(可以使多列,用,隔开) FROM 表名 ORDER BY 排序的列名;
    多列排序:SELECT 选择的列名(可以使多列,用,隔开) FROM 表名 ORDER BY 排序的列名1,排序的列名2;
    重要的是理解在按多个列排序时,排序完全按所规定的顺序进行。换句话说,对于上述例子中的输出,仅在多个行具有相同的 [排序的列名1]值时才对产品按 [排序的列名2]进行排序。如果[排序的列名1]列中所有的值都是唯一的,则不会按 [排序的列名2]排序。
    排序方向 ASC DESC:
    单列升序:SELECT 选择的列名 FROM 表名 ORDER BY 排序的列名 ASC(可以不加,默认升序)
    单列降序:SELECT 选择的列名 FROM 表名 ORDER BY 排序的列名 DESC
    多列: 对多个列上进行降序排序,必须对每个列前加DESC。
    区分大小写和排序顺序:在对文本性的数据进行排序时,A与a相同吗?a位于B之前还是位于Z之后?取决于数据库如何设置。
    在字典(dictionary)排序顺序中,A被视为与a相同,这是MySQL(和大多数数据库管理系统)的默认行为。但是,许多数据库管理员能够在需要时改变这种行为(如果你的数据库包含大量外语字符,可能必须这样做)。如果确实需要改变这种排序顺序,用简单的ORDER BY子句做不到,必须请求数据库管理员的帮助。

  • 找出一个列中最高或最低的值:ORDER BY和LIMIT组合:
    找出一个列中最高的值:SELECT 选择的列名 FROM 表名 ORDER BY 排序的列名 ASC(可以不加,默认升序) LIMIT 1;
    找出一个列中最低的值:SELECT 选择的列名 FROM 表名 ORDER BY 排序的列名 DESC LIMIT 1;
    《MySQL必知必会》知识点总结_第2张图片

第6章 过滤数据

  • WHERE 子句:检索所需要数据 ,指定过滤条件(搜索条件)
    例:SELECT prod_name,prod_price FROM products WHERE prod_price=2.50
    从products表中检索两个列,但不返回所有行,只返回prod_price值为2.50的行
    同时使用ORDER BY和WHERE子句时,ORDER BY必须位于WHERE之后

  • WHERE子句操作符

- 等于 =
SELECT prod_name,prod_price FROM products WHERE prod_name='fuses';
MySQL在执行匹配时默认不区分大小写,fuses与Fuses匹配
- 不等于 <>!=
SELECT prod_name,prod_price FROM products WHERE prod_price!=10;
SELECT prod_name,prod_price FROM products WHERE prod_price<>10;
- 小于 <
SELECT prod_name,prod_price FROM products WHERE prod_price<10;
- 小于等于<= 
SELECT prod_name,prod_price FROM products WHERE prod_price<=10;
- 大于 > 
SELECT prod_name,prod_price FROM products WHERE prod_price>10;
- 大于等于>= 
SELECT prod_name,prod_price FROM products WHERE prod_price>=10;
 - 在指定的两个值之间 BETWEEN
 SELECT prod_name,prod_price FROM productsWHERE  prod_price BETWEEN 5 AND 10; 
 BETWEEN 开始值 AND 结束值
  • 空值检查
    NULL :一个列不包含值(与0,空字符串,或者仅包含空格不同)
    返回没有价格的所有产品
SELECT prod_name FROM products WHERE prod_price IS NULL;

NULL与不匹配 在通过过滤选择出不具有特定值的行时,你可能希望返回具有NULL值的行。但是,不行。
因为未知具有特殊的含义,数据库不知道它们是否匹配,所以在匹配过滤或不匹配过滤时不返回它们。因此,在过滤数据时,一定要验证返回数据中确实给出了被过滤列具有NULL的行

第7章 数据过滤

操作符(operator) 用来联结或改变WHERE子句中的子句的关键字。也称为逻辑操作符(logical operator)

  • AND 检索满足所有给定条件的行
SELECT prod_id,prod_name,prod_price FROM products WHERE vend_id=1003 AND prod_price <=10;

只包含一个关键字AND的语句,把两个过滤条件组合在一起。
还可以添加多个过滤条件,每添加一条就要使用一个AND

  • OR 检索匹配任一条件的行
SELECT prod_id,prod_name,prod_price FROM products WHERE vend_id=1003 OR prod_price <=10;
  • 计算次序:WHERE可包含任意数目的AND和OR操作符。允许两者结合以进行复杂
    和高级的过滤
    SELECT prod_name,prod_price FROM products WHERE vend_id=1002 OR vend_id=1003 AND prod_price >=10;
    《MySQL必知必会》知识点总结_第3张图片
    SQL(像多数语言一样)在处理OR操作符前,优先处理AND操作符。由于AND在计算次序中优先级更高,操作符被错。误地组合了当SQL看到上述WHERE子句时,它理解为由供应商1003制造的任何价格为10美元(含)以上的产品,或者由供应商1002制造的任何产品,而不管其价格如何。此问题的解决方法是使用圆括号明确地分组相应的操作符。
SELECT prod_name,prod_price FROM products WHERE (vend_id=1002 OR vend_id=1003) AND prod_price >=10;

这条SELECT语句与前一条的唯一差别是,这条语句中,前两个条件用圆括号括了起来。因为圆括号具有较AND或OR操作符高的计算次序,DBMS首先过滤圆括号内的OR条件。这时,SQL语句变成了选择由供应商1002或1003制造的且价格都在10美元(含)以上的任何产品.
在WHERE子句中使用圆括号 任何时候使用具有AND和OR操作符的WHERE子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认计算次序,即使它确实是你想要的东西也是如此。使用圆括号没有什么坏处,它能消除歧义。

  • IN:指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值的由逗号分隔的清单,全都括在圆括号中。
SELECT prod_name,prod_price FROM products WHERE vend_id IN (1002,1003);
等价于
SELECT prod_name,prod_price FROM products WHERE vend_id=1002 OR vend_id=1003;

为什么要使用IN操作符?
 IN语法更清楚直观,在使用长的合法选项清单时。
计算次序更容易管理(因为使用的操作符更少)。
 执行更快相比OR。
 最大优点是可以包含其他SELECT语句,使得能够更动态地建立WHERE子句。第14章将对此进行详细介绍。

  • NOT:WHERE子句中用来否定后跟条件的关键字。
SELECT prod_name,prod_price FROM products WHERE vend_id NOT IN (1002,1003);

为什么使用NOT?
对于简单的WHERE子句,使用NOT确实没有什么优势。但在更复杂的子句中,NOT是非常有用的。例如,在与IN操作符联合使用时,NOT使找出与条件列表不匹配的行非常简单。MySQL中的NOT 支持使用NOT 对IN 、BETWEEN 和EXISTS子句取反

第8章 用通配符进行过滤

通配符(wildcard) 用来匹配值的一部分的特殊字符。
搜索模式(search pattern) 由字面值、通配符或两者组合构成的搜索条件

  • LIKE操作符: 指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较
  • %通配符:匹配任何字符出现任意次数(0个、1个或多个字符)
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE 'jet%' ;
检索jet起头的词,%告诉MySQL接受jet之后的任意字符,不管它有多少字符。

SELECT prod_id,prod_name FROM products WHERE prod_name LIKE '%jet%' ;
检索匹配任何位置包含文本jet的值,而它之前或之后出现什么字符

SELECT prod_id,prod_name FROM products WHERE prod_name LIKE 's%e' ;
检索匹配s开头e结尾的值

注意尾空格 尾空格可能会干扰通配符匹配。例如,在保存词 anvil 时, 如果它后面有一个或多个空格, 则子句WHERE prod_name LIKE '%anvil’将不会匹配它们,因为在最后的l
后有多余的字符。解决这个问题的一个简单的办法是在搜索模式最后附加一个%,一个更好的办法是使用函数(第11章将会介绍)去掉首尾空格。
区分大小写 根据MySQL的配置方式,搜索可以是区分大小写的。如果区分大小写,'jet%'与JetPack 1000将不匹配。

谓词 操作符何时不是操作符?答案是在它作为谓词(predicate)时。从技术上说,LIKE是谓词而不是操作符。虽然最终的结果是相同的,但应该对此术语有所了解,以免在SQL文档中遇到此术语时不知道

  • 下划线_通配符:匹配任何字符出现一次。_总是匹配一个字符,不能多也不能少
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE '_ton anvil' ;

匹配结果类似 1ton anvil(_匹配1)

SELECT prod_id,prod_name FROM products WHERE prod_name LIKE '__ton anvil' ;

匹配结果类似 11ton anvil(_匹配1)

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

未完待续

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

第10章 创建计算字段

你可能感兴趣的:(数据库)