《Mysql必知必会》读书笔记
第一章 了解SQL
数据库:保存有组织的数据的容器。
表:某种特定类型的结构化清单。
模式:关于数据库和表的布局及特性的信息。
第一节 列和数据类型
表是由列所组成的。
数据类型:所容许的数据的类型。每个表列都有相应的数据类型,它限制该列的数据。
第二节 行
表中的数据是按行存储的,所保存的每个记录存储在自己的行内。
行:表中的一个记录。
第三节 主键
主键:一列或者一组列,其值能够唯一区分表中每个行。
mysql主键规则:
1.任意两行都不具有相同的主键值。
2.每个行都必须具有一个主键值(主键值不允许是NULL值)。
主键的最好习惯:
1.不更新主键列的值;
2.不重用主键列的值;
3.不在主键中使用可能会更改的值。
第四节 什么是SQL
SQL是结构化查询语言(Structured Query Language)的缩写。SQL是一种专门用来与数据库通信的语言。
第二章 MySQL简介
第一节 MySQL工具
MySQL命令行
登录:mysql --host=localhost --user=root --password=root
或者: mysql -h localhost -u root -p root
退出:quit 或 exit
第三章 使用mysql
第一节 连接数据库
在正确连接到MySQL知后,没有任何数据库打开供我们使用,这时可用USE关键字选择一个数据库。
关键字(key word):作为MySQL语言组成部分的一个保留字,绝不能使用关键字命名一个表或者列。
例如,为了使用一个名为crashcourse的数据库,应该输入以下内容:
USE crashcourse;
USE语句并不返回任何结果。
记住,必须使用USE打开数据库,才能读取其中的数据。
第二节 了解数据库和表
当我们想知道MySQL可以使用的数据库时,可以使用SHOW关键字查询数据库名:
SHOW DATABASES;
为了获得一个数据库内的表的列表时,使用SHOW TABLES:
SHOW TABLES;
SHOW也可以用来显示表列:
SHOW COLUMNS FROM CUSTOMERS;
SHOW COLUMNS 要求给出一个表名,它对每个字段返回一行,行中包含了字段名,数据类型,是否允许NULL值,键信息,默认值以及其他信息。
什么是自动增量:
某些表列需要唯一值。在每个表添加到表中时,MySQL可以自动的每个行分配下一个可以使用的编号,不用再添加一行时手动分配唯一值。这个功能就是自动增量,如果需要它,则必须在用Create语句创建表时把它作为一个表定义的组成部分。
MySQL支持使用describe作为show columns from * 的一种快捷方式。换句话说,describe customers;是show columns from customers;的一种快捷方式。
所支持的其他show语句还有:
- show status,用于显示广泛的服务器状态信息;
- show crate databases和show crate table,分别用来显示创建特定数据库或表的MySQL语句。
- show grants,用来显示授权用户的安全权限;
- show errors和show warnings,用来显示服务器错误或警告消息。
第四章 检索数据
第一节 select语句
使用规则:
select columns_name from table_name;
以上的select语句将返回名为table_name表中columns_name这一列的所有行数据。数据没有过滤,也没有排序。
注意:
- SQL语句不区分大小写。
- 在处理SQL语句时,其中所有空格都被忽略。
第二节 检索多个列
检索多个列时,只需要在select后面跟多个列名即可。在选择多个列时,一定要在列名之间加上逗号,但最后一个列名后不加。
检索所有列:
select * from tabel_name;
检索不同的行
当我们想在检索的列中显示所有不同的行时,可以使用distinct关键字。
select distinct columns_name from table_name;
distinct告诉MySQL只返回不同(唯一)的columns_name行。
注意:
不能部分使用distinct,distinct会应用于所有列而并不仅仅是前置它的列,例如:
select distinct col_name1, col_names2 from table_name;
除非指定的两个列都不同,否则将所有行都被索引出来。
限制条件
select语句返回所有匹配的行,它们可能是指定表中的每个行,为了返回第一行或者前几行,可使用limit子句:
select prod_name from products limit 5;
limit 5指示MySQL返回不多于5行。
为了得到下一个5行,可以指定开始的行与显示的行数,如:
select prod_name from products limit 5, 5;
上面语句意思是指示MySQL返回从第5行开始的后面5行。
带有一个值的LIMIT总是从第一行开始的,给出的数为返回的行数,带两个值的limit可以指定从行数为第一个值的位置开始。
行0 检索出来的第一行为第0行而不是第一行,因此LIMIT 1,1 将检索出第二行而并非第一行。
完全限定的表名
可以通过完全限定的名字来引用列:
select products.prod_name from products;
表名也可以完全限定的:
select products.prod_name from crashcourse.products;
第五章 排序检索数据
第一节 排序数据
为了明确排序用select语句检索出来的数据,可使用order by子句。order by子句可以取一个或者多个列的名字,据此对输出进行排序。如:
select prod_name from products order by prod_name;
指示MySQL对prod_name列以字母顺序排序数据。
第二节 排序多个列
为了按多个列排序,只要指定列名,列名之间用逗号分开即可。
在按多个列排序时,排序完全按所规定的顺序进行。如:
select prod_id, prod_price, prod_name from products order by prod_price, prod_name;
对于这个例子,仅在多个行具有相同的prod_price值时才对产品按prod_name进行排序。如果prod_price列中所有的值都是唯一的,则不会按照prod_name排序。
第三节 指定排序方向
数据排序并不仅限于升序,还可以使用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(ascending),在升序排序时可以指定,但实际上,因为升序排列是默认的,所以asc没什么作用。
使用order by和limit的组合,能够找出一个列中最高或最低的值。例如:
select prod_price from products order by prod_price desc limit 1;
应该注意的是,order by必须放在from子句之后,如果使用limit,它必须位于order by之后,使用子句顺序不当将会报错。
第六章 过滤数据
第一节 使用where子句
在select语句中数据根据where子句中指定的搜索条件进行过滤。where子句在表名(from 子句)之后给出。如:
select prod_name, prod_price from products where prod_price=2.50;
这个例子只是简单的使用了判断是否相等的情况,还可以使用其他条件进行过滤。
where子句的位置:在同时使用order by 和where子句时,应该让order by位于where之后,否则将产生错误。
第二节 where子句操作符
操作符 | 说明 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
> | 大于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
between | 在指定的两个值之间 |
例子:
select prod_name, prod_price from products where prod_price <= 10;
select prod_name, prod_price from products where prod_name = 'fuses';
何时使用引号:单引号用于限定字符串,如果将值与串类型的列进行比较,则需要限定引号。用来与数值列进行比较时的值不用加引号。
Between用法:
select prod_name, prod_price from products where prod_price between 5 and 10;
在使用between时,所需范围的低端值和高端值之间必须用and关键字分隔,between匹配范围中的所有值,包括指定的开始指与结束值,也就是说所给的范围是一个闭区间。
空值检查
一个列不包含值时,我们称其为包含空值NULL。
select语句中有一个特殊的where子句,可用来检查具有NULL值的列,这个where子句就是IS NULL语句。语法为:
select prod_name from products where prod_price is null;
注意:在通过过滤选择出不具有特定值的行时,你可能希望返回具有NULL的值的行,但是并不会,数据库并不知但空值是否匹配我们给出的匹配条件,所以在匹配过滤或者不匹配过滤时不返回它们。
因此,在过滤数据时,一定要先验证返回数据中确实给出了被过滤列具有NULL的行。
第七章 数据过滤
第一节 组合where语句
在上一章中,where子句在过滤数据时使用的都是单一的条件,为了进行更加强大的过滤控制,MySQL允许使用多个where子句。这时可以使用两种方式使用:
- 使用and子句的方式;
- or子句的方式使用。
例子:
1. and 操作符
select prod_id, prod_price, prod_name from products where vend_id = 1003 and prod_price <= 10;
还可以添加多个过滤语句,每添加一条就要使用一个and。
2.or操作符
select prod_name, prod_price from products where vend_id = 1002 or vend_id = 1003;
计算次序
当使用and 和or进行组合时,可能会产生组合上的错误,例如:
select prod_name, prod_price from products where vend_id = 1002 or vend_id = 1003 and prod_price >= 10;
这句话我们原本想要表达的意思是说选择vend_id为1002或者1003,而且prod_price要大于等于10的产品,但是在实际运行过程中,MySQL或首先运行and部分,即先找符合vend_id=1003并且prod_price=10的产品,再去寻找vend_id=1002而prod_price随意的产品,运行结果就会和我们想要得到的结果出现不一致。我们需要更改为:
select prod_name, prod_price from products where (vend_id = 1002 or vend_id = 1003) and prod_price >= 10;
第二节 IN操作符
IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取由逗号分隔开来的合法值的清单。例如:
select prod_name, prod_price from products where vend_id in (1002, 1003) order by prod_name;
实际上,in操作符的功能和or是一样的,但是我们还是优先选择in操作符,原因有:
- 在使用长的合法选项清单时,in操作符的语法更清楚且更直观;
- 在使用in时,计算的次序更容易管理;
- in操作符一般比or执行更快;
- in的最大优点在于可以包含其他select语句,使得能够更动态的建立where子句。
not操作符
not操作符唯一的功能就是否定它之后的任何条件。例如:
select prod_name, prod_price from products where vend_id not in (1002, 1003) order by prod_name;
MySQL中支持使用NOT对IN、between和exists子句取反,这与多数其他DBMS允许使用not对各种条件取反有很大的差别。
第八章 用通配符进行过滤
第一节 like操作符
为了搜索子句使用通配符,必须使用like操作符。like指示MySQL,后面的搜索模式利用通配符而不是直接相等匹配进行比较。
%操作符
%表示任意字符出现任意次数,例如为了找出以词jet起头的产品,可使用以下语句:
select prod_id, prod_name from products where prod_name like 'jet%';
应该注意的是,除了一个或多个字符外,%还能匹配0个字符。%代表的是搜索模式中给定位置的0个、1个或多个字符。
特别需要注意到的时尾空格,尾空格会干扰到通配符匹配。例如,例如在保存anvil时,如果它的后面有一个或多个空格,则子句 "where prod_name like %anvil;"将不会匹配到它们,因为在最后的l后面还有空格符。解决这一问题的有效办法就是在搜索模式后面附加一个%,一个更好的办法就是使用函数去掉首尾空格。
虽然表面上%可以匹配任意东西,但是实际上它并不能匹配到NULL,即便是“
where prod_name like %”也不能匹配到NULL。
下划线(_)操作符
_操作符的作用和%一样,但是下划线只匹配单个字符而不是多个字符。例如:
select prod_id, prod_name from products where prod_name like '_ ton anvil;'
第二节 使用通配符的技巧
在使用通配符时,要主要的是:
- 不要过度使用通配符,如果其他操作符能做到相同的功能,应该使用其他操作符。
- 将通配符放置在搜索模式的开始处,搜索起来是最慢的。
- 仔细注意通配符的位置。如果放错地方,可能得不到想要的结果。