mysql必知必会 豆瓣_《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。

958f52578433050c91217797779cd3d3.png

MySQL的命令输入在mysql>之后;

用分号“;”或者\g结束,仅按Enter不能执行命令;

输入help或者\h获得帮助,也可以输入更多的文本获得特定命令的帮助,如help SELECT 获得使用SELECT语句的帮助;

输入quit 或exit退出后命令行实用程序。

第3章 使用MySQL

显示现有可用的数据库的一个列表:SHOW DATABASES;

04e8556c5393b63700761af76ea7ca0f.png

使用必知必会数据库:USE bizhibihui;

3075d96e0c420cf009386801db112bed.png

获得bizhibihui数据库中的表的列表:SHOW TABLES;

a2ec0c5454c04fd62337ced850922343.png

显示表列:SHOW COLUMNS FROM customers; 这种表示方法等价于  DESC customers;

b96d9aff2be60405375cde5521c1ea0e.png

运行结果显示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;

3be109c4d012245352539fb27b145bdd.png

检索单列:从products表中检索名为prod_name的列:SELECT prod_name FROM products;

bdf57145d777ea50e6df559b82fa360a.png

MySQL不区分大小写,但是建议对SQL关键字时候用大写字母,所有的表名和列名使用小写字母,这样使代码更易于阅读和调试。在处理SQL语句时,所有的空格都被忽略。

检索多个列:从products表中检索名为prod_id, prod_name, prod_price的列:SELECT prod_id, prod_name, prod_price FROM products;

e5f3585b13ade9cf27ecc05494d413fe.png

检索所有列:从products表中检索所有列:SELECT * FROM products;其中,*为通配符。

07353c576a764a07a1bf8930373f1d89.png

检索不同的行:SELECT DISTINCT vend_id FROM products;

4354905f39bd51c48cc9085666bbcb5d.png

SELECT vend_id FROM products;

2c015a6348c3d5ff02c763ebad4f64fd.png

DISTINCT作为关键字,可以使MySQL返回不同的vend_id值。在使用DISTINCT关键字时,它必须直接放到列名之前。

限制结果:利用LIMIT关键字,使MySQL返回表的第一行或前几行:SELECT prod_name FROM products LIMIT 5;返回prod_name的前五行

90812060a7e12d7808022a0442c4ce62.png

为了得到下一个五行,需要制定检索的开始行和行数:SELECT prod_name FROM products LIMIT 5,5;结果为prod_name的第6至10行

687b95362e842d6c0d120783a8342edd.png

SELECT prod_name FROM products;

46c9d7080288f1f3f4e58515250cc307.png

LIMIT检索出来的第一行为行0,因此LIMIT 1, 1将检索出第二行而不是第一行。

SELECT prod_name FROM products LIMIT 1, 1;

e55faa5843bb25793ab19b6b701776dc.png

使用完全限定的表名,即同时使用表名和列字:SELECT products.prod_name FROM bizhibihui.products;

530d0030b1d2c9ffb35aacb2ab393144.png

第5章 排序检索数据

子句(clause): SQL语句由子句构成,有些子句是必需的,而有的是可选的。一个子句通常由一个关键字和所提供的数据组成。

ORDER BY子句:对输出进行排序:SELECT prod_name FROM products ORDER BY prod_name;

40473056cb9c2193f58dd4b93dc4093e.png

对prod_name列以字母顺序排序。

按多个列排序:SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name;

16c4319bf43e3acdb1e472092bf03a82.png

先按照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;

7346928a4d062adae048150962872fbe.png

按照prod_price的值降序排序; DESC关键字只应用到直接位于其前面的列名。

用多个列进行排序:SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC, prod_name;

2e95f356af9c6b8554b28fd68f38ee24.png

对prod_price 进行降序,对prod_name仍然进行升序排列。

如果想在多个列都进行降序排序,必须对每个列指定DESC关键字。

检索出最昂贵物品的值:SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;

670b7ee1335ae5b8e0ebda02456703ce.png

