MySQL 必知必会 Notes #1/3 -1.10.2019

MySQL 必知必会 -MySQL Crash Course [英]Ben Forta 刘晓霞 钟鸣 人民邮电出版社

原书 ISBN: 0672327120   中文版 ISBN: 9787115191120

分类:计算机/数据库/MySQL

配套网站:http://forta.com/books/0672327120/


附录A MySQL的安装

附录B 样例表

订单录入系统

vendors 表: 销售产品的供应商

products 表: 产品目录

customers 表: 所有顾客的信息

orders 表: 顾客订单

orderitems 表: 每个订单中的实际物品

productnotes 表: 与特定产品有关的注释

提供的源代码文件:

create.sql 创建以上数据库表的MySQL语句

populate.sql 用来填充这些表的INSERT语句

应遵循的步骤:

1>.创建一个新数据库源 - MySQL Administrator

2>.保证选择新数据库源 - USE 命令或 MySQL Query Broswer

3>.执行脚本 create.sql - mysql 命令行或 MySQL Query Broswer

4>.执行脚本 populate.sql

附录C MySQL语句的语法

1.ALTER TABLE 更新已存在表的模式 <21>

若要新建新表 CREATE TABLE

2.COMMIT 将事务处理写到数据库 <26>

3.CREATE INDEX 在一个或多个列上创建索引 <21>

4.CREATE PROCEDURE 创建存储过程 <23>

5.CREATE TABLE 创建新数据库表 <21>

6.CREATE USER 向系统中添加新的用户账户 <28>

7.CREATE VIEW 创建一个或多个表上的新视图 <22>

8.DELETE 从表中删除一行或多行 <20>

9.DROP 永久删除数据库对象(表、视图、索引) <21-24>

10.INSERT 给表增加一行 <19>

11.INSERT SELECT 插入SELECT的结果到一个表 <19>

12.ROLLBACK 撤销一个事务处理块 <26>

13.SAVEPOINT 为使用ROLLBACK语句设立保留点 <26>

14.SELECT 从一个或多个表中检索数据 <4-6>

15.START TRANSACTION 表示一个新的事务处理块的开始 <26>

16.UPDATE 更新表中的一行或多行 <20>

附录D MySQL数据类型

1.串数据类型

   最常用的数据类型,有两种基本的串类型:定长串、变长串

   MySQL处理定长列远比处理变长列快,MySQL不允许对变长列 (或一个列的可变部分) 进行索引

CHAR                   1 ~ 255字符的定长串

ENUM                  接受最多64K个串组成的一个预定义集合的某个串

LONGTEXT         同TEXT,最大长度4GB

MEDIUMTEXT     同TEXT,最大长度16K

SET                     接受最多64个串组成的一个预定义集合的零个或多个串

TEXT                  最大长度为64KB的变长文本

TINYTEXT          同TEXT,最大长度为255字节

VARCHAR          长度可变,最多不超过255字节,在创建时可设定 VERCHAR(n),即为 0~n 个字符范围 (n<=255)

串值都必须括在引号内 (一般为单引号)

电话号码、邮编等不应存储在数值字段中,可能会使数据丢失

2.数值数据类型

   除 BIT 和 BOOLEAN 外,其他数据类型均可以有符号或无符号,默认为有符号,使用 UNSIGNED 可设为无符号

BIT                                位字段,1 ~ 64位

BIGINT                         整数值,支持-2^63 ~ 2^63-1,若为UNSIGNED,为0 ~ 2^64-1

BOOLEAN(BOOL)       布尔 0 / 1

DECIMAL(DEC)           精度可变的浮点值

DOUBLE                      双精度浮点值

FLOAT                         单精度浮点值

INT(INTEGER)            整数值,-2^31 ~ 2^31-1,若为UNSIGNED,为0 ~ 2^32

MEDIUMINT                整数值,-2^23 ~ 2^23-1,若为UNSIGNED,为0 ~ 2^24-1

REAL                           4字节的浮点值

SMALLINT                  整数值 -32768 ~ 32767 (-2^15 ~ 2^15-1),若为UNSIGNED,为0 ~ 2^16-1

TINYINT                      整数值,-128 ~ 127 (-2^7 ~ 2^7-1)

数值不应括在引号内

MySQL没有专门存储货币的数据类型,可用DECIMAL(8,2)

3.日期和时间数据类型

   存储日期和时间值

DATE                    YYYY-MM-DD  1000-01-01 ~ 9999-12-31

DATETIME           DATE和TIME的组合

