存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方
法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和
操作此表的类型)
在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql
数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据
自己的需要编写自己的存储引擎
选择存储引擎
1. 查看存储引擎
SHOW ENGINES\G
SHOW VARIABLES LIKE 'have%'; MySQL 5.5
SHOW VARIABLES LIKE 'storage_engine%';
2. 选择存储引擎
方法1.
mysql> create table innodb1(
-> id int
-> )engine=innodb;
mysql> show create table innodb1;
方法2.
/etc/my.cnf
[mysqld]
default-storage-engine=INNODB
MySQL常用的存储引擎
MyISAM存储引擎
由于该存储引擎不支持事务、也不支持外键,所以访问速度较快。因此当对事务完整性没有要求并以访问为主的应用适合使用该存储引擎。
InnoDB存储引擎
由于该存储引擎在事务上具有优势,即支持具有提交、回滚及崩溃恢复能力等事务特性,所以比MyISAM存储引擎占用更多的磁盘空间。因此当需要频繁的更新、删除操作,同时还对事务的完整性要求较高,需要实现并发控制,建议选择。
MEMORY
MEMORY存储引擎存储数据的位置是内存,因此访问速度最快,但是安全上没有保障。适合于需要快速的访问或临时表。
BLACKHOLE
黑洞存储引擎,可以应用于主备复制中的分发主库。
MySQL表操作
========================================================
表是数据库存储数据的基本单位,由若干个字段组成,主要用来存储数据记录。表的操作包括创建表、查看表、修改表和删除表。这些操作都是数据库管理中最基本,也是最重要的操作。本节内容包括:
创建表
查看表结构
表完整性约束
修改表
复制表
删除表
一、创建表(表的基本操作)
表school.student1
字段 字段 字段
name sex age
tom male 23 记录
jack male 21 记录
alice female 19 记录
语法:
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
==在同一张表中,字段名是不能相同
==宽度和约束条件可选
==字段名和类型是必须的
mysql> CREATE DATABASE school; //创建数据库school
mysql> use school;
mysql> create table student1(
-> name varchar(50),
-> sex enum('male','female'),
-> age int
-> );
Query OK, 0 rows affected (0.33 sec)
mysql> show tables; //查看表(当前所在库)
mysql> desc student1;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| name | varchar(50) | YES | | NULL | |
| sex | enum('male','female') | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+-----------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> select name,sex,age from student1; //查询表中所有字段的值
Empty set (0.00 sec)
mysql> select * from student1; //查询表中所有字段的值
Empty set (0.00 sec)
mysql> select name,age from student1; //查询表中指定字段的值
Empty set (0.00 sec)
向表中插入内容
语法:
insert into 表名(字段1,字段2...) values(字段值列表...)
mysql> desc student1; //查看表结构
+-------+-----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| name | varchar(50) | YES | | NULL | |
| sex | enum('male','female') | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+-----------------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> insert into student1(name,sex,age) values
-> ('tom','male',23);
Query OK, 1 row affected (0.00 sec)
mysql> insert into student1 values //顺序插入,不用指定字段名
-> ('jack','male',21), //字符类型的值使用单引号或双引号
-> ('alice','female',19), //插入多个记录
-> ('rose','female',34);
mysql> insert into student1(name) values('robin'); //只向指定的字段插入值
Query OK, 1 row affected (0.00 sec)
表school.student2
姓名 name varchar(50)
出生年份 born_year year
生日 birthday date
上课时间 class_time time
注册时间 reg_time datetime
mysql> create table student2(
-> name varchar(50),
-> born_year year,
-> birthday date,
-> class_time time,
-> reg_time datetime
-> );
mysql> desc student2;
mysql> insert into student2 values('tom',now(),now(),now(),now());
mysql> insert into student2 values('jack',1982,19821120,123000,20140415162545);
mysql> create table student3(
-> name varchar(50),
-> sex enum('male','female'),
-> hobby set('music','book','game','disc')
-> );
mysql> insert into student3 values
-> ('tom','male','book,game');
二、查看表结构
DESCRIBE查看表结构
DESCRIBE 表名;
DESC 表名;
SHOW CREATE TABLE查看表详细结构
SHOW CREATE TABLE 表名;
三、表完整性约束
作用:用于保证数据的完整性和一致性
========================================================
约束条件 说明
PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录
FOREIGN KEY (FK) 标识该字段为该表的外键
NOT NULL 标识该字段不能为空
UNIQUE KEY (UK) 标识该字段的值是唯一的
AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键)
DEFAULT 为该字段设置默认值
UNSIGNED 无符号
ZEROFILL 使用0填充
========================================================
说明:
1. 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值
2. 字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值
sex enum('male','female') not null default 'male'
age int unsigned NOT NULL default 20 必须为正值(无符号) 不允许为空 默认是20
3. 是否是key
主键 primary key
外键 forengn key
索引 (index,unique...)
===DEFAULT、NOT NULL
表school.student5
mysql> create table school.student5(
-> name varchar(50) not null,
-> sex enum('male','female') default 'male' not null,
-> age int unsigned default 18 not null,
-> hobby set('music','disc','dance','book') default 'book,dance'
-> );
mysql> insert into student5 values('jack','male',20,'book');
Query OK, 1 row affected (0.00 sec)
mysql> insert into student5(name) values('robin');
Query OK, 1 row affected (0.00 sec)
===设置唯一约束 UNIQUE
方法一:
CREATE TABLE company.department (
dept_id INT,
dept_name VARCHAR(30) UNIQUE,
comment VARCHAR(50)
);
方法二:
CREATE TABLE company.department1 (
dept_id INT,
dept_name VARCHAR(30),
comment VARCHAR(50),
CONSTRAINT uk_name UNIQUE(dept_name)
);
===设置主键约束 PRIMARY KEY
primary key字段的值是不允许重复
单列做主键
多列做主键(复合主键)
单列做主键
表school.student6
方法一:
mysql> create table student6(
-> id int auto_increment not null primary key,
-> name varchar(50) not null,
-> sex enum('male','female') not null default 'male',
-> age int not null default 18
-> );
Query OK, 0 rows affected (0.00 sec)
表school.student7
方法二:
mysql> create table student7(
-> id int auto_increment not null,
-> name varchar(50) not null,
-> sex enum('male','female') not null default 'male',
-> age int not null default 18,
-> CONSTRAINT pk_id primary key(id)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> insert into student6 values
-> (1,'alice','female',22);
Query OK, 1 row affected (0.00 sec)
mysql> insert into student6(name,sex,age) values ('aaa','male','19');
Query OK, 1 row affected (0.00 sec)
复合主键
表school.service
host_ip 存储主机IP
service_name 服务名
port 服务对应的端口
allow(allow,deny) 服务是否允许访问
主键: host_ip + port = primary key
mysql> create table service(
-> host_ip varchar(15) not null,
-> service_name varchar(10) not null,
-> port varchar(5) not null,
-> allow enum('allow','deny') default 'deny',
-> primary key(host_ip,port)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> desc service;
+--------------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------------------+------+-----+---------+-------+
| host_ip | varchar(15) | NO | PRI | NULL | |
| service_name | varchar(10) | NO | | NULL | |
| port | varchar(5) | NO | PRI | NULL | |
| allow | enum('allow','deny') | YES | | deny | |
+--------------+----------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> insert into service values
-> ('192.168.2.168','ftp','21','allow'),
-> ('192.168.2.168','httpd','80','allow');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
===设置字段值增 AUTO_INCREMENT
表company.department2
CREATE TABLE department3 (
dept_id INT PRIMARY AUTO_INCREMENT,
dept_name VARCHAR(30),
comment VARCHAR(50)
);
===设置外键约束 FOREIGN KEY
父表company.employees
mysql> create table employees(
-> name varchar(50) not null,
-> mail varchar(20),
-> primary key(name)
-> )engine=innodb;
子表company.payroll
mysql> create table payroll(
-> id int(5) not null,
-> name varchar(50) not null,
-> payroll float(10,2) not null,
-> primary key(id),
-> CONSTRAINT fk_name foreign key(name)
-> references employees(name)
-> on update cascade
-> on delete cascade
-> )engine=innodb;
//name外键,关联父表(employees主键name),同步更新,同步删除
mysql> desc payroll;
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id | int(5) | NO | PRI | NULL | |
| name | varchar(50) | NO | MUL | NULL | |
| payroll | float(10,2) | NO | | NULL | |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> update employees set name='tomaaa' where name='tom';
mysql> delete from employees where name='tom';
结论:
当父表中某个员工的记录修改时,子表也会同步修改
当父表中删除某个员工的记录,子表也会同步删除
四、修改表ALTER TABLE
语法:
1. 修改表名
ALTER TABLE 表名
RENAME 新表名;
2. 增加字段
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…],
ADD 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…] FIRST;
ALTER TABLE 表名
ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名;
3. 删除字段
ALTER TABLE 表名
DROP 字段名;
4. 修改字段
ALTER TABLE 表名
MODIFY 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名
CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];
ALTER TABLE 表名
CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
示例:
1. 修改存储引擎
mysql> alter table service
-> engine=innodb;
2. 添加字段
mysql> alter table student10
-> add name varchar(20) not null,
-> add age int(3) not null default 22;
mysql> alter table student10
-> add stu_num varchar(10) not null after name; //添加name字段之后
mysql> alter table student10
-> add sex enum('male','female') default 'male' first; //添加到最前面
3. 删除字段
mysql> alter table student10
-> drop sex;
mysql> alter table service
-> drop mac;
4. 修改字段类型modify
mysql> alter table student10
-> modify age int(3);
mysql> alter table student10
-> modify id int(11) not null primary key auto_increment; //修改为主键
5. 增加约束(针对已有的主键增加auto_increment)
mysql> alter table student10 modify id int(11) not null primary key auto_increment;
ERROR 1068 (42000): Multiple primary key defined
mysql> alter table student10 modify id int(11) not null auto_increment;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
6. 对已经存在的表增加复合主键
mysql> alter table service2
-> add primary key(host_ip,port);
7. 增加主键
mysql> alter table student1
-> modify name varchar(10) not null primary key;
8. 增加主键和自动增长
mysql> alter table student1
-> modify id int not null primary key auto_increment;
9. 删除主键
a. 删除自增约束
mysql> alter table student10 modify id int(11) not null;
b. 删除主键
mysql> alter table student10
-> drop primary key;
五、复制表
复制表结构+记录 (key不会复制: 主键、外键和索引)
mysql> create table new_service select * from service;
只复制表结构
mysql> select * from service where 1=2; //条件为假,查不到任何记录
Empty set (0.00 sec)
mysql> create table new1_service select * from service where 1=2;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> create table t4 like employees;
六、删除表
DROP TABLE 表名;
========================================================
MySQL索引
========================================================
创建索引
创建表时创建索引
CREATE在已存在的表上创建索引
ALTER TABLE在已存在的表上创建索引
查看并测试索引
删除索引
一、索引简介
索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能
非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。
索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。
索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。
二、索引的分类
普通索引
唯一索引
全文索引
单列索引
多列索引
空间索引
三、准备实验环境
1. 准备表
mysql> create table school_2.t2( id int, name varchar(20) );
Query OK, 0 rows affected (0.37 sec)
mysql> desc t2;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
2. 创建存储过程,实现批量插入记录
mysql> delimiter $$
mysql> create procedure autoinsert1()
-> BEGIN
-> declare i int default 1;
-> while(i<20000)do
-> insert into school.t2 values(i,'ccc');
-> set i=i+1;
-> end while;
-> END$$
mysql> delimiter ;
mysql> show procedure status\G
*************************** 1. row ***************************
Db: school
Name: autoinsert1
Type: PROCEDURE
Definer: root@localhost
Modified: 2014-04-16 09:55:00
Created: 2014-04-16 09:55:00
Security_type: DEFINER
Comment:
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)
mysql> show create procedure autoinster2\G
*************************** 1. row ***************************
Procedure: autoinsert1
sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `autoinster2`()
BEGIN
declare i int default 1;
while(i<30000)do
insert into school_2.t1 values(i,'ccc');
set i=i+1;
end while;
END
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)
3. 调用存储过程
mysql> call autoinsert1();
四、创建索引
===创建表时
语法:
CREATE TABLE 表名 (
字段名1 数据类型 [完整性约束条件…],
字段名2 数据类型 [完整性约束条件…],
[UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY
[索引名] (字段名[(长度)] [ASC |DESC])
);
创建普通索引示例:
CREATE TABLE department (
dept_id INT,
dept_name VARCHAR(30) ,
comment VARCHAR(50),
INDEX index_dept_name (dept_name)
);
创建唯一索引示例:
CREATE TABLE department1 (
dept_id INT,
dept_name VARCHAR(30) ,
comment VARCHAR(50),
UNIQUE INDEX index_dept_name (dept_name)
);
创建全文索引示例:
CREATE TABLE department (
dept_id INT,
dept_name VARCHAR(30) ,
comment VARCHAR(50),
log text,
FULLTEXT INDEX index_log (log)
);
创建多列索引示例:
CREATE TABLE department (
dept_id INT,
dept_name VARCHAR(30) ,
comment VARCHAR(50),
INDEX index_dept_name_comment (dept_name, comment)
);
===CREATE在已存在的表上创建索引
语法:
CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名
ON 表名 (字段名[(长度)] [ASC |DESC]) ;
创建普通索引示例:
CREATE INDEX index_dept_name ON department (dept_name);
创建唯一索引示例:
CREATE UNIQUE INDEX index_dept_name ON department (dept_name);
创建全文索引示例:
CREATE FULLTEXT INDEX index_dept_name ON department (dept_name);
创建多列索引示例:
CREATE INDEX index_dept_name_ comment ON department (dept_name, comment);
===ALTER TABLE在已存在的表上创建索引
语法:
ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX
索引名 (字段名[(长度)] [ASC |DESC]) ;
创建普通索引示例:
ALTER TABLE department ADD INDEX index_dept_name (dept_name);
创建唯一索引示例:
ALTER TABLE department ADD UNIQUE INDEX index_dept_name (dept_name);
创建全文索引示例:
ALTER TABLE department ADD FULLTEXT INDEX index_dept_name (dept_name);
创建多列索引示例:
ALTER TABLE department ADD INDEX index_dept_name_comment (dept_name, comment);
四、管理索引
查看索引
SHOW CRETAE TABLE 表名\G
测试示例
EXPLAIN SELECT * FROM department WHERE dept_name=‘hr’;
删除索引
DROP INDEX 索引名 ON 表名;
五、Sphinx
Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数
据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚
本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件。
Sphinx 单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建索引的速度为:创建100万条记录的索引只需 3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。
Coreseek
Coreseek 是一个可供企业使用的、基于Sphinx(可独立于Sphinx原始版本运行)的中文全文检
索引擎,按照GPLv2协议发行。商业使用(例如, 嵌入到其他程序中)需要获得商业授权。
Coreseek是一个支持中文的全文搜索引擎,意图为其他应用提供高速、低空间占用、高相关度结
果的中文全文搜索能力。CoreSeek可以非常容易的与SQL数据库和脚本语言集成。
Sphinx/Coreseek配置
Sphinx/Coreseek配置将在搭建LNMP时讲解
索引测试实验:
mysql> create table school.t2(id int,name varchar(30));
Query OK, 0 rows affected (1.33 sec)
mysql> desc school.t2;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(30) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> delimiter $$
mysql> create procedure autoinsert1()
-> BEGIN
-> declare i int default 1;
-> while(i<100000)do
-> insert into school.t2 values(i,'ccc');
-> set i=i+1;
-> end while;
-> END$$
ERROR 1046 (3D000): No database selected
mysql>
mysql> use school
Database changed
mysql> delimiter ;
mysql> call autoinsert1();
mysql> explain select * from school.t2 where id=20000;
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
| 1 | SIMPLE | t2 | ALL | NULL | NULL | NULL | NULL | 44848 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
1 row in set (0.00 sec)
mysql> create index index_id on school.t2(id);
Query OK, 0 rows affected (0.91 sec)
Records: 0 Duplicates: 0 Warnings作用: 0
mysql> explain select * from school.t2 where id=20000;
+----+-------------+-------+------+---------------+----------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+----------+---------+-------+------+-------------+
| 1 | SIMPLE | t2 | ref | index_id | index_id | 5 | const | 1 | Using where |
+----+-------------+-------+------+---------------+----------+---------+-------+------+-------------+
1 row in set (0.00 sec)
SHOW CREATE TABLE 表名\G
EXPLAIN: 命令的作用是查看查询优化器如何决定执行查询
花费时间比较:
创建索引前
mysql> select * from school.t2 where id=20000;
+-------+------+
| id | name |
+-------+------+
| 20000 | ccc |
+-------+------+
1 row in set (0.03 sec)
创建索引后
mysql> create index index_id on school.t2(id);
Query OK, 0 rows affected (0.39 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select * from school.t2 where id=20000;
+-------+------+
| id | name |
+-------+------+
| 20000 | ccc |
+-------+------+
1 row in set (0.00 sec)
========================================================
MySQL视图VIEW
========================================================
视图简介
创建视图
查看视图
修改视图
通过视图操作基表
删除视图
一、视图简介
MySQL视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行
数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所
引用的表,并且在引用视图时动态生成。对其中所引用的基础表来说,MySQL视图的作用类似于筛选。
定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。通过视图进行查询没有任
何限制,通过它们进行数据修改时的限制也很少。
视图是存储在数据库中的SQL查询语句,它主要出于两种原因:安全原因,视图可以隐藏一些数据,如:
一些敏感的信息,另一原因是可以使复杂的查询易于理解和使用。
二、创建视图
语法一:
CREATE [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE} ]
VIEW 视图名 [(字段1,字段2…)]
AS SELECT语句
[WITH [CASCADED | LOCAL] CHECK OPTION ];
语法二:
CREATE VIEW 视图名
AS SELECT语句;
示例:
CREATE DATABASE view;
USE view
CREATE VIEW view_user
AS
SELECT user,host,password FROM mysql.user;
SELECT * FROM view_user;
创建视图案例 (多表)
mysql> create database shop;
Query OK, 1 row affected (0.21 sec)
mysql> use shop
Database changed
mysql> create table product(
-> id int unsigned auto_increment primary key not null,
-> name varchar(60) not null,
-> price double not null
-> );
mysql> insert into product(name,price) values
-> ('pear',4.3),
-> ('orange',6.5),
-> ('apple',5.0)
-> ;
mysql> create table purchase(
-> id int unsigned auto_increment primary key not null,
-> name varchar(60) not null,
-> quantity int not null default 0,
-> gen_time datetime not null
-> );
mysql> insert into purchase(name,quantity,gen_time) values
-> ('apple',7,now()),
-> ('pear',10,now())
-> ;
mysql> create view purchase_detail
-> as select
-> product.name as name, product.price as price,
-> purchase.quantity as quantity,
-> product.price * purchase.quantity as total_value
-> from product,purchase
-> where product.name = purchase.name;
mysql> select * from purchase_detail;
+-------+-------+----------+-------------+
| name | price | quantity | total_value |
+-------+-------+----------+-------------+
| pear | 4.3 | 10 | 43 |
| apple | 5 | 7 | 35 |
+-------+-------+----------+-------------+
2 rows in set (0.04 sec)
mysql> insert into purchase(name,quantity,gen_time) values ('orange',20,now());
Query OK, 1 row affected (0.01 sec)
mysql> select * from purchase_detail;
+--------+-------+----------+-------------+
| name | price | quantity | total_value |
+--------+-------+----------+-------------+
| apple | 5 | 7 | 35 |
| pear | 4.3 | 10 | 43 |
| orange | 6.5 | 20 | 130 |
+--------+-------+----------+-------------+
3 rows in set (0.00 sec)
三、查看视图
1. SHOW TABLES 查看视图名
USE view;
SHOW TABLES;
2. SHOW TABLE STATUS
示例:查看view数据库中视图及所有表详细信息
SHOW TABLE STATUS FROM view \G
示例:查看view数据库中视图名view_user详细信息
SHOW TABLE STATUS FROM view
LIKE 'view_user' \G
3. SHOW CREATE VIEW
示例:查看视图定义信息
USE view;
SHOW CREATE VIEW view_user \G
4. DESCRIBE
示例:查看视图结构
USE view;
DESC view_user ;
四、修改视图
方法一:删除后新创建
USE view;
DROP VIEW view_user ;
CREATE VIEW view_user
AS SELECT user,host FROM mysql.user;
SELECT * FROM view_user;
方法二:ALTER修改视图
语法:
ALTER VIEW 视图名
AS SELECT语句;
示例:
USE view;
ALTER VIEW view_user
AS SELECT user,password FROM mysql.user;
五、通过视图操作基表
查询数据SELECT
SELECT * FROM view_user;
更新数据UPDATE
删除数据DELETE
六、删除视图
语法:
DROP VIEW view_name [,view_name]…;
示例:
USE view;
DROP VIEW view_user ;
========================================================
MySQL单表查询 SELECT
========================================================
简单查询
通过条件查询
查询排序
限制查询记录数
使用集合函数查询
分组查询
使用正则表达式查询
表company.employee
雇员编号 emp_id int
雇员姓名 emp_name varchar(30)
雇员性别 sex enum
雇用时期 hire_date date
职位 post varchar(50)
职位描述 job_description varchar(100)
薪水 salary double(15,2)
办公室 office int
部门编号 dep_id int
mysql> CREATE TABLE employee(
-> emp_id int primary key AUTO_INCREMENT,
-> emp_name varchar(30),
-> sex enum('male','female'),
-> hire_date date,
-> post varchar(50),
-> job_description varchar(100),
-> salary double(15,2),
-> office int,
-> dep_id int
-> );
mysql> desc employee;
+-----------------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-----------------------+------+-----+---------+----------------+
| emp_id | int(11) | NO | PRI | NULL | auto_increment |
| emp_name | varchar(30) | YES | | NULL | |
| sex | enum('male','female') | YES | | NULL | |
| hire_date | date | YES | | NULL | |
| post | varchar(50) | YES | | NULL | |
| job_description | varchar(100) | YES | | NULL | |
| salary | double(15,2) | YES | | NULL | |
| office | int(11) | YES | | NULL | |
| dep_id | int(11) | YES | | NULL | |
+-----------------+-----------------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)
mysql> insert into employee values
(1,'jack','male','20130202','instructor','teach',5000,501,100),
(2,'tom','male','20130203','instructor','teach',5500,501,100),
(3,'robin','male','20130202','instructor','teach',8000,501,100),
(4,'alice','female','20130202','instructor','teach',7200,501,100),
(5,'tianyun','male','20130202','hr','hrcc',600,502,101),
(6,'harry','male','20120202','hr','hrcc',6000,502,101),
(7,'emma','female','20120206','sale','salecc',20000,503,102),
(8,'christine','female','20120205','sale','salecc',2200,503,102);
一、简单查询
简单查询
SELECT emp_id, emp_name,sex, hire_date, post, job_description, salary,
office, dep_id FROM employee;
SELECT * FROM employee;
SELECT emp_name, salary, dep_id FROM employee;
避免重复DISTINCT
SELECT DISTINCT post FROM employee;
通过四则运算查询
SELECT emp_name, salary*12 FROM employee;
SELECT emp_name, salary*12 AS Annual_salary FROM employee;
SELECT emp_name, salary*12 Annual_salary FROM employee;
定义显示格式
CONCAT() 函数用于连接字符串
SELECT CONCAT(emp_name, ' annual salary: ', salary*12) AS Annual_salary
FROM employee;
二、单条件查询
单条件查询
SELECT emp_name
FROM employee
WHERE post='hr';
多条件查询
SELECT emp_name,salary
FROM employee
WHERE post='hr' AND salary>10000;
关键字BETWEEN AND
SELECT emp_name,salary FROM employee
WHERE salary BETWEEN 5000 AND 15000;
SELECT emp_name,salary FROM employee
WHERE salary NOT BETWEEN 5000 AND 15000;
关键字IS NULL
SELECT emp_name,job_description FROM employee
WHERE job_description IS NULL;
SELECT emp_name,job_description FROM employee
WHERE job_description IS NOT NULL;
SELECT emp_name,job_description FROM employee
WHERE job_description='';
关键字IN集合查询
SELECT emp_name, salary FROM employee
WHERE salary=4000 OR salary=5000 OR salary=6000 OR salary=9000 ;
SELECT emp_name, salary FROM employee
WHERE salary IN (4000,5000,6000,9000) ;
SELECT emp_name, salary FROM employee
WHERE salary NOT IN (4000,5000,6000,9000) ;
关键字LIKE模糊查询
通配符’%’
SELECT * FROM employee
WHERE emp_name LIKE 'al%';
通配符’_’
SELECT * FROM employee
WHERE emp_name LIKE 'al___';
三、查询排序
按单列排序
SELECT * FROM employee ORDER BY salary;
SELECT * FROM employee ORDER BY salary ASC;
SELECT * FROM employee ORDER BY salary DESC;
按多列排序
SELECT * FROM employee
ORDER BY hire_date DESC,
salary ASC;
四、限制查询的记录数
示例:
SELECT * FROM employee ORDER BY salary DESC
LIMIT 5; //默认初始位置为0
SELECT * FROM employee ORDER BY salary DESC
LIMIT 0,5;
SELECT * FROM employee ORDER BY salary DESC
LIMIT 3,5; //从第4条开始,共显示5条
五、使用集合函数查询
示例:
SELECT COUNT(*) FROM employee;
SELECT COUNT(*) FROM employee WHERE dep_id=101;
SELECT MAX(salary) FROM employee;
SELECT MIN(salary) FROM employee;
SELECT AVG(salary) FROM employee;
SELECT SUM(salary) FROM employee;
SELECT SUM(salary) FROM employee WHERE dep_id=101;
六、分组查询
单独使用GROUP BY关键字分组
SELECT * FROM employee GROUP BY dep_id;
//默认只显示每个分组的第一条记录,意义不大
GROUP BY关键字和GROUP_CONCAT()函数一起使用
SELECT dep_id,GROUP_CONCAT(emp_name) FROM employee GROUP BY dep_id;
SELECT dep_id,GROUP_CONCAT(emp_name) as emp_members FROM employee GROUP BY dep_id;
GROUP BY与集合函数一起使用
SELECT dep_id,COUNT(dep_id) FROM employee GROUP BY dep_id;
七、使用正则表达式查询
SELECT * FROM employee WHERE emp_name REGEXP '^ali';
SELECT * FROM employee WHERE emp_name REGEXP 'yun$';
SELECT * FROM employee WHERE emp_name REGEXP 'm{2}';
小结:对字符串匹配的方式
WHERE emp_name = 'tom';
WHERE emp_name LIKE 'to%';
WHERE emp_name REGEXP 'yun$';
========================================================