《MySQL必知必会》豆瓣读书链接 https://book.douban.com/subject/3354490/
第1章 了解SQL
一些重要的概念:
1. 数据库(Database): 保存有组织的数据的容器(通常是一个文件或一组文件)。
数据库软件称为数据库管理系统(DBMS)。
2. 表(table): 表是一种结构化的文件,用来储存某种特定类型的数据。
数据库中的每个表都有一个名字来标识自己,这个名字是唯一的。
但是在不同的数据库中,却可以使用相同的表名。
3. 模式(schema): 关于数据库和表的布局及特性的信息。
4. 列(column): 列是表中的一个字段。所有表都是由一个或多个列组成的。
5. 数据类型(datatype): 数据类型表示所容许的数据的类型。每个表列都有相应的数据类型,它限制或容许该列中储存的数据。
6. 行(row): 表中的数据是按行储存的,所保存的每个记录存储在自己的行内。行表示表中的一个记录。
7. 主键(primary key): 表中每一行都应该有可以唯一标识自己的一列(或一组列)。主键为一列(或一组列),其值能够唯一区分表中每个行。
表中的任何列都可以作为主键,只要它满足以下条件:
(1) 任意两行都不具有相同的主键值;
(2) 每个行都必须具有一个主键值(主键列不允许NULL值)。
主键可以定义在一列或者多个列上。
8. SQL: SQL是一种专门用来与书海库通信的语言。
9. 关键字 (key word): 作为MySQL语言组成部分的一个保留字。一定不能用关键字命名一个表或列。
MySQL不区分大小写,但是关键字一般采用大写表示。
10. 自动增量(auto_increment):MySQL可以自动地为每个行分配下一个可用编号,不用在添加一行是手动分配唯一值,这个功能就是自动增量。
11. NULL 无值 (no value): 它与字段包含0、空字符串或仅仅包含空格不同。
第2章 MySQL简介
MySQL是一种数据库管理软件,它是一种基于客户机-服务器的数据库。
在电脑终端输入mysql -uroot -p,然后输入密码进入MySQL。
MySQL的命令输入在mysql>之后;
用分号“;”或者g结束,仅按Enter不能执行命令;
输入help或者h获得帮助,也可以输入更多的文本获得特定命令的帮助,如help SELECT 获得使用SELECT语句的帮助;
输入quit 或exit退出后命令行实用程序。
第3章 使用MySQL
显示现有可用的数据库的一个列表:SHOW DATABASES;
使用必知必会数据库:USE bizhibihui;
获得bizhibihui数据库中的表的列表:SHOW TABLES;
显示表列: SHOW COLUMNS FROM customers; 这种表示方法等价于 DESC customers;
运行结果显示customers中的每个字段返回一行,行中包含字段名、数据类型、是否允许NULL 、键的信息、默认值以及其他信息。
int() 代表整数型数据, char()代表字符型数据,auto_increment表示自动增量。
自动增量:MySQL可以自动地为每个行分配下一个可用编号,不用在添加一行是手动分配唯一值,这个功能就是自动增量。
MySQL中的其他SHOW语句还有:
SHOW STATUS: 用于显示广泛的服务器状态信息;
SHOW CREATE DATABASES和SHOW CREATE TABLE,分别用来显示创建特定数据库或表的MySQL语句;
SHOW GRANTS: 用于显示授权用户的安全权限;
SHOW ERRORS和SHOW WARNINGS:用来显示服务器错误或警告消息。
第4章 检索数据
利用products表进行数据检索
查看products的表内信息,DESC products;
检索单列:从products表中检索名为prod_name的列:SELECT prod_name FROM products;
MySQL不区分大小写,但是建议对SQL关键字时候用大写字母,所有的表名和列名使用小写字母,这样使代码更易于阅读和调试。在处理SQL语句时,所有的空格都被忽略。
检索多个列:从products表中检索名为prod_id, prod_name, prod_price的列:SELECT prod_id, prod_name, prod_price FROM products;
检索所有列:从products表中检索所有列:SELECT * FROM products; 其中,*为通配符。
检索不同的行:SELECT DISTINCT vend_id FROM products;
SELECT vend_id FROM products;
DISTINCT作为关键字,可以使MySQL返回不同的vend_id值。在使用DISTINCT关键字时,它必须直接放到列名之前。
限制结果:利用LIMIT关键字,使MySQL返回表的第一行或前几行:SELECT prod_name FROM products LIMIT 5; 返回prod_name的前五行
为了得到下一个五行,需要制定检索的开始行和行数:SELECT prod_name FROM products LIMIT 5,5; 结果为prod_name的第6至10行
SELECT prod_name FROM products;
LIMIT检索出来的第一行为行0,因此LIMIT 1, 1将检索出第二行而不是第一行。
SELECT prod_name FROM products LIMIT 1, 1;
使用完全限定的表名,即同时使用表名和列字:SELECT products.prod_name FROM bizhibihui.products;
第5章 排序检索数据
子句(clause): SQL语句由子句构成,有些子句是必需的,而有的是可选的。一个子句通常由一个关键字和所提供的数据组成。
ORDER BY子句:对输出进行排序:SELECT prod_name FROM products ORDER BY prod_name;
对prod_name列以字母顺序排序。
按多个列排序:SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name;
先按照prod_price排序,再按照名称排序;仅仅在多个行具有相同的prod_price值时,才对产品按照prod_name进行排序;如果prod_price列中所有的值都是唯一的,则不会按照prod_name排序。
指定排序方向:ORDER BY 的默认排序方式为升序排序(A->Z),若想降序排序,则需要使用DESC关键字。 SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC;
按照prod_price的值降序排序; DESC关键字只应用到直接位于其前面的列名。
用多个列进行排序:SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC, prod_name;
对prod_price 进行降序,对prod_name仍然进行升序排列。
如果想在多个列都进行降序排序,必须对每个列指定DESC关键字。
检索出最昂贵物品的值:SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;
在使用ORDER BY子句时,子句的次序十分重要,必须为FROM->ORDER BY->LIMIT。
第6章 过滤数据
搜索条件(search criteria) == 过滤条件(filter condition)
使用WHERE子句,根据子句中指定的搜索条件进行过滤。
SELECT prod_name, prod_price FROM products WHERE prod_price = 2.50;
从products表中检索两个列,只返回prod_price值为2.50的行。
语序:在同时使用ORDER BY和WHERE语句时,语序应该为WHERE -> ORDER BY。
WHERE子句操作符:
= 等于
<> != 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
BETWEEN 在指定的两个值之间
检查单个值:SELECT prod_name, prod_price FROM products WHERE prod_name = 'fuses';
SELECT prod_name, prod_price FROM products WHERE prod_price < 10;
SELECT prod_name, prod_price FROM products WHERE prod_price <= 10;
不匹配检查:SELECT vend_id, prod_name FROM products WHERE vend_id != 1003;
范围值检查:SELECT prod_name, prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;
空值检查:
NULL 无值 (no value): 它与字段包含0、空字符串或仅仅包含空格不同。
SELECT prod_name FROM products WHERE prod_price IS NULL;
SELECT cust_id FROM customers WHERE cust_email IS NULL;
第7章 数据过滤
MySQL允许给出多个WHERE子句,这些子句可以有以下两种使用方式:以AND子句的方式或OR子句的方式使用。
AND操作符:SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10;
此句检索出由供应商1003制造且价格小于等于10美元的所有商品的ID number,名字和价格。
AND:用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行。
OR操作符:SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003;
OR: WHERE子句中使用的关键字,用来表示检所匹配任一给定条件的行。
计算次序:SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003 AND prod_price >= 10;
计算次序:在处理OR操作符之前,优先处理AND操作符。
上述语句应当理解为:由供应商1003制造的任何价格为10美元(含)以上的产品,或者有供应商1002制造的任何产品,而不管其价格如何。
使用括号:SELECT prod_name, prod_price FROM products WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;
上述语句应当理解为:由供应商1002或1003制造的且价格都在10美元(含)以上的任何产品。
IN操作符:用来指定条件范围,范围中的每个条件都可以进行匹配。IN取值合法值 有逗号分隔的清单,全都括在圆括号中。
SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003
ORDER BY prod_name;
等价于
SELECT prod_name, prod_price FROM products WHERE vend_id IN (1002, 1003) ORDER BY prod_name;
IN: WHERE子句中用来指定要匹配值的清单的关键字,功能与OR相当。
NOT操作符:WHERE 子句中用来否定它之后的任何条件。
SELECT prod_name, prod_price FROM products WHERE vend_id NOT IN (1002, 1003) ORDER BY prod_name;
MySQL中的NOT仅支持对IN BETWEEN 和EXISTS子句取反。
第8章 用通配符进行过滤
通配符(wildcard): 用来匹配值的一部分的特殊字符。
搜索模式(search pattern): 由字面值、通配符或两者组合构成的搜索条件。
通配符本身实际是SQL的WHERE子句中含有特殊含义的字符。
在搜索子句中使用通配符,必须使用LIKE操作符。
最常用的通配符是百分号(%) ,在搜索串中,%表示任何字符出现任意次数。
找出所有以 jet 起头的产品:SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 'jet%';
通噢诶副可以在搜索模式中任意位置使用,并且可以使用多个通配符。
SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '%anvil%';
通配符可以出现在搜索模式的中间:SELECT prod_name FROM products WHERE prod_name LIKE 's%e';
除了一个或多个字符外,%还能匹配0个字符;%代表搜索模式中给定位置的0个、1个或多个字符;%不能匹配NULL。
另外一个重要的通配符是下划线(_)。
下划线的用途与%一样,但下划线只能匹配单个字符而不是多个字符。
SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '_ ton anvil';
SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '% ton anvil';
第9章 用正则表达式进行搜索
正则表达式使用来匹配文本的特殊的字符集合。
检索prod_name包含文本1000的所有行:SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;
SELECT prod_name FROM products WHERE prod_name REGEXP '.000' ORDER BY prod_name;
. 是正则表达式语言中一个特殊的字符。它表示匹配任意一个字符。
REGEXP '1000' 和 LIKE '1000'的区别:
SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;
SELECT prod_name FROM products WHERE prod_name LIKE '1000' ORDER BY prod_name;
REGEXP是在列内进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它;
LIKE是匹配整个列,如果被匹配的文本在列值中出现,LIKE将不会找到它;
MySQL中的正则表达式不区分大小写,为了区分大小写可以使用关键字BINARY,如WHERE prod_name REGEXP BINARY 'JetPack .000'。
进行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] Ton' ORDER BY prod_name;
[123]定义了一组字符,它的意思是匹配1或2或3。
SELECT prod_name FROM products WHERE prod_name REGEXP '1|2|3 Ton' ORDER BY prod_name;
否定一个字符集,可以再集合开始的地方放置一个^。
[123]可以匹配字符1、2或3,但[^123]却匹配除了这些字符外的任何东西。
匹配范围: 集合可以用来定义要匹配的一个或多个字符。[0123456789]和[0-9]可以匹配数字0到9。
SELECT prod_name FROM products WHERE prod_name REGEXP '[1-5] Ton' ORDER BY prod_name; 匹配1到5
匹配特殊字符:SELECT vend_name FROM vendors WHERE vend_name REGEXP '.' ORDER BY vend_name;
. 匹配任意字符,所以每个行都被检索出来。
转义:为了匹配特殊字符,必须使用\为前导。\-表示查找-,\.表示查找.。
SELECT vend_names FROM vendors WHERE vend_names REGEXP '\.' ORDER BY vend_name;
空白元字符:
\f 换页
\n 换行
\r 回车
\t 制表
\v 纵向制表
为了匹配反斜杠本身,需要使用\。
匹配字符类:为了更方便的工作,可以适用预定义的字符集,称为字符类。
字符类及其含义:
[:alnum:] 任意字母和数字(同 [a-zA-Z0-9] )
[:alpha:] 任意字符( 同[a-zA-Z] )
[:blank:] 空格和制表(同 [\t] )
[:cntrl:] ASCII控制字符(ASCII 0 到31和127)
[:digit:] 任意数字(同 [0-9] )
[:graph:] 与[:print]相同,但不包括空格
[:lower:] 任意小写字母(同 [a-z] )
[:print:] 任意可打印字符
[:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
[:space:] 包括空格在内的任意空白字符(同 [\f\n\r\t\v] )
[:upper:] 任意大写字母(同 [A-Z] )
[:xdigit:] 任意十六进制数字 (同 [a-fA-F0-9] )
匹配多个实例:
重复元字符:
* 0或多个匹配
+ 1或多个匹配(等于{1,})
? 0或1个匹配 (等于{0,1})
{n} 指定数目的匹配
{n,} 不少于指定数目的匹配
{n,m} 匹配数目的范围(m不超过255)
SELECT prod_name FROM products WHERE prod_name REGEXP '\([0-9] sticks?\)';
\ 表示查找或者匹配,[0-9]匹配任意数字,sticks? s后面的?使s可选,?匹配它前面的s出现0次或者1次。
SELECT prod_name FROM products WHERE prod_name REGEXP '[[:digit:]]{4}';
等同于
SELECT prod_name FROM products WHERE prod_name REGEXP '[0-9][0-9][0-9][0-9]';
此句匹配了连在一起的4位数字。
定位符:
定位元字符:
^ 文本的开始
$ 文本的结尾
[[:<:]] 词的开始
[[:>:]] 词的结尾
寻找一个数(包括以小数点开始的数)开始的所有产品:SELECT prod_name FROM products WHERE prod_name REGEXP '^[0-9\.]' ORDER BY prod_name;
^的双重用途:否定和串开始处:[^123] 除了123以外的字符;^[123] 串的开始处。
REGEXP匹配子串,LIKE匹配整个串,用^开始每个表达式和$结束每个表达式,解一时REGEXP和LIKE的作用一样。
第10章 创建计算字段
字段(field): 基本上与列(column)的意思相同,字段与列经常互换使用,不过数据库列一般称为列,而字段通常用在计算字段的连接上。
拼接(concatenate):将值联结到一起构成单个值。
在MySQL中的SELECT 语句中,可以使用Concat()函数来拼接两个列:
SELECT Concat(vend_name, '(', vend_country, '(') FROM vendors ORDER BY vend_name;
利用RTrim()函数来删除数据右侧多余的空格:
SELECT Concat(RTrim(vend_name), '(', RTrim(vend_country), ')' ) FROM vendors ORDER BY vend_name;
LTrim() 去掉串左边的空格,Trim() 去掉串左右两侧的空格。
使用别名:别名(alias) 是一个字段或值的替换名,别名用AS关键字赋予。
SELECT Concat(RTrim (vend_name), '(', RTrim(vend_country), ')' ) AS vend_title FROM vendors ORDER BY vend_name;
执行算数计算:SELECT prod_id, quantity, item_price FROM orderitems WHERE order_num = 20005;
SELECT prod_id, quantity, item_price, quantity*item_price AS expander_price FROM orderitems WHERE order_num = 20005;
此句汇总了物品的价格(单价乘以订购数量) AS expander_price。
MySQL算数操作符:
+ 加
- 减
* 乘
/ 除
测试计算:SELECT 3*2; 将返回6,SELECT Trim('abc'); 将返回abc,SELECT Now(); 将返回当前日期和时间。
以上内容是《MySQL必知必会》前十章的学习笔记,欢迎大家多多批评指正。
祝好
Violet HE
2019.2.27 11:05