mysql必知必会读书笔记1

全书共有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解释一个,正则表达式解释一个。

你可能感兴趣的:(mysql必知必会读书笔记1)