全书共有30章,在通读完之后。进行总结。
全书可以划分为1,2章节是对MYSQL数据库的介绍;3章节是连接数据库;4-18章主要是查询的各种操作,是重点;19章是插入数据;20章是更新和删除数据;21章是对表的操作;22章-25章是对视图,存储过程,游标,触发器的介绍,剩下的章节是关于安全性和性能的一些知识。对常用的命令进行提取和注意点的总结。
对于性能的知识得格外的注意,防止开发过程中出现慢查询,导致阻塞。总结中采用 红色+倾斜+加粗的字体引起重视。其中,对于聚集函数的使用,应该根据实际项目中开发所碰到的表的数据量来决定是否使用,对于多人操作的量大的表,还是不要直接对表查询的时候进行一些聚集函数的操作,可以将数据返回之后,进行处理。
1.MYSQL数据库的介绍
数据库:保存有组织的数据的容器(通常是一个文件或者是一组文件)。
表: 同一数据库,表具有唯一的名字。
模 式:关于数据库和表的布局及特性的信息。貌似没有用过,先暂时省略。。
主 键:并不强求一定有主键,但还是最好保证创建的表具有一个主键,便于数据的操纵和管理。
有几个好的习惯:
1.不更新主键列中的值
2.不重用主键列中的值
3.不在主键列中使用可能会更改的值。(例如,如果使用一个名字)
SQL:是一种专门用来与数据库通信的语言。
MYSQL工具:
1.mysql命令行实用程序
brew install mysql
mysql.server start
mysql -h 10.10.0.27 -u XXX -p
2.mysql Administrator
3.mysql Query Browser
2.连接数据库
命令行:
1.选择一个数据库
USE database;
输出:Database changed
2.显示信息——> HELP SHOW;
SHOW DATABASES;
输出:可用数据库的列表
SHOW TABLES;
输出:当前选择的数据库内可用表的列表
SHOW COLUMNS FROM customers; 或者 DESCRIBE customers;
输出:SHOW COLUMNS要求给出一个表名,它对每个字段返回一行,行中包括字段名(Field),数据类型(Type),是否允许NULL(Null),键信息(Key),默认值(Default)以及其他信息(Extra).
SHOW STATUS;
输出:用于显示广泛的服务器状态信息;
SHOW GRANTS;
输出:用来显示授予用户(所有用户或特定用户)的安全权限
SHOW ERRORS和SHOW WARNINGS;
输出:用来显示服务器错误或者警告的信息
3.对数据库的查询
注意点:
1.多条SQL语句必须以分号(;)分隔,不需要在单条之后加,但是总是加上总不会错;mysql的命令行,则必须加上分号来结尾;
2.SQL语句不区分不小写,但为了规范对SQL的关键字使用大写,对所有列名和表名使用小写;
3.使用空格:在处理SQL语句时,其中所有空格都被忽略。可以在一行或者多行给出。建议分成多行更容易阅读。
查询语句汇集:
1.检索单个列
SELECT prod_name FROM products;
注:这条语句将返回表中的所有行,不用的人使用可能返回的数据顺序不一样,这是一种正常的情况。返回的数据没有特殊的意义,顺序可能是数据被添加到表中的顺序,也可能不是。只要返回相同数目的行,就是正确的。
2.检索多个列
SELECT prod_name,prod_id,prod_price FROM products;
3.检索所有列
SELECT * FROM products;
注:除非确定需要所有的列,一般不建议直接使用通配符,检索不需要的列会降低检索和应用程序的性能。
4.检索不同的行
SELECT DISTINCT vend_id FROM products;
注:不能部分使用DISTINCT,DISTINCT关键字应用与所有列而不仅仅是前置它的列。如果给出SELECT DISTINCT vend_id,prod_price FROM products,除非指定的所有列都不相同,否则所有行都将被检索出来。
5.限制结果
SELECT prod_name FROM products LIMIT 5;
注:LIMIT 5,5指示返回从行5开始的5行。第一个数字为开始位置,第二个数字为要检索的行数。在行数不够时,LIMIT中指定要检索的行数为检索的最大行数,如果没有足够的行(例如LIMIT10,5;但只有13行),将只返回它能返回的那么多行。
6.使用完全限定的表名
SELECT products.prod_name FROM products;
7.排序顺序
SELECT prod_name FROM products ORDER BY prod_name;
注:按字母顺序排列。
8.按多个列排序
SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price,prod_name;
注:在按多个列排序时,排序完全按所规定的顺序进行。也就是仅在多个行具有相同的prod_price值时才对产品按prod_name进行排序,如果prod_price列中的所有的值都是唯一的,则不会按prod_name排序。
9.指定排列方向
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只应用到直接位于其前面的列。上面,只对prod_price排序,对prod_name不排序。如果想在多个列上进行降序排序,必须对每个列指定DESC关键字。
10.使用WHREE子句
SELECT prod_name,prod_price,FROM products WHERE prod_name = 2.50;
注:WHRER子句操作符:=,<>,!=,<,<=,>,>=,BETWEEN…AND..
11.空值检查
SELECT prod_id FROM products WHERE prod_name IS NULL;
注:NULL 与不匹配,在通过过滤选择出不具有特定值的行时,你可能希望返回具有NULL值的行。但是,不行。因为未知具有特殊的含义,数据库不知道他们是不是匹配,所以在匹配过滤或者不匹配过滤时不返回他们。因此,在过滤数据时,一定要验证返回数据中确实给出了被过滤行具有NULL的行。
12.AND操作符
SELECT prod_id,prod_price,prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10;
13.OR操作符
SELECT prod_name,prod_price FROM products WHERE vend_id = 1002 OR vender_id =1003;
注:AND和OR的计算次序,由于AND的优先级高于OR,所以在碰到a OR b AND c会处理成a OR (b AND c),所以解决问题的方法是使用圆括号明确的进行分组。
14.IN操作符
SELECT prod_name,prod_price FROM products WHERE vend_id IN (1002,1003) ORDER BY prod_name;
注:上面的IN可以使用OR也生效。但是为什么要使用IN?
1.在使用长的合法选项清单时,IN操作符的语句更清楚且更直观。
2.在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。
3.IN操作符一般比OR操作符的执行更快。
4.IN的最大优点是可以包含其他SELECT语句,使得能够更动态的建立WHERE语句。
15.NOT操作符
SELECT prod_name,prod_price FROM products WHERE vend_id NOT IN (1002,1003) ORDER BY prod_name;
注:mysql支持使用NOT对IN,BETWEEN和EXISTS子句取反。
16.LIKE操作符
%通配符:任何字符出现任意次数。
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE ‘jet%’;
注:1.尾空格可能会干扰通配符匹配。解决这个问题的办法一是在搜索模式的最后附加一个%,另一个办法是使用函数去掉首位空格。2.WHERE prod_name LIKE ‘%’不会匹配到NULL值。
_通配符:单个字符出现任意次数。
SELECT prod_id,prod_name FROM products WHERE prod_name LIKE ‘_ ton anvil’;
注:与%能匹配0个字符不一样,_总能匹配一个字符,不能多也不能少。
注:通配符搜索的处理一般要花费时间更长。下面是一些技巧:
1.不要过度使用通配符。如果其他操作符能达到相同的目的,应该使用其他操作符。
2.在确实需要使用通配符时,除非绝对有必要,否则不要把他们用到搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起步时最慢的。
3.仔细注意通配符的位置。如果放错位置,可能你不会返回想要的数据。
17.正则表达式
基本字符匹配 :包含XXX的行
SELECT prod_name FROM products WHERE prod_name REGEXP ‘1000’ ORDER BY prod_name;
====================
LIKE 和 REGEXP:在LIKE和REGEXP之间有一个重要的差别。请看一下两条语句:
SELECT prod_name FROM products WHERE prod_name LIKE ‘1000’ ORDER BY prod_name;
SELECT prod_name FROM products WHERE prod_name REGEXP ‘1000’ ORDER BY prod_name;
如果执行上面两条语句,会发现第一条语句不返回数据,而第二条语句返回一行。为什么?
LIKE 匹配整个列,如果被匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不被返回(除非使用通配符)。而REGEXP在列值内进行匹配,(指的是包含1000的行)如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。这是一个非常重要的区别。
那么,REGEXP能不能用来匹配整个列值(从来起于LIKE相同的作用)?使用^和定位符即可。
OR匹配
SELECT prod_name FROM products WHERE prod_name REGEXP ‘1000|2000’ ORDER BY prod_name;
匹配几个字符之一
SELECT prod_name FROM products WHERE prod_name REGEXP ‘[123] Tom’ ORDER BY prod_name;
注:[^123]匹配除这些字符外的任何东西。
匹配范围
SELECT prod_name FROM products WHERE prod_name REGEXP ‘[1-5] Tom’ ORDER BY prod_name;
匹配特殊字符
SELECT vender_name FROM venders WHERE vend_name REGEXP ‘\\.’ ORDER BY vender_name;
注意:mysql的转义需要两个反斜杠,mysql解释一个,正则表达式解释一个。