在使用ORDER BY子句时,子句的次序十分重要,必须为FROM->ORDER BY->LIMIT。

第6章 过滤数据

搜索条件(search criteria) ==过滤条件(filter condition)

使用WHERE子句,根据子句中指定的搜索条件进行过滤。

SELECT prod_name, prod_price FROM products WHERE prod_price = 2.50;

36f775f3dc15155869c2cc6960466e24.png

从products表中检索两个列,只返回prod_price值为2.50的行。

语序:在同时使用ORDER BY和WHERE语句时,语序应该为WHERE -> ORDER BY。

WHERE子句操作符:

= 等于

<>    !=   不等于

< 小于

<= 小于等于

> 大于

>= 大于等于

BETWEEN 在指定的两个值之间

检查单个值:SELECT prod_name, prod_price FROM products WHERE prod_name = 'fuses';

b247ec0a82d94b355f61597d2b9089f8.png

SELECT prod_name, prod_price FROM products WHERE prod_price < 10;

583566f9a39dd065fc9aa55fe8fc8c28.png

SELECT prod_name, prod_price FROM products WHERE prod_price <= 10;

b04f6c0ae2fd324ff1f4588e62dc2593.png

不匹配检查:SELECT vend_id, prod_name FROM products WHERE vend_id != 1003;

75b0c6761d58311d8b8c88b454cc58e8.png

范围值检查:SELECT prod_name, prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;

36216bf4d4bb87f505de2b47fcee572e.png

空值检查:

NULL 无值 (no value): 它与字段包含0、空字符串或仅仅包含空格不同。

SELECT prod_name FROM products WHERE prod_price IS NULL;

66d00b4e470dc511977aa5ce95d671a0.png

SELECT cust_id FROM customers WHERE cust_email IS NULL;

bb127b1ba8789dfb6d9d9c77279c32dd.png

第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,名字和价格。

f8750acf16525ec6769656f997670c9d.png

AND:用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行。

OR操作符:SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR vend_id = 1003;

70e1708a7d71863a7353a8559af50036.png

OR: WHERE子句中使用的关键字,用来表示检所匹配任一给定条件的行。

计算次序:SELECT prod_name, prod_price FROM products WHERE vend_id  = 1002 OR vend_id = 1003 AND prod_price >= 10;

97763df17ad3cb2ae7a6dbfbdc95cf0a.png

计算次序:在处理OR操作符之前,优先处理AND操作符。

上述语句应当理解为:由供应商1003制造的任何价格为10美元(含)以上的产品,或者有供应商1002制造的任何产品,而不管其价格如何。

使用括号:SELECT prod_name, prod_price FROM products WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;

e546b550569947f219ba369e11465906.png

上述语句应当理解为:由供应商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;

24d36ed2e882ffdbd88f21b9ecb9d69c.png

IN: WHERE子句中用来指定要匹配值的清单的关键字,功能与OR相当。

NOT操作符:WHERE 子句中用来否定它之后的任何条件。

SELECT prod_name, prod_price FROM products WHERE vend_id NOT IN (1002, 1003) ORDER BY prod_name;

1f194b5320a069d3ae4e41cb5d88d4da.png

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%';

437992acc909c8a985b6e11a3143a8ac.png

通噢诶副可以在搜索模式中任意位置使用,并且可以使用多个通配符。

SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '%anvil%';

6e9852485915fed42bbc0ced899b0db2.png

通配符可以出现在搜索模式的中间:SELECT prod_name FROM products WHERE prod_name LIKE 's%e';

4f3eb407b3765da90cc77079b1e01da6.png

除了一个或多个字符外,%还能匹配0个字符;%代表搜索模式中给定位置的0个、1个或多个字符;%不能匹配NULL。

另外一个重要的通配符是下划线(_)。

下划线的用途与%一样,但下划线只能匹配单个字符而不是多个字符。

SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '_ ton anvil';

23a7c77494697d20ae3706827cd3edea.png

SELECT prod_id, prod_name FROM products WHERE prod_name LIKE '% ton anvil';

