您的位置:首页 > 数据库 > MySQL

《MySQL 5.6从零开始学》读书笔记

2016-05-11 11:27 465 查看

第1章 初始MySQL

MySQL的主要优势:

体积小
速度快
成本低:含社区版和企业版
可移植性:可以在多个平台上运行
丰富的接口:提供了用于C,Java,PHP,Python等语言的API
支持查询语言
安全性和连接性:十分灵活和安全的权限和密码系统,允许基于主机的验证。

第2章 MySQL的安装与配置

登录:mysql -h hostname -u username -p

第3章 数据库的基本操作

创建数据库:create database database_name;
删除数据库:drop database database_name;
使用数据库:use database_name;
查看系统所支持的存储引擎类型:show engines;

第4章 数据表的基本操作

数据表中每一行代表一条唯一记录,每一列代表一个域。

创建表
create table table_name(
字段名1 数据类型[列级别约束条件],
字段名1 数据类型[列级别约束条件],

......
[表级别约束条件]
);
主键:能够唯一标示表中数据;可以结合外键定义不同数据表之间的关系,并且可以加快数据库查询速度。
外键:保证数据的完整性、一致性。

CREATE TABLE offices
(
officeCode  INT(10) NOT NULL UNIQUE,
city        VARCHAR(50) NOT NULL,
address     VARCHAR(50) NOT NULL,
country     VARCHAR(50) NOT NULL,
postalCode  VARCHAR(15) NOT NULL,
PRIMARY KEY  (officeCode)
);


CREATE TABLE employees
(
employeeNumber  INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
lastName         VARCHAR(50) NOT NULL,
firstName        VARCHAR(50) NOT NULL,
mobile           VARCHAR(25) NOT NULL,
officeCode       INT(10) NOT NULL,
jobTitle         VARCHAR(50) NOT NULL,
birth            DATETIME,
note            VARCHAR(255),
sex             VARCHAR(5) DEFAULT '男',
CONSTRAINT office_fk FOREIGN KEY(officeCode)  REFERENCES offices(officeCode)
);
修改表名:alter table officesrenameoffices_new;
修改字段的数据类型:alter table officesmodifyname varchar(30);
修改字段名:alter table officeschangecity city_new varchar(30);
添加字段:alter table officesaddmanager int(10);

删除字段:alter table offices
drop manager;
删除表的外键约束:alter table officesdrop foreign key office_fk;
删除表:(若表被其他表关联,先删除外键约束,再删除表)drop table offices;
删除表中数据:delete from offices;

第5章 数据类型和运算符

1 整数和浮点数
如果不需要小数部分,则使用整数保存数据;反正,使用浮点数类型;
浮点类型包括float和double,如果需要精度较高时,应选择double类型。
2 浮点数和定点数
在一定长度下浮点数能表示更大的数据范围
定点数精度高
3 char与varchar
char固定长度,存储速度快,浪费空间
4 blob和text
blob是二进制字符串,text是非二进制字符串,两者均可存放大容量的信息。
blob主要存放图片、音频等信息;
text只能存储纯文本文件。



第6章 MySQL函数

略。

第7章 查询数据

select [字段1,字段2...]
from 表名
[where 条件表达式]
[group by 字段 ][having <条件表达式>]
[order by 字段 asc|desc]
[limit [<位置偏移量>,]<行数>]
(注:order by默认为asc升序排列;
having<条件表达式>指定满足表达式限定条件的结果将被显示;)

7.4连接查询

内连接(inner join)查询:使用比较运算符进行表间某(些)列数据的比较操作,并将满足条件的记录输出;
外连接:包括左连接(left outer join)和右连接(right outer join),查询结果不仅包括符合连接条件的行,还包括左边、右表或两个连接表中的所有数据;
复合条件连接:在连接查询的过程中,添加过滤条件,使查询结果更加准确。

区别:

内连接仅返回符合查询条件和连接条件的行;
左连接(left outer join):返回left outer子句中指定左表的所有行,而不仅仅是连接匹配的行;
右连接(right outer join):返回右表所有行。如果右表的某行在左表中没有匹配行,左表将返回空值。

7.5 子查询

子查询指一个查询语句嵌套在另一个查询语句内部的查询。
先计算子查询,子查询结果作为外层另一个查询的过滤条件。

带any/some子查询:满足内层子查询的任何一个条件;
带all的子查询:满足所有内层查询的条件;
带exists的子查询:子查询返回结果至少一行,exists的结果为true,外层语句进行查询;否则,外层语句将不进行查询;
带in关键字的查询:内层子查询返回一个数据列作为外部查询的比较条件;
带比较运算符的子查询:<,>,<=,>=,<>,!=

7.6 合并查询结果