TIMESTAMP        同DATETIME

TIME                    HH:MM:SS

YEAR                  二位数:70(1970) ~ 69(2069) 四位数:1901 ~ 2155

4.二进制数据类型

   可存储任何数据

BLOB                         64KB

MEDIUMBLOB          16MB

LONGBLOB              4GB

TINYBLOB                255B

附录E MySQL保留字


1.了解SQL

1.数据库 (database) 保持有组织的数据的容器 (通常是一个文件或一组文件)

数据库软件,正名为 DBMS (数据库管理软件)。数据库是通过 DBMS 创建和操纵的容器

2.表 (table) 某种特定类型数据的结构化清单

表名的唯一性

模式 (schema) 关于数据库和表的布局及特性的信息

3.列 (column) 表中的一个字段,所有表都是由一个或多个列组成的

数据库中每个列都有对应的数据类型,其定义列可以存储的数据种类

数据类型 (datatype) 所容许的数据的类型。每个表列都有相应的数据类型,它限制或容许该列中存储的数据

4.行 (row) 表中的一个记录  横行竖列

一般,行 (row) 也被称为数据库记录 (record)

5.主键/键 (primary key) 一列或一组列,其值能够唯一区分表中每个行,用来标识各行

唯一标识表中每行的这个列或这组列,称为主键,主键用来表示一个特定的行

表中任意列都可作为主键,只需:1>.任意两行都不具备相同的主键值 2>.每个行都必须具有一个主键值 (主键列不允许 NULL值)

主键一般定义在表的一列上,但不是必须,也可以为多列

相关的好习惯:1>.不更新主键列中的值 2>.不重用主键列的值 3>.不在主键列中使用可能会更改的值

6.SQL

SQL (读为 SQL 或 sequel) 是结构化查询语言 (Structured Query Language) 的缩写,是一种专门用来与数据库通信的语言

SQL 仅有很少的关键词,简单易学,但同时SQL功能强大

SQL 不是一种专利语言,任意两个 DBMS 上 SQL 都不尽相同。一般不能直接移植


2.MySQL简介

1.MySQL 是一种 DBMS,即数据库管理软件

   MySQL 开源免费、执行速度快、可信赖、简单易用

2.客户机-服务器软件

   DBMS可分为两类:1>.基于共享文件系统的 DBMS 2>.基于客户机-服务器的 DBMS

前者多用于桌面用途,不用于高端应用。Microsoft Access、FileMaker

后者可分为两部分,服务器部分是负责所有数据访问和处理的一个软件,其运行在称为数据库服务器的计算机上。MySQL、Oracle、Microsoft SQL Server

与数据文件接触的只有服务器软件,而客户机是与用户打交道的软件

3.MySQL版本

4.MySQL工具 —给MySQL提供要执行命令的应用

1>.mysql命令行实用程序 (即MySQL Command Line Client)

    命令用 ; 或 \g 结束,只按Enter不执行命令

    help 或 \h 获取帮助

    quit 或 exit 退出

2>.MySQL管理器 (MySQL Administrator)

3>.MySQL Query Browser


3.使用MySQL

1.连接

2.选择数据库 USE crashcourse (数据库名);

关键字 (key word) 作为 MySQL 语言组成部分的一个保留字,绝不要用关键字命名一个表或列

注意:要读取一个数据库内的数据,要先使用USE打开数据库

3.了解数据库和表

用SHOW命令可以显示数据库和表的各种信息

SHOW DATABASES; 返回可用数据库的一个列表

SHOW TABLES; 返回当前选择的数据库内可用表的列表

SHOW COLUMNS FROM cousomers (一个表); 对提供的表,使表中的每个字段返回一行,行中包含各种信息

DESCRIBE 是 SHOW COLUMNS FROM 的快捷方式

其他:

SHOW STATUS 显示广泛的服务器状态信息

SHOW CREATE DATABASE 和 SHOW CREATE TABLE 显示创建特定数据库或表的MySQL语句

SHOW GRANTS 显示授予用户的安全权限

SHOW ERRORS 和 SHOW WARNINGS 显示服务器错误或警告

INFORMATION_SCHEMA 获得和过滤模式信息


4.检索数据

1.SELECT 语句

2.检索单个列

SELECT prod_name FROM products;  从 products 表检索一名为 prod_name 的列,可得到该列所有行

注意:若没有明确排序查询结果,则返回数据的顺序没有任何意义

SQL语句不区分大小写,一般把关键字大写,而对所有表名、列名使用小写

3.检索多个列

