《MySQL必知必会》读书笔记
⼀、了解MySQL
1、什么是数据库?
数据库是⼀种以某种有组织的⽅式存储的数据集合。
2、模式(schema):关于数据库和表的布局及特性的信息。
3、列:正确的将数据分解为多个列极为重要。通过把它分解开,才有可能利⽤特定的列对数据进⾏排序和过滤。
4、主键(primary key):⼀列,其值能够唯⼀区分表中每个⾏,⽤来表⽰⼀个特定的⾏。应该保证创建的每个表具有⼀个主键,以便于以后的数据操纵和管理。
5、外键:
6、SQL语句不区分⼤⼩写,但是开发⼈员通常对所有SQL关键字⼤写,⽽对所有列和表名使⽤⼩写,这样做使代码更易于阅读和调试。
⼆、使⽤MySQL
1、连接    mysql -h localhost -u root -p xxxx
2、show命令:
show databases;
use databases;
show tables;
show columns from tablename; ==== describe tablename;
show status; ⽤于显⽰⼴泛的服务器状态信息
show create database databasename;
show create table tablename;    分别⽤来显⽰创建特定数据库或表的MySQL语句。
show grants; ⽤来显⽰授予⽤户(所有⽤户或特定⽤户)的安全权限
show errors;  show warnings; ⽤来显⽰服务器错误或警告消息
help show;显⽰允许的show语句
MySQL 5⽀持⼀个新的Information_schema命令,可⽤它来获得和过滤模式信息。
三、检索数据
1、select语句:为了检索数据,必须⾄少给出两条信息--想选择什么,从什么地⽅选。
select column from tablename;  检索单个列,如果未排序,返回的顺序可能是数据的添加顺序也可能不是。
select column1,column2 from tablename; 检索多个列
select * from tablename; 检索所有列,除⾮你确实需要表中的每个列,否则最好别⽤*通配符。虽然使⽤通配符可能会使你⾃⼰省事,但检索不需要的列通常会降低检索和应⽤程序的性能
select distinct column from tablename; 只返回不同值,即剔除重复的数据。distinct应⽤于所有列,不仅是前置它的列
select column form tablename limit 5;限制语句,不多于5⾏。
select column form tablename limit 5,5;限制语句,从第6⾏开始的5⾏,第⼀⾏的⾏号为0,有⼀些情形需要完全限定名,lumnname
2、order by⼦句排序检索数据:
关系数据库设计理论认为,如果不明确规定排序顺序,则不应该嘉定检索出的数据的顺序有意义。
select column from tablename order by column;⽤选择的列或⾮选择的列排序都是合法的。默认升序排列,desc关键字降序,如果多个列排序,desc只应⽤到直接位于其前⾯的列名。
select column from tablename order by column1,column2;按多个列排序,先按第⼀个排序,如果重复则继续按第⼆个排序。所以,列的顺序选择很重要。
在字典排序中,A被视为与a相同。这是MySQL的默认⾏为,如果有必要,可以⽤collation校对字符集改变这种⾏为。
select * from XXX order by limit 1;可以到最⼤值。使⽤⼦句的次序不对会产⽣错误消息。
3、where⼦句过滤检索数据:
只检索所需要的数据,通常需要指定搜索条件(search crierria),即过滤条件
select column from table where name ='zhangsan' order by ..;过滤条件默认不区分⼤⼩写。
where⼦句包含多种条件操作符:
=,  <>,  !=,  <,  <=,  >,  >=,  between 5 and 10,(包括开始和结束)
select column from table where column is null;空值检查
4、组合where⼦句建⽴功能更强,更⾼级的搜索条件:
AND操作符:
select A from table where B=2 and C<>5;  条件交集
OR操作符:
select A from table where B=2 or C<>5;  条件并集
where可以包含任意数⽬的AND和OR操作,允许两者结合以进⾏复杂和⾼级的过滤。但是AND的优先级⽐OR 的优先级⾼,所以需要使⽤圆括号来保证计算次序。不要依赖默认的计算次序。
IN操作符:
select A from table where B in (2,4,6) order by ..;
IN操作符⽤来指定清单时与OR功能相同,但IN还有很多优点:
IN操作符的语法更清楚且更直观;IN操作符计算次序更容易管理;
IN操作符⼀般⽐OR清单执⾏更快;
IN操作符最⼤的优点是可以包含其他select语句,使得能够更对台地建⽴where⼦句。
NOT操作符: not操作符有且只有⼀个功能,就是否定他之后所跟的任何条件。
Select A from table where B not in (2,4);
MySQL ⽀持使⽤ NOT 对 IN 、Between 和 exists ⼦句取反
5、使⽤通配符(wildcard)过滤:
搜索模式(search pattern): 由字⾯值、通配符或两者组合构成的搜索条件。
LIKE操作符(谓词):前⾯介绍的所有操作都是针对已知值进⾏过滤的。但是这种过滤⽅式并不是任何时候都好⽤。利⽤通配符可以创建⽐较特定的数据搜索模式。
百分号(%)通配符:  %表⽰任何字符出现任意次数
select * from table where name like 'zhang%';
select * from table where name like '%ang%';
通过 % 可以组合多种搜索模式;但是 % 不能匹配 NULL值
下划线(_)统配符:  _ 只匹配单个字符,不能多也不能少
select * from table where name like '_hang';
使⽤通配符的技巧:
MySQL通配符很有⽤,但是这种功能是花费代价的,通配符搜索的处理⼀般要⽐前⾯讨论的其他搜索花费时间更长。所以需要⼀些技巧
不要过度使⽤通配符。如果其他操作符能达到相同的⽬的,应该使⽤其他操作符。
在确实需要使⽤通配符是,除⾮绝对有必要,否则不要把他们⽤在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。
仔细注意通配符的位置,如果放错地⽅,可能不会反悔想要的数据。
6、⽤正则表达式进⾏搜索:⽤于匹配特定模式的⽂本,如电话号码,邮箱等。
REGEXP操作符: regexp 替换⽴刻的作⽤
关于正则表达式的内容请参考正则表达式语法。
7、创建计算字段:
计算字段是运⾏时在select语句内创建的。
使⽤Concat()函数实现拼接。
select Contact(A, '(',B,')') from table ;
使⽤别名,别名有时也称为导出列
select Contact(A, '(',B,')') as A(B) from table ;
执⾏算术计算
select A, B*C as BC from table;
8、使⽤数据处理函数:
⽂本处理函数:
Left()、Right()返回串左(右)边的字符
Length() 返回串的长度
Locate()出串的⼀个⼦串
Lower()、Upper()转换⼤⼩写
LTrim()、RTrim()去掉左(右)边的空格
Soundex() 返回串的SOUNDEX值,将任何⽂本串转换为描述其语⾳表⽰的字母数字模式的算法。即匹配所有发⾳类似的值。
SubString()返回⼦串的字符
⽇期和时间处理函数:
AddDate()  增加⼀个⽇期(天、周等)
AddTime()  增加⼀个时间(时、分等)
Now()、CurDate()、CurTime() 返回当前的⽇期和时间、⽇期部分、时间部分
Date()、Time()、Year()、Month()、Day()、Hour()、Minute()、Second()、返回⽇期时间的⽇期部分、时间部分、年、⽉、⽇、⼩时、分钟、秒
DateDiff() 计算两个⽇期之差
Date_ADD() ⾼度灵活的⽇期运算函数
Date_Format() 返回⼀个格式化的⽇期或时间串
DayOfWeek() 对于⼀个⽇期,返回对应的星期⼏
数值处理函数:
mysql视图和存储过程Abs(),  Cos(),  Exp(),  Mod(),  Pi(),  Rand(),  Sin(),  Sqrt(),  Tan()
9、汇总数据:
聚集函数:运⾏在⾏组上,计算和返回单个值的函数
AVG(), COUNT(),  MAX(),  MIN(),  SUM()
10、分组数据:
where  group by  having  order by;
select from where group by having order by limit;
group by 通常与汇总函数连⽤。
11、使⽤⼦查询:
select * from table where A in (select * from table where xxxx);
对于嵌套的⼦查询的数⽬没有限制,不过在实际使⽤时由于性能的限制,不能嵌套太多的⼦查询。注意:列必须匹配。
12、联结表:
外键(foreign key):外键为某个表中的⼀列,它包含另⼀个表的主键值,定义了两个表之间的关系。
联结查询:规定要联结的所有表以及他们如何关联。
select A from table1,table2 where table1.id = table2.id;
笛卡尔积:
内联结:inner join
外联结:左外 left outer join;查询左表中所有记录的右表活动,如所有⼈的消费记录,没有就显⽰空右外 right outer jion;查询右表所有记录的关于左表的情况。
13、组合查询:
UNION关键字:
14、全⽂本搜索:
MySQL中两个最常使⽤的引擎:
MyISAM:⽀持全⽂本搜索
InnoDB:不⽀持全⽂本搜索
⼀般在创建表时启⽤全⽂本搜索: fulltext(column);
在索引之后,使⽤两个函数Match()和Against()执⾏全⽂本搜索,Match()指定被搜索的列,Against指定要使⽤的搜索表达式。
select column from table where Match(column) Against('模式');
四、插⼊数据
1、插⼊完整的⾏:
insert into tablename values(对应列的次序的值);
这种语法很简单,但并不安全,应该尽量避免使⽤。编写依赖于特定列次序的SQL语句,如果列发⽣了变化,有时难免会出问题。
insert into tablename(列的名列表) values(对应的值列表);
虽然⿇烦,但即使标的结构改变,该语句仍能正确⼯作,
2、插⼊多个⾏:
insert inte tablename(列的名列表) values(对应的值列表),(对应的值列表);
3、插⼊检索出的数据:
insert into tableA(列列表) select 列列表 from tableB;
五、更新和删除数据
1、update: ⼀定要注意确定要更新的条件,⼀不⼩⼼就更新了所有⾏。
更新表中特定⾏:
update table set column='value' where id = 1;
如果删除某个列的值,可以set null;
更新表中所有⾏:
2、delete:⼀定要仔细,因为稍不注意,就会错误的删除表中的所有⾏
删除表中特定的⾏:
delete from tablename where id = 1;
删除表中所有的⾏:
delete from tablename;
truncate tablename; 这种完成相同的⼯作,但是效率更⾼,它是删除原来的表在重新创建⼀个,⽽不是⼀⾏⼀⾏的删除
六、创建表和操纵表
1、创建表:
create table user if not exists
(
id int not null auto_increment,
name varchar(10),
gender char(1) not null default '男',
primary key(id),
foreign key(id) references tableA(id)
)engine=InnoDB;
默认使⽤ MyISAM引擎,⽀持全⽂本搜索
InnoDB引擎,⽀持事务处理。
引擎类型可以混⽤,但是外键不能跨引擎
存储引擎:
MySQL可以将数据以不同的技术存储在⽂件(内存)中,这种技术就成为存储引擎。
每⼀种存储引擎使⽤不同的存储机制、索引技巧、锁定⽔平,最终提供⼴泛且不同的功能。
2、更新表:
alter table,在理想状态下,当表中存储数据后,该表就不应该在被更新。在表的设计过程中需要花费⼤量时间来考虑,以便后期不对该表进⾏⼤的改动。
alter table add column ; 增加列
alter table drop column; 删除列
alter table modify
alter table 的⼀种常见⽤途是定义外键:
alter table tableA add constraint 外键名 foreign key (列名) references tableB (列名);
alter table 要极为⼩⼼,应该在进⾏改动前做⼀个完整的备份(模式和数据的备份),数据库表的更改不能撤销,如果增加了不需要的列,肯呢过不能删除他们,类似的,如果删除了不应该删除的列,可能会丢失该列中的所有数据。
3、删除表:
drop table tableA; 该语句没有确认,也不能撤销,执⾏将永久删除该表。
4、重命名表:
rename table tableA to tableB;
七、视图