MySQL 基础 一

数据库与关系型数据库

数据库

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,
每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。

关系型数据库

所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。

RDBMS 术语

  • 数据库: 数据库是一些关联表的集合。

  • 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。

  • 列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。

  • 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。

  • 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。

  • 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。

  • 外键:外键用于关联两个表。

  • 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。

  • 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。

  • 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

Mysql数据库

MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

安装

验证安装

1
2
luoyecs-iMac:~ luoyec$ mysqladmin --version
mysqladmin Ver 8.42 Distrib 5.7.20, for macos10.12 on x86_64

检查 MySql 服务器是否启动

1
2
3
luoyecs-iMac:~ luoyec$ ps -ef | grep mysqld
74 856 1 0 10:17上午 ?? 0:00.72 /usr/local/mysql/bin/mysqld --user=_mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --log-error=/usr/local/mysql/data/mysqld.local.err --pid-file=/usr/local/mysql/data/mysqld.local.pid --keyring-file-data=/usr/local/mysql/keyring/keyring --early-plugin-load=keyring_file=keyring_file.so
501 959 635 0 10:26上午 ttys002 0:00.01 grep mysqld

关闭目前运行的 MySQL 服务器

1
$ mysqladmin -u root -p shutdown

基础SQL语句

SELECT

SELECT 语句用于从数据库中选取数据。
结果被存储在一个结果表中,称为结果集。

1
SELECT name,country FROM Websites;

SELECT DISTINCT

SELECT DISTINCT 语句用于返回唯一不同的值, 也就是去掉列中重复值。

1
2
SELECT 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;

您也可以把 ANDOR 结合起来(使用圆括号来组成复杂的表达式)。
“Websites” 表中选取 alexa 排名大于 “15” 且国家为 “CN” 或 “USA” 的所有网站:

1
2
3
SELECT * FROM Websites
WHERE alexa > 15
AND (country='CN' OR country='USA');

ORDER BY

ORDER BY 关键字用于对结果集进行排序。

ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序。
ORDER BY 关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 关键字。

1
2
3
SELECT column_name,column_name
FROM table_name
ORDER BY column_name,column_name ASC|DESC;

选取所有网站,按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
2
INSERT INTO table_name
VALUES (value1,value2,value3,...);

第二种形式需要指定列名及被插入的值:

1
2
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);

向表中插入一个新行

1
2
3
4
5
-- id是自动更新的,可以省略
INSERT INTO Websites (id, app_name, url, country) VALUES (4, 'bilibili', 'wwww.bb.com', 'JP');

-- 只在url, country列插入数据
INSERT INTO Websites (url, country) VALUES ('wwww.bib.com', 'JP');

UPDATE

UPDATE 语句用于更新表中已存在的记录。

1
2
3
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;

⚠️ 请注意 SQL UPDATE 语句中的 WHERE 子句! WHERE 子句规定哪条记录或者哪些记录需要更新。如果您省略了 WHERE子句,所有的记录都将被更新!

1
2
-- 更新ID大于3的数据
UPDATE Websites SET country='CN' WHERE id>3;

DELETE

DELETE 语句用于删除表中的行。

1
2
DELETE FROM table_name
WHERE some_column=some_value;

⚠️ 请注意 SQL DELETE 语句中的 WHERE 子句! WHERE 子句规定哪条记录或者哪些记录需要删除。如果您省略了 WHERE 子句,所有的记录都将被删除!

1
2
-- 删除app_name为'',且id>3的行
DELETE FROM Websites WHERE app_name='' AND id>3;