数据库与关系型数据库
数据库
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,
每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。
关系型数据库
所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
RDBMS 术语
数据库: 数据库是一些关联表的集合。
数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
外键:外键用于关联两个表。
复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
Mysql数据库
MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
安装
验证安装
1 | luoyecs-iMac:~ luoyec$ mysqladmin --version |
检查 MySql 服务器是否启动
1 | luoyecs-iMac:~ luoyec$ ps -ef | grep mysqld |
关闭目前运行的 MySQL 服务器
1 | mysqladmin -u root -p shutdown |
基础SQL语句
SELECT
SELECT 语句用于从数据库中选取数据。
结果被存储在一个结果表中,称为结果集。
1 | SELECT name,country FROM Websites; |
SELECT DISTINCT
SELECT DISTINCT 语句用于返回唯一不同的值, 也就是去掉列中重复值。1
2SELECT DISTINCT column_name,column_name
FROM table_name;
WHERE
WHERE 子句用于提取那些满足指定标准的记录。
下面的 SQL 语句从 “Websites” 表中选取国家为 “CN” 的所有网站:1
SELECT * FROM Websites WHERE country='CN';
运算符:
AND & OR
AND & OR 运算符用于基于一个以上的条件对记录进行过滤。
如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则 OR运算符显示一条记录。
下面的 SQL 语句从 “Websites” 表中选取国家为 “CN” 且id排名大于 2” 的所有网站:
1 | SELECT * FROM Websites WHERE country='CN' AND id>2; |
选取 id 等于2或者等于3的所有数据。
1 | SELECT * FROM Websites WHERE id=3 OR id=2; |
您也可以把 AND 和 OR 结合起来(使用圆括号来组成复杂的表达式)。
“Websites” 表中选取 alexa 排名大于 “15” 且国家为 “CN” 或 “USA” 的所有网站:
1 | SELECT * FROM Websites |
ORDER BY
ORDER BY 关键字用于对结果集进行排序。
ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序。
ORDER BY 关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 关键字。
1 | SELECT column_name,column_name |
选取所有网站,按id降序
1 | SELECT * FROM Websites ORDER BY id DESC; |
ORDER BY 多列的时候,先按照第一个column name排序,在按照第二个column name排序;如上述教程最后一个例子:
- 先将country值这一列排序,同为CN的排前面,同属USA的排后面;
- 然后在同属CN的这些多行数据中,再根据alexa值的大小排列。
- ORDER BY 排列时,不写明ASCDESC的时候,默认是ASC。
INSERT INTO
INSERT INTO 语句用于向表中插入新记录。
INSERT INTO 语句可以有两种编写形式。
第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:
1 | INSERT INTO table_name |
第二种形式需要指定列名及被插入的值:
1 | INSERT INTO table_name (column1,column2,column3,...) |
向表中插入一个新行
1 | -- id是自动更新的,可以省略 |
UPDATE
UPDATE 语句用于更新表中已存在的记录。
1 | UPDATE table_name |
⚠️ 请注意 SQL UPDATE 语句中的 WHERE 子句! WHERE 子句规定哪条记录或者哪些记录需要更新。如果您省略了 WHERE子句,所有的记录都将被更新!
1 | -- 更新ID大于3的数据 |
DELETE
DELETE 语句用于删除表中的行。
1 | DELETE FROM table_name |
⚠️ 请注意 SQL DELETE 语句中的 WHERE 子句! WHERE 子句规定哪条记录或者哪些记录需要删除。如果您省略了 WHERE 子句,所有的记录都将被删除!
1 | -- 删除app_name为'',且id>3的行 |