关系型数据库与非关系型数据库的区别
当前主流的关系型数据库有Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等。
非关系型数据库有 NoSql、Cloudant。
数据库 类型 | 特性 | 优点 | 缺点 |
关系型数据库 SQLite、Oracle、mysql | 1、关系型数据库,是指采用了关系模型来组织 数据的数据库; 2、关系型数据库的最大特点就是事务的一致性; 3、简单来说,关系模型指的就是二维表格模型, 而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。 | 1、容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状、层次等其他模型来说更容易理解; 2、使用方便:通用的SQL语言使得操作关系型数据库非常方便; 3、易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率; 4、支持SQL,可用于复杂的查询。 | 1、为了维护一致性所付出的巨大代价就是其读写性能比较差; 2、固定的表结构; 3、高并发读写需求; 4、海量数据的高效率读写; |
非关系型数据库 MongoDb、redis、HBase | 1、使用键值对存储数据; 2、分布式; 3、一般不支持ACID特性; 4、非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合。 | 1、无需经过sql层的解析,读写性能很高; 2、基于键值对,数据没有耦合性,容易扩展; 3、存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,而关系型数据库则只支持基础类型。 | 1、不提供sql支持,学习和使用成本较高; 2、无事务处理,附加功能bi和报表等支持也不好; |
学习地址:http://www.runoob.com/mysql/mysql-tutorial.html
Mysql基础概念
1.什么是数据库
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。
所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
RDBMS即关系数据库管理系统(Relational Database Management System)的特点:
- 1.数据以表格的形式出现
- 2.每行为各种记录名称
- 3.每列为记录名称所对应的数据域
- 4.许多的行和列组成一张表单
- 5.若干的表单组成database
2.RDBMS术语
- 数据库: 数据库是一些关联表的集合。
- 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
- 列: 一列(数据元素)包含了相同的数据, 例如邮政编码的数据。
- 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
- 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
- 外键:外键用于关联两个表。
- 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
- 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
- 参照完整性:参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
Mysql基础操作
1.Mysql创建数据库
- 使用create命令创建数据库:
CREATE DATABASE <数据库名>;
- 使用mysqladmin创建数据库
使用普通用户,可能需要特定的权限来创建或删除MySQL数据库。
可以使用mysql mysqladmin命令在终端执行来创建数据库。
mysqladmin -u root -p create <数据库名>
2.MySQL删除数据库
- drop命令删除数据库
drop命令格式
drop database <数据库名>;
- 使用mysqladmin删除数据库
mysqladmin -u -root -p drop <数据库名>
3.MySQL选择数据库
从命令提示窗口中选择MySQL数据库
use RUNOOB;
4.Mysql数据类型
MySQL中定义数据字段的类型对数据库的优化是非常重要的。
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
数值类型
Mysql支持所有标准SQL数值数据类型
这些类型包括严格数值类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。
日期和时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个“零”值,当指定不合法的MySQL不能表示的值时使用“零”值。
字符串类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
BINARY 和 VARBINARY类似于CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值。
BLOB是一个二进制大对象,可容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。
有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。
5.MySQL创建数据表
创建MySQL数据表需要以下信息:
- 表名
- 表字段名
定义每个表字段
语法
以下为创建MySQL数据表的SQL通用语法:
CREATE TABLE table_name(column_name columy_type);
实例:
CREATE TABLE IF NOT EXISTS 'runoob_tbl'(
'runoob_id' INT UNSIGNED AUTP_INCREMENT,
'runoob_title' VARCHAR(100) NOT NULL,
'runoob_author' VARCHAR(40) NOT NULL,
'submission_data' DATA,
PRIMARY KEY ('runoob_id')
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
实例分析:
- 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
- AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
- PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
- ENGINE 设置存储引擎,CHARSET 设置编码。
6.MySQL删除数据表
通用语法:
DROP TABLE table_name;
7.MySQL插入数据
MySQL表中使用 INSERT INTO SQL语句来插入数据
语法:
INSERT INTO table_name ( field1, field2, … ,fieldN )
VALUES
( value1, values, … , valueN);
实例:
mysql> INSERT INTO runoob_tbl
-> (runoob_title, runoob_author, submission_date)
-> VALUES
-> ("学习 PHP", "菜鸟教程", NOW());
8.MySQL查询数据
MySQL数据库使用SQL SELECT语句来查询数据
语法:
SELECT column_name, column_name
FROM table_name
[WHERE Clause]
[LIMIT N] [OFFSET M]
- 查询语句中你可以使用一个或多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
- SELECT 命令可以读取一条或者多条记录
- 可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
- 可以使用WHERE语句来包含任何条件
- 可以使用LIMT属性来设定返回的记录数
你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0
通过命令提示符获取数据
实例:
select * from runoob_tbl
9.MySQL WHERE子句
语法:
SELECT field1, field2, … fieldN FROM table_name1. table_name2…
[WHERE condition1 [AND [OR]] condition2…..
- 查询语句中可以使用一个或者多个表,表之间使用逗号”,”分割,并使用 WHERE 语句来设定查询条件
- 可以在 WHERE 子句中指定任何条件
- 可以使用 AND 或者 OR 指定一个或多个条件
- WHERE 子句也可以运用于SQL的 DELETE 或者 UPDATE命令。
WHERE子句类似于程序中的 if 条件,根据MySQL表中的字段值来读取指定的数据
以下为操作符列表,可用于 WHERE 子句中。
下表中实例假定 A 为10,B 为20
从命令提示符中读取数据
实例:
SELECT * FROM runoob_tbl WHERE runoob_author=’菜鸟教程’;
MySQL 的 WHERE 子句的字符串比较是不区分大小写的。可以使用 BINARY 关键字来设定 WHERE 子句的字符串比较是区分大小写。
实例:
SELECT * FROM runoob_tbl WHERE BINARY runoob_author=’runoob.com’;
SELECT * FROM runoob_tbl WHERE BINARY runoob_author=’RUNOOB.COM’;
10.MySQL UPDATE查询
如果需要修改或更新MySQL中的数据,可以使用SQL UPDATE命令来操作。
语法:
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause];
- 可以同时更新一个或多个字段
- 可以在WHERE子语句中指定任何条件
可以在一个单独表中同时更新数据
通过命令提示符
以下实例更新数据表中 runoob_id 为 3 的 runoob_title字段值:
UPDATE runoob_tbl SET runnob_title='学习 C++' WHERE runoob_id=3
11.MySQL DELETE语句
可以使用SQL的DELETE FROM 命令来删除MySQL数据表中的记录。
语法:
DELETE FROM table_name [WHERE Clause]
- 如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除
- 可以在 WHERE 子句中指定任何条件
- 可以在单个表中一次性删除记录
通过命令提示符
以下实例删除 runoob_tbl 表中 runnob_id 为 3 的记录:
DELETE FROM runoob_tbl WHERE runnob_id=3;
11.MySQL LIKE子句
假如需要获取 runnob_author 字段含有 “COM” 字符的所有记录,这时我们就需要在 WHERE 子句中使用 SQL LIKE 子句。
SQL LIKE 子句中使用百分号 % 字符来表示任意字符,类似于 UNIX 或 正则表达式中的星号 * 。
如果没有使用百分号 % 。LIKE 子句与等号 = 的效果是一样的。
语法:
SELECT field1, field2, … fieldN
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] field2 = ‘somevalue’
- 可以在 WHERE 子句中指定任何条件
- 可以在 WHERE 子句中使用LIKE子句
- 可以使用 LIKE 子句代替等号 =
- LIKE 通常与 % 一同使用,类似于一个元字符的搜索
- 可以使用 AND 或者 OR 指定一个或多个条件
- 可以在 DELETE 或 UPDATE 命令中使用 WHERE…LIKE 子句来指定条件
通过命令提示符
实例:
将 runoob_tbl 表中获取 runoob_author 字段中以 COM 为结尾的所有记录
SELECT * from runoob_tbl WHERE runoob_author LIKE '%COM';
12.MySQL UNION 操作符
MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。
语法:
SELECT expression1, expression2, … exporession_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTNCT]
SELECT expression1, expression2, … exporession_n
FROM tables
[WHERE conditions];
参数
- expression, expression2, … expression_n:要检索的列
- tables:要检索的数据表
- WHERE conditions:可选,检索条件。
- DISTINCT:可选,删除结果集中重复的数据。默认情况下 UNION 操作符 已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响
- ALL:可选,返回所有结果集,包含重复数据。
实例:
从“Websites”和“apps”表中选取不同的country(只有不同的值):
SELECT country FROM Websites
UNION
SELECT counrty FROM apps
ORDER BY counrty;
备注:UNION 不能用于列出两个表中所有的country。如果一些网站和APP来自同一个国家,每个国家只会列出一次。UNION只会选择不同的值。
UNION ALL来选择重复的值
实例:
使用 UNION ALL 从 “Websites” 和 “apps” 表中选取所有的country(也有重复的值)
SELECT country FROM Websites
UNION ALL
SELECT country FROM apps
ORDER BY counrty;
带有 WHERE 的 SQL UNION ALL
实例:
从”Websites” 和 “apps” 表中选取所有的中国(CN)的数据(也有重复的值)
SELECT country, name FROM Websites
WHERE country='CN'
UNION ALL
SELECT counrty, app_name FROM apps
WHERE country='CN'
ORDER BY country;
13.MySQL 排序
可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式进行排序,再返回搜索结果。
语法:
SELECT field1, field2, … fieldN table_name1, table_name2 …
ORDER BY field1, [field2…] [ASC [DESC]]
- 你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果
- 你可以设定多个字段来排序
- 你可以使用 ASC 或 DESC 关键字来设置查询结果是升序或降序排列。默认情况下,它是按升序排列。
- 你可以添加 WHERE … LIKE 子句来设置条件。
通过命令提示符
实例:
读取 runoob_tbl 表中所有数据并按 submission_date 字段的升序排列。
SELECT * from runoob_tbl ORDER BY submission_date ASC;
14.MySQL GROUP BY分组语句
GROUP BY 语句根据一个或多个列对结果集进行分组。
在分组的列上我们可以使用 COUNT,SUM,AVG,等函数。
语法:
SELECT column_name,function(column_name_
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
通过命令提示符
实例:
使用 GROUP BY 语句 将数据表按名字进行分组,并统计每个人有多少条记录。
SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;
使用 WITH ROLLUP
可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。
例如将以上的数据表按名字进行分组,再统计每个人的登录次数。
SELECT name, SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;
其中记录 NULL 表示所有人的登录次数。
我们可以使用 coalesce 来设置一个可以取代 NULL 的名称,coalesce 语法:
select coalesce(a, b, c);
参数说明:如果a == null,则选择b;如果b == null,则选择c;如果a!=null,则选择a;如果 a b c 都为 null,则返回 null(没意义)。
以下实例中如果名字为空,我们使用总数代替:
SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP;
15.MySQL 连接的使用
使用 MySQL 的 JOIN 在两个或多个表中查询数据。
JOIN 按照功能大致分为如下三类:
- INNER JOIN (内连接、或等值连接):获取两个表中字段匹配关系的记录
- LEFT JOIN (左连接):获取左表所有记录,即使右表没有对应匹配的记录
RIGHT JOIN(右连接):与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录
* 通过命令提示符*
尝试以下实例:
使用MySQL的 INNER JOIN(也可以省略 INNER 使用 JOIN ,效果用于)来连接 c以上两张表来读取runoob_tbl表中所有runoob_author字段在tcount_btl表对应的runnob_count字段值:
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runnoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
以上的SQL语句等价于:
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a, tcount_tbl b WEHRE a.runoob_author = b.runoob_author;
MySQL LEFT JOIN
MySQL left join 与 join 有所不同。 MySQL LEFT JOIN 会读取左边数据表的全部数据,即便右边表无对应数据。
实例:
以runnob_tbl为左表,tcount_tbl为右表,理解MySQL LEFT JOIN的应用:
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
以上实例中使用了 LEFT JOIN,该语句会读取左边的数据表 runoob_tbl 的所有选取的字段数据,即便在右侧表 tcount_tbl中 没有对应的 runoob_author 字段值。
MySQL RIGHT JOIN
MySQL RIGHT JOIN 会读取右边数据表的全部数据,即便左边边表无对应数据。
实例:
以 runoob_tbl 为左表,tcount_tbl 为右表,理解MySQL RIGHT JOIN的应用:
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a RIGHT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
以上实例中使用了 RIGHT JOIN,该语句会读取右边的数据表 tcount_tbl 的所有选取的字段数据,即便在左侧表 runoob_tbl 中没有对应的runoob_author 字段值。