一、mysql简介1、数据库管理软件分类主要分为关系型和非关系型。
可以简单的理解为,关系型数据库需要有表结构,非关系型数据库是key-value存储的,没有表结构。
关系型:如sqllite,db2,oracle,access,sql server,mysql,注意:sql语句通用。
非关系型:mongodb,redis,memcache
2、mysqlmysql是一个关系型数据库管理系统 ,由瑞典mysql ab 公司开发,目前属于 oracle 旗下产品。
mysql是最流行的关系型数据库管理系统之一,在 web 应用方面,mysql是最好的rdbms (关系数据库管理系统)应用软件。
sql语言是最常用的标准化语言,被用于访问mysql数据库。mysql 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 mysql 作为网站数据库。
mysql为我们提供开源的安装在各个操作系统上的安装包,包括mac,linux,windows。
二、存储引擎(也称作表类型)mysql中的数据用各种不同的技术存储在文件(或者内存)中。不同的技术使用各自独特的存储机制、索引技巧和锁定水平,因此提供了各种不同的功能和能力。mysql将这些不同的技术和相关的功能统称为存储引擎,也可以称之为表类型。
mysql默认配置了许多不同的存储引擎,可以预先设置或者在mysql服务器中启用。
1、常用存储引擎及适用场景innodb:用于事务处理应用程序,支持外键和行级锁。如果应用对事物的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包括很多更新和删除操作,那么innodb存储引擎是比较合适的。
innodb除了有效的降低由删除和更新导致的锁定,还可以确保事务的完整提交和回滚,对于类似计费系统或者财务系统等对数据准确要求性比较高的系统都是合适的选择。
myisam:如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不高,那么可以选择这个存储引擎。
memory:将所有的数据保存在内存中,在需要快速定位记录和其他类似数据的环境下,可以提供极快的访问。
memory的缺陷是对表的大小有限制,虽然数据库因为异常终止的话数据可以正常恢复,但是一旦数据库关闭,存储在内存中的数据都会丢失。
mysql支持的存储引擎包括innodb、myisam、memory、csv、blackhole、 ndb、federated、mrg_myisam、archive、performance_schema。
其中ndb和innodb提供事务安全表,其他存储引擎都是非事务安全表。
2、存储引擎在mysql中的使用# 查看当前的默认存储引擎:mysql> show variables like "default_storage_engine";# 查询当前数据库支持的存储引擎mysql> show engines \g;
1、 在建表时指定存储引擎mysql> create table ai(id bigint(12),name varchar(200)) engine=myisam; mysql> create table country(id int(4),cname varchar(50)) engine=innodb;# 也可以使用alter table语句,修改一个已经存在的表的存储引擎。mysql> alter table ai engine = innodb;
2 、在配置文件中指定存储引擎# my.ini文件[mysqld]default-storage-engine=innodb
三、mysql表操作1、查看表结构查看表结构有两种方式:
desc[tablename]和describe [tablename]:这两种方法和效果相同,可以查看当前的表结构。
show create table [tablename]:除了可以看到表定义之外,还可以看到engine(存储引擎)和charset(字符集)等信息。使用\g选项可以将记录垂直排列,使得较长的记录更易于展示。)
举例:
mysql> desc staff_info;+-------+-----------------------+------+-----+---------+-------+| field | type | null | key | default | extra |+-------+-----------------------+------+-----+---------+-------+| id | int(11) | yes | | null | || name | varchar(50) | yes | | null | || age | int(3) | yes | | null | || sex | enum('male','female') | yes | | null | || phone | bigint(11) | yes | | null | || job | varchar(11) | yes | | null | |+-------+-----------------------+------+-----+---------+-------+rows in set (0.00 sec)mysql> show create table staff_info\g;*************************** 1. row *************************** table: staff_infocreate table: create table `staff_info` ( `id` int(11) default null, `name` varchar(50) default null, `age` int(3) default null, `sex` enum('male','female') default null, `phone` bigint(11) default null, `job` varchar(11) default null) engine=innodb default charset=utf8row in set (0.01 sec)error: no query specified
2、自动增长列约束字段为自动增长,被约束的字段必须同时被key主键约束
--不指定id,则自动增长create table student(id int primary key auto_increment,name varchar(20),sex enum('male','female') default 'male');mysql> desc student;+-------+-----------------------+------+-----+---------+----------------+| field | type | null | key | default | extra |+-------+-----------------------+------+-----+---------+----------------+| id | int(11) | no | pri | null | auto_increment || name | varchar(20) | yes | | null | || sex | enum('male','female') | yes | | male | |+-------+-----------------------+------+-----+---------+----------------+mysql> insert into student(name) values ('nick'),('tank') ;mysql> select * from student;+----+------+------+| id | name | sex |+----+------+------+| 1 | nick | male || 2 | tank | male |+----+------+------+--也可以指定idmysql> insert into student values(4,'asb','female');query ok, 1 row affected (0.00 sec)mysql> insert into student values(7,'wsb','female');query ok, 1 row affected (0.00 sec)mysql> select * from student;+----+------+--------+| id | name | sex |+----+------+--------+| 1 | nick | male || 2 | tank | male || 4 | asb | female || 7 | wsb | female |+----+------+--------+--对于自增的字段,在用delete删除后,再插入值,该字段仍按照删除前的位置继续增长mysql> delete from student;query ok, 4 rows affected (0.00 sec)mysql> select * from student;empty set (0.00 sec)mysql> insert into student(name) values('ysb');mysql> select * from student;+----+------+------+| id | name | sex |+----+------+------+| 8 | ysb | male |+----+------+------+--应该用truncate清空表,比起delete一条一条地删除记录,truncate是直接清空表,在删除大表时用它mysql> truncate student;query ok, 0 rows affected (0.01 sec)mysql> insert into student(name) values('nick');query ok, 1 row affected (0.01 sec)mysql> select * from student;+----+------+------+| id | name | sex |+----+------+------+| 1 | nick | male |+----+------+------+row in set (0.00 sec)--在创建完表后,修改自增字段的起始值mysql> create table student(id int primary key auto_increment, name varchar(20),sex enum('male','female') default 'male');mysql> alter table student auto_increment=3 ;mysql> show create table student;.......engine=innodb auto_increment=3 default charset=utf8--也可以创建表时指定auto_increment的初始值,注意初始值的设置为表选项,应该放到括号外mysql> create table student(id int primary key auto_increment, name varchar(20),sex enum('male','female') default 'male' )auto_increment=3 ;
四 、mysql支持的数据类型1、enum和set类型enum中文名称叫枚举类型,它的值范围需要在创建表时通过枚举方式显示。
enum只允许从值集合中选取单个值,而不能一次取多个值。用途:单选:选择性别
enum:
对1-255个成员的枚举需要1个字节存储;
对于255-65535个成员,需要2个字节存储;
最多允许65535个成员。
set和enum非常相似,也是一个字符串对象,里面可以包含0-64个成员。根据成员的不同,存储上也有所不同。
set类型可以允许值集合中任意选择1或多个元素进行组合。对超出范围的内容将不允许注入,而对重复的值将进行自动去重。用途:多选:兴趣爱好性别
set:
1-8个成员的集合,占1个字节
9-16个成员的集合,占2个字节
17-24个成员的集合,占3个字节
25-32个成员的集合,占4个字节
33-64个成员的集合,占8个字节
2、set/enum示例mysql> create table t10 (name char(20),gender enum('female','male') );query ok, 0 rows affected (0.01 sec)-- 选择enum('female','male')中的一项作为gender的值,可以正常插入mysql> insert into t10 values ('nick','male');query ok, 1 row affected (0.00 sec)-- 不能同时插入'male,female'两个值,也不能插入不属于'male,female'的值mysql> insert into t10 values ('nick','male,female');error 1265 (01000): data truncated for column 'gender' at row 1mysql> create table t11 (name char(20),hobby set('抽烟','喝酒','烫头','翻车') );query ok, 0 rows affected (0.01 sec)-- 可以任意选择set('抽烟','喝酒','烫头','翻车')中的项,并自带去重功能mysql> insert into t11 values ('tank','烫头,喝酒,烫头');query ok, 1 row affected (0.01 sec)mysql> select * from t11;+------+---------------+| name | hobby |+------+---------------+| tank | 喝酒,烫头 |+------+---------------+row in set (0.00 sec)-- 不能选择不属于set('抽烟','喝酒','烫头','翻车')中的项,mysql> insert into t11 values ('jason','烫头,翻车,看妹子');error 1265 (01000): data truncated for column 'hobby' at row 1
五、mysql表查询1、限制查询的记录数(limit)示例:
select * from employee order by salary desc limit 3; --默认初始位置为0 select * from employee order by salary desc limit 0 , 5 ; --从第0开始,即先出第一条,然后包含这一条在内往后查5条select * from employee order by salary desc limit 5 , 5 ; --从第5开始,即先出第6条,然后包含这一条在内往后查5条
2、使用正则表达式查询小结:对字符串匹配的方式
where emp_name = 'nick';
where emp_name like 'sea%';
where emp_name regexp 'on$';
select * from employee where emp_name regexp '^jas';select * from employee where emp_name regexp 'on$';select * from employee where emp_name regexp 'm{2}';
六、数据备份(命令行)1、 数据库的逻辑备份--语法:mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql--示例:--单库备份mysqldump -uroot –p123 mysql > c:\db1.sqlmysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql--多库备份mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql--备份所有库mysqldump -uroot -p123 --all-databases > all.sql
2、 数据恢复--方法一:[root@nick backup]-- mysql -uroot -p123 < /backup/all.sql--方法二:mysql> use db1;mysql> set sql_log_bin=0; --关闭二进制日志,只对当前session生效mysql> source /root/db1.sql
七、事务和锁(sql)begin; -- 开启事务 select * from emp where id = 1 for update; -- 查询id值,for update添加行锁; update emp set salary=10000 where id = 1; -- 完成更新commit; -- 提交事务
八、执行计划explain执行计划:让mysql预估执行操作(一般正确)
explain语法:
explain select … from … [where …]
explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,explain可以用来查看sql语句的执行效果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。
具体用法和字段含义可以参考官网explain-output ,这里需要强调rows是核心指标,绝大部分rows小的语句执行一定很快(rows:显示mysql认为它执行查询时必须检查的行数。)。所以优化语句基本上都是在优化rows。
例如:
explain select * from news;
输出:
+--+-----------+-----+----+-------------+---+-------+---+----+-----+ |id|select_type|table|type|possible_keys|key|key_len|ref|rows|extra| +--+-----------+-----+----+-------------+---+-------+---+----+----—+
以上就是mysql数据库的基本操作实例分析的详细内容。