简介
MySQL 全称为Relational Database Management System,是一个关系型数据库管理软件,使用 SQL 语言进行增删改查操作,属于 Oracle 旗下的产品。MySQL是目前世界上最受欢迎的开源关系型数据库管理软件,为什么有那么多的公司和开发人员使用MySQL?有以下几点原因:
- 成本——MySQL是开放源代码的,一般可以免费使用(甚至可以 免费修改)。
- 性能——MySQL执行很快(非常快)。
- 可信赖——某些非常重要和声望很高的公司、站点都用MySQL来处理自己的重要数据。
- 简单——MySQL很容易安装和使用。
数据库基础
数据库
数据库是一个以某种有组织的方式存储的数据集合。理解数据库的一种最简单的办法是将其想象为一个文件柜。此文件柜是一个存放数据的物理位置,不管数据是什么以及如何组织的。
数据库(database) 保存有组织的数据的容器(通常是一个文 件或一组文件)。
表
MySQL中的关系型可以理解成表的概念,即一个关系型数据库由一张或多张表构成。表是一种结构化的文件,可用来存储某种特定类型的数据。表可以保存顾客清单、产品目录,或者其他信息清单。这里关键的一点在于,存储在表中的数据是一种类型的数据或一个 清单。决不应该将顾客的清单与订单的清单存储在同一个数据库表中。这样做将使以后的检索和访问很困难。应该创建两个表,每个清单一个表。
数据库中的每个表都有一个名字,用来标识自己。此名字是唯一的, 这表示数据库中没有其他表具有相同的名字。
表(table): 某种特定类型数据的结构化清单。
模式
表具有一些特性,这些特性定义了数据在表中如何存储,如可以存 储什么样的数据,数据如何分解,各部分信息如何命名,等等。描述表的这组信息就是所谓的模式,模式可以用来描述数据库中特定的表以及整个数据库(和其中表的关系)。
模式(schema): 关于数据库和表的布局及特性的信息。
列和数据类型
表由列构成,列中保存着表中某部分的信息。
理解列的最好办法就是讲数据库想象成一个网格 。网格中的每一列存储这一条特定的信息。例如,在顾客表中,一个列存储着顾客编号,另一个列存储着顾客名,而地址、城市、州以及邮政编码全都存储在各自的列中。
列(column) 表中的一个字段。所有表都是由一个或多个列组成的。
数据库中每个列都有相应的数据类型。数据类型定义列可以存储的数据种类。数据类型(datatype) 所容许的数据的类型。每个表列都有相应的数据类型,它限制(或容许)该列中存储的数据。
行
表中的数据是按行存储的,所保存的每个记录存储在自己的行内。如果将表想象为网格,网格中垂直的列为表列,水平行为表行。
例如,顾客表可以每行存储一个顾客。表中的行数为记录的总数。
行(row) 表中的一个记录。
主键
表中每一行都应该有可以唯一标识自己的一列(或一组列)。一个顾客表可以使用顾客编号列,而订单表可以使用订单ID,雇员表可以使用雇员ID或雇员社会保险号。
主键(primary key)一一列(或一组列),其值能够唯一区分表中每个行。
唯一标识表中每行的这个列(或这组列)称为主键。主键用来表示一个特定的行。没有主键,更新或删除表中特定行很困难,因为没有安全的方法保证只涉及相关的行。
表中的任何列都可以作为主键,只要它满足以下条件:
- 任意两行都不具有相同的主键值
- 每个行都必须具有一个主键值(主键列不允许NULL值)
应该坚持的几个普遍任何的好习惯为:
- 不更新主键列中的值
- 不重用主键列的值
- 不在主键列中使用可能会更改的值
例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其名字时,必须更改这个主键。另外,类似于身份证号这种看起来可以唯一标识个人信息的数据也不应该用来当做主键。主键最好是要与业务分离开来,比如使用计数id,或者GUID
等。
MySQL基本介绍
本节主要从多个方面来描述MySQL的基本信息和重要特征。
底层实现和移植性
- 使用C++编写
- 在多种不同编译器上进行了完整测试
- 运行在多种不同平台上
- 为了移植性,使用
CMAKE
进行配置 - 经过商业内存泄漏检测器Purify和GPL等工具的测试
- 使用带多个独立模块的多层服务设计架构
- 被设计成能完全利用多线程,以及轻松使用多CPU
- 提供了事务性和非事务性存储引擎
- 使用了非常快的B树磁盘表(MyISAM)来进行索引压缩
- 被设计成相对容易地添加到其他存储引擎中
- 使用了一个非常快的基于线程的内存申请系统
- 使用了优化后的嵌套循环来实现
join
操作 - 实现了一个基于内存的
hash
表 - 使用了高度优化的类库来实现SQL函数
- 使用了client/server网络模式以便可以方便嵌入到独立的应用程序中
数据类型
MySQL支持许多中数据类型,包括单字节、双字节,三字节,四字节,八字节长度的无符号和带符号的整形数据。另外还支持FLOAT
, DOUBLE
, CHAR
, VARCHAR
, BINARY
, VARBINARY
, TEXT
, BLOB
, DATE
, TIME
, DATETIME
, TIMESTAMP
, YEAR
, SET
, ENUM
等。
同时还支持定长和变长的字符串类型。
语句和函数
- 支持
SELECT
列表和WHERE
查询子句中的全部运算符和函数,举个例子:
mysql> SELECT CONCAT(first_name, ' ', last_name)
-> FROM citizen
-> WHERE income/dependents > 10000 AND age > 30;
- 支持SQL全部的
GROUP BY
和ORDER BY
子句 - 支持标准SQL要求的表和列别名
- 支持
DELETE
,INSERT
,REPLACE
, 和UPDATE
以返回已更改(受影响)的行数,或返回匹配的行数,而不是通过在连接到服务器时设置标志来返回。 - 支持MySQL指定的SHOW语句来从数据库,存储引擎、表、索引中获取信息。
- 使用
EXPLAIN
语句来展示,优化器是如何解析一个查询语句的。 - 函数名称与表或者列名称的独立性
- 可以在同一条语句中引用来自不同数据库的表
安全性
MySQL具有一套特权和密码管理系统,非常灵活和安全,并且可以进行基于主机的验证。连接服务器时,通过对所有密码通信进行加密来实现密码安全。
扩展性和限制
- 支持大型数据库
使用MySQL Server的用户,最多有存在20万个用户表,大概有50亿条数据。 - 每个表最多支持64个索引
每个索引可以包含1到16列或者列的一部分。InnoDB表的最大索引宽度为767字节或3072字节。
MySQL连接
这里假设读者已经在自己的电脑上安装好了MySQL。为了连接到MySQL,需要以下信息:
- 主机名(计算机名)——如果连接到本地MySQL服务器,为localhost
- 端口(如果使用默认端口3306之外的端口)
- 一个合法的用户名
- 用户口令(如果需要)
打开终端,具体指令如下,以连接我本地的数据库为例:
(base) MacBook-Pro:bin root$ mysql -h localhost -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 32
Server version: 8.0.22 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
在最初连接到MySQL时,没有任何数据库打开供你使用。在你你能执行任意数据库操作前,需要选择一个数据库。为此可以使用USE关键字。我本地创建了名为halo
的数据库,因此我可以这样选择使用:
mysql> use halo
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
如果不知道可以使用的数据库名时怎么办?这时可以使用SHOW命令来显示这些信息,例子如下:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| girls |
| halo |
| information_schema |
| iotat |
| myemployees |
| myflixdb |
| mysql |
| performance_schema |
| personinfo |
| south |
| sys |
+--------------------+
11 rows in set (0.00 sec)
show databases;
返回数据库的一个列表。为了获取数据库内的表的列表,可以使用show tables;
mysql> show tables;
+-------------------------+
| Tables_in_halo |
+-------------------------+
| accounts_v_members |
| admin |
| beauty |
| boys |
| categories |
| departments |
| employees |
| general_v_movie_rentals |
| job_grades |
| jobs |
| locations |
| members |
| movierentals |
| movies |
| payments |
+-------------------------+
15 rows in set (0.00 sec)
也可以用来显示表列:
mysql> show columns from boys;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| boyName | varchar(20) | YES | | NULL | |
| userCP | int | YES | | NULL | |
+---------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
总结
本文介绍了数据库和MySQL的基本特性,以及如何连接和登录到MySQL,如何使用use选择数据库,如何使用show查看mysql数据库、表和内部信息。 握上面这些只会,就可以进一步学习MySQL的高阶操作了。
网友评论