SELECT prod_id, prod_name, prod_price FROM products;  从 products 表检索三个列

4.检索所有列 SELECT * FROM products;  从 products 表检索所有列 (其中 * 为通配符)

5.检索不同的行 SELECT DISTINCT vend_id FROM products;  从 products 表的 vend_id 列中检索不同的行

6.限制结果 SELECT prod_name FROM products LIMIT 5;  从 products 表检索一名为 prod_name 的列,返回前五行

SELECT prod_name FROM products LIMIT 5, 5;   从行 5 (事实的第六行) 开始,返回 5 行

7.使用完全限定的表名 — 即同时使用表名和列名

SELECT products.prod_name FROM products; 

SELECT products.prod_name FROM crashcourse.products; 


5.排序检索数据

1.排序数据

子句 (clause) SQL语句由子句构成,有些子句是必需的,而有些事可选的。

SELECT prod_name FROM products ORDER BY prod_name;  以 prod_name 列内数据的字母顺序返回

2.按多个列排序

SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name;

以 prod_price 列内数据的顺序返回,相同的再按照 prod_name 列内数据的顺序返回

3.指定排序方向  — 升降序

SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC, prod_name;  按照 prod_price 降序

ASC (ASCENDING) 升序,默认升序

SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1;  找最贵的物品的价格


6.过滤数据

1.使用 WHERE 子句

用来指定搜索条件 (过滤条件),WHERE 子句在 FROM 子句后给出

SELECT prod_name, prod_price FROM products WHERE prod_price = 2.50

检索两列,但仅返回 prod_price 列中值为 2.50 的行

注意:ORDER BY 子句还要放于 WHERE 子句后

2.WHERE 子句操作符

= 等于,<> 不等于,!= 不等于,< 小于,<= 小于等于,> 大于,>= 大于等于,BETWEEN 指定两个值之间

1>.检查单个值

SELECT prod_name, prod_price FROM products WHERE prod_name = 'fuses';

SELECT prod_name, prod_price FROM products WHERE prod_price < 10;

2>.不匹配检查

SELECT prod_name, prod_id FROM products WHERE prod_id <> 1003;

如检查的值为字符串时,要用单引号将值括起来

3>.范围值检查

SELECT prod_name, prod_price FROM products WHERE prod_price BETWEEN 5 AND 10;

4>.空值检查

NULL 即无值 (no value)

SELECT cust_id FROM customers WHERE cust_email IS NULL;


7.数据过滤

1.组合 WHERE 子句

操作符 (operator) 用来联结或改变 WHERE 子句的关键字,也称为逻辑操作符

1>.AND 操作符

SELECT prod_id, prod_price, prod_name FROM products WHERE vend_id = 1003 AND prod_price <= 10;

2>.OR 操作符

SELECT prod_price, prod_name FROM products WHERE vend_id = 1003 OR vend_id = 1002;

3>.计算次序

AND 操作符优先于 OR 操作符,用圆括号可以明确顺序,消除歧义

SELECT prod_price, prod_name FROM products WHERE vend_id = 1003 OR vend_id = 1002 AND prod_price >= 10;

SELECT prod_price, prod_name FROM products WHERE (vend_id = 1003 OR vend_id = 1002) AND prod_price >= 10;

2.IN 操作符

用来指定条件范围

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

功能同 OR ,但 IN 操作符一般比 OR 操作符快

3.NOT 操作符

否定它之后所跟的任何条件

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

MySQL 支持使用 NOT 对 IN、BETWEEN 和 EXISTS 子句取反


8.用通配符进行过滤

1.LIKE 操作符

通配符 (wildcard) 用来匹配值得一部分的特殊字符,其实其本身为 WHERE 子句中有特殊含义的字符

搜索模式 (search pattern) 由字面值、通配符或两者结合构成的搜索条件

1>.百分号 (%) 通配符

表示任何字符出现的任意次数

SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 'jet%';  检索任何以 jet 起头的词

这里可选是否区分大小写

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

SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 's%e'

% 能匹配 0 个字符,一个或多个字符

注意尾空格和 NULL,% 通配符不能匹配 NULL

2>.下划线 (_) 通配符

功能同 %,但仅可匹配一个字符

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

2.通配符使用技巧


9.用正则表达式进行搜索

1.正则表达式介绍

正则表达式是用来匹配文本的特殊的串 (字符集合)

2.使用MySQL正则表达式

1>.基本字符匹配

SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name;

REGEXP 后跟的东西即作为正则表达式处理

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

