主要分为关系型和非关系型。
可以简单的理解为,关系型数据库需要有表结构,非关系型数据库是key-value存储的,没有表结构。
关系型:如sqllite,db2,oracle,access,sql server,MySQL,注意:sql语句通用。
非关系型:mongodb,redis,memcache
MySQL是一个关系型数据库管理系统 ,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (关系数据库管理系统) 应用软件。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码 这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
MySQL为我们提供开源的安装在各个操作系统上的安装包,包括mac,linux,windows。
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。
MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。
mysql支持的存储引擎包括InnoDB、MyISAM、MEMORY、CSV、BLACKHOLE、 NDB、FEDERATED、MRG_MYISAM、ARCHIVE、PERFORMANCE_SCHEMA。其中NDB和InnoDB提供事务安全表,其他存储引擎都是非事务安全表。
# 查看当前的默认存储引擎: mysql> show variables like "default_storage_engine"; # 查询当前数据库支持的存储引擎 mysql> show engines \G;
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;
# my.ini文件 [mysqld] default-storage-engine=INNODB
查看表结构有两种方式:
[tablename]和describe [tablename]:
这两种方法和效果相同,可以查看当前的表结构。
举例:
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_info Create 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=utf8 row in set (0.01 sec) ERROR: No query specified
约束字段为自动增长,被约束的字段必须同时被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 | +----+------+------+ #也可以指定id mysql> 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的初始值,注意初始值的设置为表选项,应该放到括号外 create table student( id int primary key auto_increment, name varchar(20), sex enum(‘male‘,‘female‘) default ‘male‘ )auto_increment=3;
SET:
1-8个成员的集合,占1个字节
9-16个成员的集合,占2个字节
17-24个成员的集合,占3个字节
25-32个成员的集合,占4个字节
33-64个成员的集合,占8个字节
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 1 mysql> 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
示例:
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条
小结:对字符串匹配的方式
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}‘;
执行计划:让mysql预估执行操作(一般正确)
Explain语法:
explain select … from … [where …]
Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。
具体用法和字段含义可以参考官网explain-output ,这里需要强调rows是核心指标,绝大部分rows小的语句执行一定很快(有例外,下面会讲到)。所以优化语句基本上都是在优化rows。
例如:
explain select * from news;
输出:
+--+-----------+-----+----+-------------+---+-------+---+----+-----+
|id|select_type|table|type|possible_keys|key|key_len|ref|rows|Extra|
+--+-----------+-----+----+-------------+---+-------+---+----+---—+
原文:https://www.cnblogs.com/springsnow/p/12024603.html