下载链接: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;
没有主键,更新或删除表中特定行很困难,因为没有安全的方法保证只涉及相关的行。
应该总是定义主键 虽然并不总是都需要主键,但大多数数据库设计人员都应保证他们创建的每个表具有一个主键,以便于以后的数据操纵和管理。
主键的最好习惯 除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退出命令行实用程序。
连接MySQL数据库: mysql -u root -p
退出: exit 或quit
显示所有的数据库列表: SHOW DATABASES;
选择数据库: USE 数据库名;
必须先使用US打开数据库,才能读取其中的数据。
显示数据库中表信息:SHOW TABLES;
显示某个表的列信息:SHOW COLUMNS FROM 表名;
对每个字段返回一行,行中包含字段名、数据
类型、是否允许NULL、键信息、默认值以及其他信息(如字段cust_id
的auto_increment
SHOW STATUS; 显示服务器状态信息
SHOW GRANTS; 显示授予用户的安全权限
SHOW GRANTS FOR user;显示某用户安全权限
SHOW CREATE DATABASE db_name;显示创建特定数据库
SHOW CREATE TABLE tbl_name; 显示创建特定数据库表;
SHOW ERRORS ; SHOW WARNINGS ; 显示服务器错误或警告信息
SELECT 列名 FROM 表名;
SELECT 列名1,列名2,列名3 FROM 表名;
SELECT * FROM 表名;
SELECT DISTINCT 列名 FROM 表名;
SELECT 列名 FROM 表名 LIMIT 5;
LIMIT 5;返回结果不多于5行 等价于LIMIT 0, 5; (第一个表示第一行)
LIMIT 5, 5; 第一个数为开始的位置,第二个数为要检索的行数。(只有一个值的时候默认从0行开始)
LIMIT 4 OFFSET 3; MySQL5的新写法,从行3(第四行)开始取4行,等价于 LIMIT 3, 4
;
子句(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;
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 结束值
SELECT prod_name FROM products WHERE prod_price IS NULL;
NULL与不匹配 在通过过滤选择出不具有特定值的行时,你可能希望返回具有NULL值的行。但是,不行。
因为未知具有特殊的含义,数据库不知道它们是否匹配,所以在匹配过滤或不匹配过滤时不返回它们。因此,在过滤数据时,一定要验证返回数据中确实给出了被过滤列具有NULL的行
操作符(operator) 用来联结或改变WHERE子句中的子句的关键字。也称为逻辑操作符(logical operator)
SELECT prod_id,prod_name,prod_price FROM products WHERE vend_id=1003 AND prod_price <=10;
只包含一个关键字AND的语句,把两个过滤条件组合在一起。
还可以添加多个过滤条件,每添加一条就要使用一个AND
SELECT prod_id,prod_name,prod_price FROM products WHERE vend_id=1003 OR prod_price <=10;
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子句,都应该使用圆括号明确地分组操作符。不要过分依赖默认计算次序,即使它确实是你想要的东西也是如此。使用圆括号没有什么坏处,它能消除歧义。
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章将对此进行详细介绍。
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子句取反
通配符(wildcard) 用来匹配值的一部分的特殊字符。
搜索模式(search pattern) 由字面值、通配符或两者组合构成的搜索条件
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)
未完待续