Mysql入门须知

837 阅读8分钟

Mysql入门须知

Msql 是一种RDBMS(关系型数据库),它有些专业属于:
让我们先了解下RDBMS的一些术语:
数据库: 数据库是一些关联表的集合。
数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
外键:外键用于关联两个表。
复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

引擎(engine)说明及区别
ISAM:读取数据速度很快,而且不占用大量的内存和存储资源;但是ISAM不支持事务处理、不支持外来键、不能够容错、也不支持索引。
如果硬盘崩溃,数据文件也无法恢复,因此若把ISAM用在关键任务上,就必须经常备份实时数据。

MyISAM适合:MyISAM强调了快速读取操作。(1)做很多count 的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。
静态MyISAM:如果数据库中的各个数据列的长度都是预先固定好的,服务器将自动选择这种表类型。(1)表中每一条记录所占用的空间都是一样的,所以存取和更新的效率非常高。(2)当数据受损时,回复工作也比较容易做。
动态MyISAM:如果数据表中出现varchar、xxxtex或xxxBLOB字段时,服务器将自动选择这种表类型。相对于静态MyISAM,这种表存储空间比较小。
压缩MyISAM:这种类型的表进一步减小了占用的存储,但是这种表压缩之后不能再被修改。

memory(heap)适合:HEAP允许只驻留在内存里的临时表格。因为数据仅存储在内存中,因此数据存取速度比ISAM和MYISAM都快。利用HASH进行索引(记住,用完表格之后就删除表格)

InnoDB适合:具有提交、回滚和崩溃恢复能力的失误安全存储引擎。
(1)可靠性要求比较高,或者要求事务;
(2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况。InnoDB是为处理巨大数据量时的最大性能设计。它的CPU效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的。
(3)唯一一个支持外键的引擎。

archive适合:日志记录和聚合分析方面。archive不支持索引,仅支持insert和select语句。

有关数据库操作语句:

数据库操作

1.创建数据库

 create DATABASE TEST;

如果数据库不存在 才创建 并且设置编码格式

CREATE DATABASE IF NOT EXISTS TEST DEFAULT CHARSET utf8 COLLATEutf8_genral_ci; 

2.删除数据库

drop DATABASE  TEST;

3.选择数据库

use TEST;

表操作

1.创建表(先选择数据库)

use TEST;
create TABLE tb1(属性名a 属性type1 DEFAULT 5, #设置默认值为5
                             属性名b 属性type2(长度) NOT NULL  AUTO_INCREMENT ,    #属性不为空 且自增
                              PRIMARY KEY (属性名b),
UNIQUE (a,b) #确保a、b的唯一性

 );
create IF NOT EXISTS tb2(
              *******
)ENGINE=InnoDB DEFAULT CHARSET=utf8; #设置引擎 和编码模式

2.删除表

use TEST;
drop TABLE tb1;
删除表内数据,用 delete。格式为:
delete from 表名 where 删除条件;
实例:删除学生表内姓名为张三的记录。
delete from student where T_name = "张三";
清除表内数据,保存表结构,用 truncate。格式为:
truncate table 表名;
实例:清除学生表内的所有数据。
truncate table student;
删除表用 drop,就是啥都没了。格式为:
drop table 表名;
实例:删除学生表。
drop table student;

总结:

  • 1.当你不再需要该表时, 用 drop;
  • 2.当你仍要保留该表,但要删除所有记录时, 用 truncate;
  • 3.当你要删除部分记录时, 用 delete。

数据操作
1.读取数据

select * from tb1;
select count(*) from tb1; #获取数据库条数  count(1)效果相同,效率更高

2.where 条件查询

select * where name='luo';
select * where BINARY name ='luo';  //数据库默认是不区分大小写的  用 BINARY来强调大小写

3.插入数据

INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );

4.更新数据

UPDATA tb1 SET name='li' where id=3;
UPDATA tb1 SET name=default where id=2; #将名字赋予默认值

5.删除数据

DELETE FROM tb1 where id=1;

6.like 结合正则表达式进行查询