利用union关键字,可以给出多个select语句,并将它们的结果合成单个结果集。
合并时,两个表对应的列数和数据类型必须相同。
select column,... from table1
union [all]
select column,... from table2
注:union执行时删除重复记录,union all不删除重复行也不对记过进行自动排序。

7.7 取别名

为表去别名:表名 [as] 表别名
为字段去别名:列名 [as] 列别名

7.8 使用正则表达式查询regexp

^:匹配以特定字符或字符串开头的记录,如'^b'匹配baa
$:匹配以特定字符或字符串结尾的文本,如'$b'匹配aab
.:匹配任意一个字符,如:‘...b’匹配aaab
*:匹配零个或多个它前面的字符
+:匹配前面字符一次或多次
字符串:匹配指定字符串,如'ac'匹配acb,bac
[字符集合]:只匹配其中任何一个字符,即为所查找的文本
[^字符集合]:匹配不在字符集合中的任意字符

{n,}:匹配前面字符
{n,m}:匹配前面字符串不少于n次,不多于m次

注:

select * from table_name where
regexp 'ab'与select * from table_name where
like 'ab'不同,前者可匹配‘abc',后者不可以

当通配符正确,却没查找出符合条件的记录,可能是因为数据库中字符串两端有空格。解决方法是使用trim函数,将字符串两端的空格删除后再进行匹配。

第8章 插入、更新与删除数据

8.1 插入数据

insert into 表名(字段列表) values(value_list);
<pre name="code" class="sql">insert into 表名(字段列表)
values (value_list1),(value_list2),...;


);

insert还可将select结果插入到表中,但select结果必须和字段列表的个数和数据类型相同。

8.2更新数据

update 表名
set column_name1 = value1,
column_name2 = value2,
...
column_namen = valuen
where 条件
如果忽略where子句,MySQL将更新表中所有行。

8.3删除数据

delete from table_name
[where <condition>]
如果忽略where子句,将删除表中所有数据。

第9章 索引

索引能快速找出某个列中有一特定值的行。
索引是在存储引擎中实现的。
MySQL中索引的存储类型有两种:bTree和hash

MyISAM和InnoDB存储引擎只支持BTree索引;
MEMORY/Hea引擎可以支持hash 和btree索引。

索引的设计原则:

索引并非越多越好,因为当表中数据更新时,索引也会进行索引和更新;
避免对经常更新的表进行过多的索引;
数据量小的表不建议使用索引;
在不同值较多的列上建立索引,不同值较少的列上不要建立索引;
当唯一性是某种数据本身的特性时,指定唯一性索引;
在频繁进行排序或分组的列上建立索引,如有多列,可建立组合索引。

创建表时创建索引

create table table_name [col_name data_type]
[unique|fulltext|spatial][index|key] [index_name](col_name[length]) [asc|desc];


unique:唯一索引
fulltext:全文索引
spatial:空间索引

在已经存在的表上创建索引
alter table table_name add <pre name="code" class="sql">[unique|fulltext|spatial][index|key] [index_name](col_name[length]) [asc|desc];


删除索引
alter table table_name drop index index_name;
或者使用drop index
drop index index_name on table_name;


第10章 存储过程和函数

存储过程就是一条或多条sql语句的集合。

10.1创建存储过程和函数

创建存储过程:
create procedure sp_name([proc_parameter])
[characteristics...] routine_body

proc_parameter为指定存储过程的参数列表,列表形式如下:
[in | out | inout] param_name type
in 表示输入参数;out表示输出参数; inout表示既可以输入也可以输出。
characteristics指定存储过程的特性。
toutine_body是SQL代码的内容,用bdgin...end表示SQL代码的开始和结束。

在定义存储过程语句前面添加
delimiter //
将MySQL的结束符设置为'//',并以
end //
结束存储过程。
存储过程定义完毕之后再使用
delimiter ;
恢复默认结束符‘;’。

创建存储函数:

create function func_name([func_parameter])
return type
[characteristic...] routine_body
定义变量:
变量可以在begin...end中使用
declare var_name date_type [default value];
为变量赋值用set
set var_name = value[,var_name1 = value1...];
光标

查询语句可能返回多条语句,在存储过程或存储函数中,可以使用光标逐条读取查询结果中的记录。

declare 光标名称 cursor for 查询语句;
打开光标
open 光标名称;

使用光标
fetch 光标名称 into 参数名称[,参数名称...];
关闭光标
close 光标名称;
流程控制

if:
case:
loop:重复执行某条语句
leave:退出被光标标志的流程控制
iterate:将执行顺序转到语句段开头处
repeat:条件为真退出,否则继续执行
repeat
语句
until 条件
end repeat;


while
while 条件 do
语句
end while;


注解:

sql语句后面加"\G":将查询结果按列打印,可以将每个字段打印到单独的行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: