MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。MySQL将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
mysql -h host -u username -p 与数据库建立连接
use database_name 选择数据库
show databases 显示所有的数据库
show tables 显示当前数据库下所有数据表
show columns from table_name 显示表的列信息,作用和desc table_name是一样的
MySQL支持的其他show语句还有:
show status 显示MySQL服务器状态信息
show create database xxx和show create table xxx 分别显示创建特定数据库和数据表的MySQL语句
show grants 显示授予用户的安全权限
show errors和show warnings 显示服务器错误或警告信息
select column_name from table_name 从table_name数据表中检索column_name列,检索单个列
select column1_name, column2_name from table_name 检索多个列
select * from table_name 检索所有列
注意,select返回所有匹配的行,但是,如果我们不想某个值每次都出现,那怎么办呢?例如,想让select id from xxx结果中id值唯一,则可以在select语句中添加distinct关键字:
select distinct id from goods
有时我们想限制输出的结果,比如返回第一行或前几行,可使用limit子句,如下所示:
select * from goods limit 2 返回前2行结果,注意,当行数不够时,只能返回数据表中有限的行数
select * from goods limit 2, 2 返回从行2开始的2行
当然,我们也可以使用完全限制来进行数据检索:
select goods.id, goods.name from goods 输出goods表中所有记录
测试数据表内容:
mysql> select * from student;
+----+------+------+----------+
| id | name | age | class_id |
+----+------+------+----------+
| 1 | Tom | 23 | 1 |
| 2 | John | 22 | 1 |
| 3 | Red | 23 | 2 |
| 4 | Fork | 24 | 3 |
+----+------+------+----------+
4 rows in set (0.04 sec)
mysql> select * from class;
+----+---------+-----------+
| id | name | teacher |
+----+---------+-----------+
| 1 | class 1 | teacher 1 |
| 2 | class 2 | teacher 2 |
| 4 | class 4 | teacher 4 |
+----+---------+-----------+
3 rows in set (0.00 sec)
select from student order by name 升序排列
select from student order by name desc 降序排列
有时,我们需要对多个列排序怎么办呢?这时可以使用如下sql语句来执行,select * from student order by id desc, name,注意,这里是对id进行降序排列,如果id相同时,对name进行升序排列。如果想对多个列进行降序排列,需要对每个列指定desc关键字。
`select * from student order by id desc, name`
使用order by和limit的组合,我们能够找到一个列中最高或者最低的值,比如这里还用student表做测试:
select * from student order by class_id desc limit 1;
+----+------+------+----------+
| id | name | age | class_id |
+----+------+------+----------+
| 4 | Fork | 24 | 3 |
+----+------+------+----------+
select语句的order by子句对检索出的数据进行排序,这个字句必须出现在select语句中的最后一条子句。
#### 过滤数据
select语句中,数据可以根据where子句指定的过滤条件进行过滤,where子句在表名(from子句)之后给出,比如,select id, name from student where id = 2,该语句只显示id为2记录的id和name。注意:如果同时使用where和order by子句,应该让order by子句在where之后,否则会产生错误。
where子句操作符如下:
= 等于
<> 不等于
!= 不等于
< 小于
大于
= 大于等于
between 在指定的两个值之间(比如select * from student where id between 1 and 2)
我们在创建表时,可以指定其中的列是否可以不包含值,在一个列不包含值时,其值为空值null,select语句有一个特殊的where子句,用来检测具有null值的列,比如:select * from student where name is null 就把name是空值的记录给打印出来。
常用的select子句在过滤数据时使用的是单一的条件,为了进行更强的过滤控制,可以下多个where子句,这些子句有两种方式:以and子句和or子句的方式使用。
select from student where id = 2 and age > 10 检索id为2并且age大于10的记录
select from student where id = 3 or age > 15 检索id为3并且age大于15的记录
mysql> select * from student where id in (select id from student where age > 22);
+----+------+------+----------+
| id | name | age | class_id |
+----+------+------+----------+
| 1 | Tom | 23 | 1 |
| 3 | Red | 23 | 2 |
| 4 | Fork | 24 | 3 |
+----+------+------+----------+
mysql> select s.name, s.age, c.id from student s, class c where s.class_id = c.id;
+------+------+----+
| name | age | id |
+------+------+----+
| Tom | 23 | 1 |
| John | 22 | 1 |
| Red | 23 | 2 |
+------+------+----+
使用WHERE子句作为过滤条件,它只包含匹配给定给定条件的行。没有WHERE子句,第一个表中的每个行将于第二个表中的每个行配对,而不管它们逻辑上是否可以配对在一起。SQL对一条SELECT语句中可以联结的表的数目没有限制。基于两个表之间相等测试的联接称为内部联接。其实,对于这种联结可以使用稍微不同的语法来明确指定联结的类型,下面的select语句返回与前面例子完全相同的数据。
`select s.name, s.age, c.id from student s inner join class c where s.class_id = c.id`
除了内部联接之外还有外部联结,外部联结包括左外联结、右外联结、完整外部联结:
left join子句指定左表的所有行,而不仅仅是联结所匹配的行,如果左表某个行在右表中没有匹配行,则在关联的结果集中对应值为空值。
right join子句指定右表的所有行,而不仅仅是联结所匹配的行,如果右表某个行在左表中没有匹配行,则在关联的结果集中对应值为空值。
full join完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的对应列是空值。
mysql> select s.name, s.age, c.id from student s left join class c on s.class_id = c.id;
+------+------+------+
| name | age | id |
+------+------+------+
| Tom | 23 | 1 |
| John | 22 | 1 |
| Red | 23 | 2 |
| Fork | 24 | NULL |
+------+------+------+
4 rows in set (0.01 sec)
mysql> select s.name, s.age, c.id from student s right join class c on s.class_id = c.id;
+------+------+----+
| name | age | id |
+------+------+----+
| Tom | 23 | 1 |
| John | 22 | 1 |
| Red | 23 | 2 |
| NULL | NULL | 4 |
+------+------+----+
4 rows in set (0.00 sec)
mysql> select s.name, s.age, c.name from student s right join class c on s.class_id = c.id;
+------+------+---------+
| name | age | name |
+------+------+---------+
| Tom | 23 | class 1 |
| John | 22 | class 1 |
| Red | 23 | class 2 |
| NULL | NULL | class 4 |
+------+------+---------+
4 rows in set (0.00 sec)
#### 组合查询
利用union操作符和组合多条SQL查询,让给出的多条select语句结果组合成单个结果集。注意,union必须有2条或者2条以上的select语句组成,union中每个查询必须包含相同的列、表达式或聚集函数(不过每个列不需要以相同的次序列出)。union会自动去除重复的行,这个是默认的行为,如果不想这样,使用union all而不是使用union。
`select * from student where id > 1 union select * from student where age > 23`
#### 插入数据
插入语句insert一般会有产生输出,一般只会打印影响的行数。insert时如果不提供列名,则必须给每个表列提供一个值,如果提供列名,则必须对每个列出的列给出一个值,否则报错。
mysql> create view students as select * from student;
Query OK, 0 rows affected (0.03 sec)
mysql> show tables;
+---------------+
| Tables_in_zzz |
+---------------+
| class |
| student |
| students |
+---------------+
3 rows in set (0.00 sec)
mysql> select * from students;
+----+------+------+----------+
| id | name | age | class_id |
+----+------+------+----------+
| 1 | Tom | 23 | 1 |
| 2 | John | 22 | 1 |
| 3 | Red | 23 | 2 |
| 4 | Fork | 24 | 3 |
+----+------+------+----------+
4 rows in set (0.00 sec)
MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。MySQL将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
数据库基础概念
MySQL逻辑架构
MySQL服务器逻辑分为3层架构,最上层是网络服务层,比如连接处理、授权认证、安全等。第二层是核心服务层,包括查询解析、分析、优化、缓存以及所有的内置函数(例如日期/时间/数学等),所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图。 每个客户端连接都会在服务器中拥有一个线程,这个连接的查询只会在这个单独的线程中执行。MySQL中处理并发操作,会使用锁机制,锁包括表锁和行级锁,表锁会锁定整个表,行级锁最大程序支持了并发处理,行级锁只在存储引擎中实现,而MySQL服务器层没有实现。 MySQL实现了各种死锁检测和死锁超时机制,InnoDB目前处理死锁的机制是,将持有最少行级排它锁的事务进行回滚。
事务
事务是一组原子性的SQL查询(或者说独立的一个执行单元),事务中的语句,要么全部执行成功,要么全部执行失败。MySQL服务层不管理事务,事务是由下层的存储引擎实现的。 事务的四个特性:
事务的四种隔离级别
存储引擎
在MySQL中,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一个表使用不同的存储引擎。
InnoDB
InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,InnoDB是MySQL默认的引擎。
MyISAM
MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事物。
MEMORY存储引擎
MEMORY存储引擎将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问。
使用MySQL
MySQL支持的其他show语句还有:
检索数据
SQL语句中最常用的就是select语句了,它用来在一个或多个表中检索数据,select使用示例如下:
注意,select返回所有匹配的行,但是,如果我们不想某个值每次都出现,那怎么办呢?例如,想让select id from xxx结果中id值唯一,则可以在select语句中添加distinct关键字:
select distinct id from goods
有时我们想限制输出的结果,比如返回第一行或前几行,可使用limit子句,如下所示:当然,我们也可以使用完全限制来进行数据检索:
select goods.id, goods.name from goods 输出goods表中所有记录
测试数据表内容:mysql> select * from class; +----+---------+-----------+ | id | name | teacher | +----+---------+-----------+ | 1 | class 1 | teacher 1 | | 2 | class 2 | teacher 2 | | 4 | class 4 | teacher 4 | +----+---------+-----------+ 3 rows in set (0.00 sec)
select from student order by name 升序排列 select from student order by name desc 降序排列
select * from student order by class_id desc limit 1; +----+------+------+----------+ | id | name | age | class_id | +----+------+------+----------+ | 4 | Fork | 24 | 3 | +----+------+------+----------+
= 等于 <> 不等于 != 不等于 < 小于
mysql> select s.name, s.age, c.id from student s right join class c on s.class_id = c.id; +------+------+----+ | name | age | id | +------+------+----+ | Tom | 23 | 1 | | John | 22 | 1 | | Red | 23 | 2 | | NULL | NULL | 4 | +------+------+----+ 4 rows in set (0.00 sec)
mysql> select s.name, s.age, c.name from student s right join class c on s.class_id = c.id; +------+------+---------+ | name | age | name | +------+------+---------+ | Tom | 23 | class 1 | | John | 22 | class 1 | | Red | 23 | class 2 | | NULL | NULL | class 4 | +------+------+---------+ 4 rows in set (0.00 sec)
insert student values(5, 'luoxn28', 23, 1) insert student (name, age, class_id) value('luoxn28', 23, 1) insert student (name, age, class_id) values('luoxn28', 23, 1), ('luo', 23, 2) 插入多行
update student set age = 24 where id = 5 delete from student where id = 5
mysql> create view students as select * from student; Query OK, 0 rows affected (0.03 sec)
mysql> show tables; +---------------+ | Tables_in_zzz | +---------------+ | class | | student | | students | +---------------+ 3 rows in set (0.00 sec)
mysql> select * from students; +----+------+------+----------+ | id | name | age | class_id | +----+------+------+----------+ | 1 | Tom | 23 | 1 | | 2 | John | 22 | 1 | | 3 | Red | 23 | 2 | | 4 | Fork | 24 | 3 | +----+------+------+----------+ 4 rows in set (0.00 sec)