80581a9f6ef9acd378028789e026c213.png

第9章 用正则表达式进行搜索

正则表达式使用来匹配文本的特殊的字符集合。

检索prod_name包含文本1000的所有行:SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;

c8e403e195295217d41fe3d0df9d0ffa.png

SELECT prod_name FROM products WHERE prod_name REGEXP '.000' ORDER BY prod_name;

67bfd771278492a66fffa5cc96a136e5.png

. 是正则表达式语言中一个特殊的字符。它表示匹配任意一个字符。

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;

f928062c28003c7ce7f883b5accca125.png

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;

60b40c673da9278a8a3404cf5157fe38.png

匹配几个字符之一:通过指定一组[和]括起来的字符完成 :SELECT prod_name FROM products WHERE prod_name REGEXP '[123] Ton' ORDER BY prod_name;

bd8ee8cf95e331cb193660262245d115.png

[123]定义了一组字符,它的意思是匹配1或2或3。

SELECT prod_name FROM products WHERE prod_name REGEXP '1|2|3 Ton' ORDER BY prod_name;

40443a70adaa5c8d248ddd652102a10d.png

否定一个字符集,可以再集合开始的地方放置一个^。

[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

d12437295c9c81505ad605b5054c56ae.png

匹配特殊字符:SELECT vend_name FROM vendors WHERE vend_name REGEXP '.' ORDER BY vend_name;

fd644616365e549e07349c9e3ca17be3.png

. 匹配任意字符,所以每个行都被检索出来。

转义:为了匹配特殊字符,必须使用\\为前导。\\-表示查找-,\\.表示查找.。

SELECT  vend_names FROM vendors WHERE vend_names REGEXP '\\.' ORDER BY vend_name;

3ebb92c3db9a2a1147d3fe411d0ac8be.png

空白元字符:

\\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次。

590be9b1cd9fffdfae85a08d7b3b3547.png

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位数字。

b026672e877557fa484c75a4d535a949.png

8a9bc1ddd6d05c6d6f99f213aa7b9b0d.png

定位符:

定位元字符:

^ 文本的开始

$ 文本的结尾

[[:<:>

[[:>:]] 词的结尾

寻找一个数(包括以小数点开始的数)开始的所有产品:SELECT prod_name FROM products WHERE prod_name REGEXP '^[0-9\\.]' ORDER BY prod_name;

466f0a44df6f1d9934cf0713c117d441.png

^的双重用途:否定和串开始处:[^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;

b7c1128a0e65128f75d17f5bb9d6197c.png

利用RTrim()函数来删除数据右侧多余的空格:

SELECT Concat(RTrim(vend_name), '(', RTrim(vend_country), ')' ) FROM vendors ORDER BY vend_name;

LTrim() 去掉串左边的空格,Trim() 去掉串左右两侧的空格。

fb518b09d03f7d74e35bcb08e0614938.png

使用别名:别名(alias)是一个字段或值的替换名,别名用AS关键字赋予。

SELECT Concat(RTrim (vend_name), '(', RTrim(vend_country), ')' ) AS vend_title FROM vendors ORDER BY vend_name;

5e268bb153e3ef59e90d3dc1b3c702bc.png

执行算数计算:SELECT prod_id, quantity, item_price FROM orderitems WHERE order_num = 20005;

4bbd1d0010cc820bff37fa29554741c9.png

SELECT prod_id, quantity, item_price, quantity*item_price AS expander_price FROM orderitems WHERE order_num = 20005;

5ed74fe7839148c6f658817f723e4f80.png

此句汇总了物品的价格(单价乘以订购数量) AS expander_price。

MySQL算数操作符:

+  加

-  减

*  乘

/  除

测试计算:SELECT 3*2; 将返回6,SELECT Trim('abc');  将返回abc,SELECT Now(); 将返回当前日期和时间。

840bcd4d16fc05edba7a88fb283659d0.png

以上内容是《MySQL必知必会》前十章的学习笔记,欢迎大家多多批评指正。

祝好

Violet HE

2019.2.27 11:05

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值