《MySQL必知必会》学习笔记__第1章至第10章

《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语句的帮助;

输入quitexit退出后命令行实用程序。

第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 DATABASESSHOW CREATE TABLE,分别用来显示创建特定数据库或表的MySQL语句;

SHOW GRANTS: 用于显示授权用户的安全权限;

SHOW ERRORSSHOW 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

猜你喜欢

转载自www.cnblogs.com/violethjq/p/10435567.html