. 在正则表达式中,表示匹配任意一个字符

LIKE 匹配整个列,而 REGEXP 在列值内匹配,此外 REGEXP 加上 ^ 和 $ 定位符也可以匹配整个列值

注意:MySQL中的正则表达式默认不区分大小写,可使用 BINARY 关键字以区分大小写

WHERE prod_name REGEXP BINARY 'JetPack .000'

2>.进行 OR 匹配

搜索连个串之一,可使用 |

SELECT prod_name FROM products WHERE prod_name REGEXP '1000 | 2000' ORDER BY prod_name;

3>.匹配几个字符之一

通过一组用 [ 和 ] 括起来的字符完成

SELECT prod_name FROM products WHERE prod_name REGEXP '[123] Ton' ORDER BY prod_name;

[ ] 为另一种形式的 OR 语句

4>.匹配范围

可使用 - 来定义一个范围

SELECT prod_name FROM products WHERE prod_name REGEXP '[1-5] Ton' ORDER BY prod_name;

5>.匹配特殊字符

. 匹配任意字符,要匹配特殊字符,必须以 \\ 为前导,如\ \. 可匹配 .

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

空白元字符:

\\f  换页,\\n  换行,\\r  回车,\\t  制表,\\v  纵向制表

6>.匹配字符类

预定义的字符集,即为字符类 (character class)

[:alnum:]  任意字母和数字,[:alpha:]  任意字符,[:blank:]  空格和制表,[:cntrl:]  ASCII控制字符 (0-31 和 127),

[:digit:]  任意数字,[:graph:]  同[:print:],但不包括空格,[:lower:]  任意小写字母,[:print:]  任意可打印字符,

[:punct:]  既不在[:alnum:]又不在[:cntrl:]中的任意字符,[:space:]  包括空格在内的任意空白字符[\\f\\n\\r\\t\\v],

[:upper:]  任意大写字母,[:xdigit:]  任意十六进制数字

7>.匹配多个实例

重复元字符:

*  0 个或多个匹配,+  1个或多个匹配,?  0个或1个匹配,{n}  指定数目的匹配

{n, } 不少于指定数目的匹配,{n,m} 匹配数目的范围 (m 不少于 255)

SELECT prod_name FROM products WHERE prod_name REGEXP '\\([0-9] sticks?\\)' ORDER BY prod_name;

\\( 匹配 (,[0-9] 匹配任意数字,sticks? 匹配 stick 和 sticks,\\) 匹配 )

SELECT prod_name FROM products WHERE prod_name REGEXP '[[:digit:]]{4}' ORDER BY prod_name;

[:digit:] 匹配任意数字,{4} 要求它前面的字符出现4次,即4位数字

同 '[0-9][0-9][0-9][0-9]'

8>.定位符

用来匹配特定位置的文本

定位元字符:

^  文本的开始,$  文本的结尾,[[:<:]]  词的开始,[[:>:]]  词的结尾

SELECT prod_name FROM products WHERE prod_name REGEXP '^[0-9\\.]' ORDER BY prod_name;

匹配开头为数字和.的

注意 ^ 的两种用途

使 REGEXP 起类似 LIKE 的作用,^ 开始每个表达式,用 $ 结束整个表达式,即可起到与 LIKE 相同的作用

不使用数据库表也可以在 MySQL 中使用正则表达式测试,即在 SELECT 后表的位置放要检测的字符串

SELECT 'hello0' REGEXP '[0-9]';


10.创建计算字段

1.计算字段

直接从数据库中检索出转换、计算或格式化的数据,而非检索出数据,再进行格式化。即计算字段的作用

字段 (field) 基本与列的意义相同,一般数据库列称为列,字段通常用于计算字段的连接上

2.拼接字段

拼接 (concatenate) 将值联结到一起构成单个值

可使用 Concat() 函数来拼接两个列

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

即把括号内的各字符串直接拼接起来并显示,各字符串用逗号分隔

RTrim() 函数可删除右侧多余的空格,LTrim() 函数去除左侧多余的空格

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

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

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

即创建一包含指定计算得名为 vend_title 的计算字段

别名有时也叫导出列

3.执行算术计算

计算字段的另一用途是对检索出的数据进行算术计算

SELECT prod_id, quantity, item_price, quantity*item_price AS expanded_price

FROM orderitems WHERE order_num=20005;

此外,SELECT 可用来测试计算

SELECT 3*2:

SELECT Now();  返回当前时间和日期


猜你喜欢

转载自blog.csdn.net/Zenor_one/article/details/86220965