SELECT * from tbl WHERE name LIKE '%o'; 查找所有名字由 o 结尾的记录
  • ‘%a’ //以a结尾的数据
  • ‘a%’ //以a开头的数据
  • ‘%a%’ //含有a的数据
  • a’ //三位且中间字母是a的
  • ‘_a’ //两位且结尾字母是a的
  • ‘a_’ //两位且开头字母是a的

7.UNION 联合 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据

SELECT country FROM Websites  #自动排除重复的值
UNION
SELECT country FROM apps;

SELECT country FROM Websites  #包含重复的值
UNION ALL
SELECT country FROM apps;

8.排序 ORDER BY

SELECT * FROM tb ORDER BY  id   ASC;   #ASC 升序   DESC降序

9.分组 GROUP BY 可以统计记录的频率等 使用 COUNT, SUM, AVG,等函数。

SELECT name, COUNT(*) FROM tbl GROUP BY name;

10.多表联合查询 JOIN ON ON起到了WHERE的作用

SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
  等价于
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a, tcount_tbl b WHERE a.runoob_author = b.runoob_author;

JOIN 按照功能大致分为如下三类:
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
这里写图片描述
LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。

这里写图片描述
RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
这里写图片描述

Mysql NULL处理
为了处理这种情况,MySQL提供了三大运算符:
IS NULL: 当列的值是 NULL,此运算符返回 true。
IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
<=>: 比较操作符(不同于=运算符),当比较的的两个值为 NULL 时返回 true。

Mysql 数据库索引
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。但索引也不易过多,一个表通常为3个。

  • 1.避免了进行数据库全表扫描
  • 2.聚索引可以避免数据插入操作,集中于表的最后一个数据页面
  • 3.可以避免排序操作

数据库索引的数据结构基础:n叉树

  1. a.节点包含n个关键字,不用保存数据,而是数据的索引;
  2. b.所有叶结点包含全部关键字信息;
  3. c.插入与修改是自低向上的,从而保持数据稳定有序。

创建索引

  • 1.CREATE UNIQUE INDEX indexName ON tb1(name(length)); #在name上建立索引
  • 2.ALTER table tb1 ADD UNIQUE [indexName] (name(length));
  • 3.CREATE TABLE tb1( name VARCHAR(16) NOT NULL, UNIQUE [indexName] (name(length)) );

索引的类别

  • PRIMARY KEY: 主键,这意味着索引值必须是唯一的,且不能为NULL。
  • UNIQUE:创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
  • INDEX: 普通索引,索引值可出现多次。
  • FULLTEXT: 用于全文索引.

使用索引的注意事项:

  • 1.表的主键和外键必须有索引
  • 2.经常出现where字句的字段
  • 3.经常要查询的列
  • 4.选择性高的字段
  • 5.经常用户排序的字段
  • 6.数据超过300以上
  • 7.表的索引最好不要超过5个

数据库连接池
建立数据库连接是相当耗时和耗费资源的,而且一个数据库服务器能够同时建立的连接数也是有限的,在大型的Web应用中,可能同时会有成百上千个访问数据库的请求,如果Web应用程序为每一个客户请求分配一个数据库连接,将导致性能的急剧下降。
为了能够重复利用数据库连接,提高对请求的响应时间和服务器的性能,可以采用连接池技术。
连接池技术预先建立多个数据库连接对象,然后将连接对象保存到连接池中,当客户请求到来时,从池中取出一个连接对象为客户服务,当请求完成后,客户程序调用close()方法,将连接对象放回池中。

数据库 一级缓存、二级缓存
一级缓存:在维持一个会话时,查询获取的数据会存放在一级缓存中,下次使用从缓存中获取。
二级缓存:当会话关闭时,一级缓存的数据会保存在二级缓存中。

数据库事务
事务的特点
原子性:多条指令作为一个集体,要么都执行,要么都不执行
一致性:比如 a=100 b=100 a、b之间交易 总和一定是200
隔离性:一个事务不受其他事务的影响
持久性:事务一旦提交,它对数据库的改变时永久性的

mysql事务隔离级别 默认是 :可重复读

这里写图片描述