这是一个易于理解的12步指南,介绍了使用MySQL的基础知识。 对于那些需要它的人来说,这是一个很棒的更新,对于初次使用MySQL的用户来说,它也很棒。
任何人都应该可以轻松解决此问题。 不需要编程知识。
指数- 什么是SQL?
- 为什么选择MySQL?
- 安装MySQL。
- 使用MySQL命令行界面
- 创建数据库
- 建立表格
- 资料类型
- CREATE TABLE命令
- 主键
- 列参数
- 插入资料
- 选择数据
- 更新数据
- 删除资料
- 删除(删除)表和数据库
- 用户创建
- CREATE USER方法
- 格兰特方法
- 礼遇
SQL,或结构化查询语言,是我们用来操纵数据库中数据的机制。 该机制基于发布命令(或语句),通常称为SQL查询。
以下示例也许(并且令人遗憾)是有史以来最常用的SQL查询。 它只是命令系统返回给定表中每一行的每一列。
SELECT * FROM tbl_name
2.为什么选择MySQL?
没有一个数据库管理系统(例如MySQL)在本质上比其他任何系统都要好。 它们全部基于相同的标准,并且大多数基本查询(例如我之前向您展示的查询)都可以在所有查询上执行。 因此,通过学习MySQL,您还将学习所有其他SQL数据库系统的基础。
但是,它们之间存在细微差异。 多年以来,作为开源的MySQL变得非常流行,尤其是在使用其他开源平台(例如PHP)的开发人员中。 它以最快的RDBMS(关系数据库管理系统)之一而闻名。 -当然,随着MySQL的更新版本及其竞争产品的发布,声明的准确性确实会有所不同。
MySQL被用于为世界上一些最引人注目的互联网服务的后端提供动力,例如Google,Wikipedia,Facebook,YouTube,Twitter等,总共有超过一千一百万的活动安装。
3.安装MySQL。安装MySQL很简单。 它是开源的,因此您可以选择下载源代码并自己编译。 但是,我建议不要这样做,因为大多数主要操作系统都存在预编译的二进制版本。
对于Windows用户,您只需下载
MS安装程序包 ,它将几乎为您处理所有事情。 您真正要做的唯一一件事就是为root用户选择一个密码。Linux用户在许多情况下也可以找到二进制软件包,但是我将由您自己决定如何在发行版中安装它。 MySQL通常随操作系统安装一起提供,因此您可能需要注意这一点。 -流行发行版(例如Debian,Ubuntu,Fedora等)的用户通常可以在其软件存储库中找到MySQL。 如果不确定是否适用于您,请尝试以下任一方法:
$ apt-get install mysql
$ yum install mysql
那通常会使您入门。
从未在Mac上尝试过,我认为它就像在Windows上一样简单。
如果所有其他方法均失败,则您始终可以下载源代码并自行构建。
4.使用MySQL命令行界面。现在,在系统上安装MySQL之后,您将需要找到通向MySQL CLI(命令行界面)的方法,您可以使用该方法执行SQL查询。
在Windows上,它将位于“所有程序”菜单中的“ MySQL”下。
在Linux上,您应该能够简单地在终端中键入“ mysql”。
Mac也是如此。
打开CLI后,您将需要输入root密码。 这是在安装过程中配置MySQL时指定的密码。 那是; 这是提供给root用户的密码。
与在Unix上一样,root用户可以访问系统的所有区域。 永远不要使用它来做普通用户可以做的任何事情。 在可以使用普通用户的情况下使用root用户是一个重大的安全隐患,这是从老板那里打耳光的肯定方法!
(有关如何创建用户的信息,请参见第12章 。 ) 5.创建数据库。数据库基本上是数据表的集合。 -每个表都由一列或多列组成,这些列定义了要存储的数据。 -实际数据在表中存储为行,每一行包含表中每一列的数据字段。 (就像您在电子表格应用程序(例如Excel)中看到的一样。)
MySQL默认带有一组数据库。 我们可以发出一个命令,向我们显示用户有权访问的所有数据库。 当我们以root身份登录时,我们将看到所有数据库。
该命令很简单:
SHOW DATABASES;
这应该输出如下内容:( 这可能会因您的OS和MySQL设置方法而异)
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
这三个数据库通常是由MySQL安装程序默认创建的。
前两个,即“ information_scheme”和“ mysql”,除非您知道自己在做什么,否则请不要搞乱。
它们用于存储MySQL本身生成的MySQL使用的信息,例如用户信息和表布局。
另一方面,第三个“测试”应该弄混了。 那是目的。
但是,我们将不会使用其中任何一个。 我们将创建自己的数据库。 这是通过一个非常简单的命令完成的:
CREATE DATABASE new_db;
其中“ new_db”是我们的数据库的名称。
现在,要使用我们的新数据库,我们将必须在所有SQL查询中包括它的名称,以便MySQL可以利用我们正在使用的数据库。
SELECT * FROM new_db.some_table;
但是,由于这样做可能非常麻烦,非常快,因此MySQL CLI向我们提供了USE命令。
该命令告诉MySQL CLI客户端我们要使用给定的数据库,因此我们可以将其排除在SQL查询之外。
(排序就像到另一个国家一样,以避免在打电话时必须先拨打国家代码。)
USE new_db;
我们可以这样重写先前的查询:
SELECT * FROM some_table;
6.创建表
就像我前面提到的那样,每个数据库都包含许多表。 与数据库一样,我们可以发出命令以查看给定表中所有可以访问的表。 这基本上是相同的命令,只是参数改变了:
SHOW TABLES;
由于我们尚未创建任何表,因此不会输出任何内容。
请记住,通过从前使用USE命令,我们避免了必须指定我们要使用的数据库。 如果您没有使用该命令,或者想要查看另一个数据库的表,则可以将数据库名称添加到SHOW TABLES命令:
SHOW TABLES FROM new_db;
6(a)数据类型
在开始创建表之前,必须了解每一列可以具有的基本数据类型。 这绝不是一个完整的列表,顺便可以找到
在这里 。- 布尔 –此字段只能包含两个值之一,即1或0。它们也可以称为TRUE或FALSE(0为FALSE)。
- INT –这是一个整数类型,包含非小数数字。 有几种不同的大小,从'TinyInt'到'BigInt'。
- 双精度型 -这也是一个数字值,但该数字允许小数。
- 十进制 -由于数学上的限制,DOUBLE类型的小数部分并不总是完全准确。 但是,DECIMAL类型用于存储100%准确的分数。 存储货币价值的理想选择。
- DateTime –这是日期和时间的特殊字段。 通常使用NOW()函数填充此类型的字段。 请注意,也可以通过简单地分隔两个单词并留下所需的单词来创建包含日期或时间的字段。
- Char(n) –这是一个字符串。 n表示该字段将包含的字符数。 您可以指定的最大字符数为255。即使您提供的字符数少于n所指定的字符数,该字段也将始终存储n个字符,并且随后将占用n个字符将占用的磁盘空间。 在那些情况下,未填充的字符插槽将被填充空白。 (MySQL自动为您添加和删除它们,因此不必担心。)
- VarChar(n) –与Char类型一样,这是一个字符串。 它们之间的区别在于,此处的n表示允许的最大字符数。 您可以指定的最大字符数为65,535。 如果您提供的字符数少于n指定的数目,MySQL将自动减小该字段的大小以匹配提供的字符数,从而节省磁盘空间。
- 文本和Blob –用于大量的二进制(Blob)或字符串(Text)数据。 两者之间的区别在于Blob被视为原始二进制数据,而Text被视为具有设置字符集的字符串。 -有四种尺寸。 默认情况下,这些字段可以容纳64 KiB的数据。 您可以为它们添加Tiny,Medium或Large前缀,以分别将其修改为256个字节,16 MiB和4 GiB。 (请注意,您的系统可能会限制可以存储的实际数量,例如,如果您使用的是32位Windows或FAT文件系统。)
创建表的命令比到目前为止我们看到的简单命令要复杂一些。 (点击
在这里看到完整的定义)CREATE TABLE tbl_name
(
Col1Name Col1Type <parameters>,
Col2Name Col2Type <parameters>,
…
ColNName ColNType <parameters>,
PRIMARY KEY(col1, col2, …, col16)
);
在这里,我们有命令“ CREATE TABLE tbl_name”,然后是要在表中封装的要创建的列的列表,并用逗号分隔。
每个列都有一个参数列表。 第一个是它的名称,第二个是它的数据类型,然后是其他选项列表。
这些选项用于各种原因。 如表示一列是主键,或者它将不接受NULL值或定义默认值。 清单继续。
6(c)主键列列表的最后一行为我们带来了一个非常重要的概念; 主键。 每张桌子
应该有一个或多个定义为主键的列。主键对于每一行必须具有唯一的值,因为其主要目的是从其余行中识别出一行,即使表中的每个其他字段都包含相同的数据也是如此。 最好将“主键”列定义为整数,因为它们可以自动递增,并且已知比其他类型更快地工作。 但是,可以将其他数据类型定义为主键,但这只能在特殊情况下进行。
6(d)色谱柱参数这些是一些常用且经常使用的列参数:
- 主键 –标识表的主键。 请注意,此参数不能用于多列! 使用上面的CREATE TABLE定义中建议的语法来定义多个主键。
- 唯一 -确保此列的每一行都有唯一的值。 在许多方面,这类似于主键,但不限于每个表中的一列。 -两者之间的差异主要是象征性的,因为它们的行为几乎相同。
- Not Null –表示该列不接受NULL。 -NULL仅表示:“无值”。 -通常将其与“ 空值 ”(例如空字符串或数字0)混淆,但就定义而言,即使是空值也是一个值。 -实际的区别是不能将NULL作为值进行比较(使用=和<>等运算符)。 要测试NULL,必须使用IS NULL或IS NOT NULL。
- Auto_Increment –与数字列一起使用。 这基本上意味着默认值列是以前使用的最大值+1。 请注意,即使您删除表中的每一行,此值也不会重置。
- 无符号 -这将有效地使整数字段的最大大小加倍,但是结果是它不能接受负值。 非常适合ID等。
- 默认值 –这指定列的默认值。 请注意,某些字段(Blob,Text和DateTime类型)不能具有默认值。 最好在大多数列中都包含此内容,除非您有理由不这样做。 这样做可以允许INSERT查询在需要时跳过那些列。 (请参阅第7章。)
- 引用tbl(col) –这将在指定列和新列之间创建外键约束。 那是; 它将此列链接到另一个表中的列,因此无法将目标表中不存在的值插入该表中。 -请注意,MyISAM表当前忽略此设置。
现在,让我们创建几个表。 假设我们想将有关虚拟用户组的信息存储在我们应该创建的虚拟网站上。
我们希望存储有关用户的基本信息,例如user_name和password。 存储更多个性化信息(例如名字和姓氏以及出生日期)也将是一件好事。
为此,我们创建了一个“用户”表,其中包含要收集的每条数据的列。
我们还需要一些联系信息。 为此,我们创建了一个单独的表“ user_contact”,其中包含它自己的主键和一个引用“用户”表的主键的外键。 这通常称为一对多关系(1:N),这意味着每个用户都可以链接到“ user_contact”表中无限制(或直到磁盘空间用完)的行数。
我们可以使用以下两个命令创建这两个表:
每个命令以分号(;)结尾CREATE TABLE user
(
user_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
user_name VARCHAR(255) NOT NULL UNIQUE,
joined DATETIME NOT NULL,
password CHAR(40) NOT NULL,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
date_of_birth DATE Not Null,
PRIMARY KEY (user_id)
);
CREATE TABLE user_contact
(
contact_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
user_id_fk BIGINT UNSIGNED NOT NULL REFERENCES user(user_id),
contact_label VARCHAR(255) NOT NULL DEFAULT 'Email',
contact_value VARCHAR(255) NOT NULL,
PRIMARY KEY (contact_id)
);
7.插入数据。
现在我们有了数据库和几个表,让我们插入一些数据。
为此,我们使用“ INSERT INTO”命令。
(点击
这里是一个完整的定义)INSERT INTO tbl_name
(col1, col2,…, colN)
VALUES
(v11, v12, …, v1N),
(v21, v22, …, v2N),
…
(vN1, vN2, …, vNN);
如您所见,我们指定表名以及该表中要插入数据的每一列。
然后,我们封装要输入的数据,并将其放在VALUES子句之后。
请注意,您可以一次插入多个行,只需简单地将它们依次添加并用逗号分隔即可。
因此,要将一些数据插入我们的假想用户表中,我们可以执行以下操作:
INSERT INTO user
(user_name, password, joined, first_name, last_name, date_of_birth)
VALUES
('Atli', SHA('MyPass'), NOW(), 'Atli', 'Jónsson', '1986-09-05'),
('Johnny', SHA('Insane'), NOW(), 'John', 'Doe', '200-07-07');
/* Email for user 'Atli' */
INSERT INTO user_contact
(user_id_fk, contact_label, contact_value)
VALUES
(1, 'Email', 'me@myself.i');
/* Phone for user 'Johnny'*/
INSERT INTO user_contact
(user_id_fk, contact_label, contact_value)
VALUES
(2, 'Phone', '5885566');
请注意,SHA()函数创建了一个40字符长的加密字符串,该字符串无法解密(“哈希”)。
出于安全原因,密码应始终存储为哈希。
8.选择数据。
最后,我们的数据库中有一些数据!
如果只有一个命令可以向我们显示该数据。 但是等等...有!
SELECT命令正是这样做的。 它根据传递的参数选择行,并返回它认为有价值的所有行。
以下只是可能的SELECT语法的一小部分。
可选子句封装在[]括号中。(点击
这里是一个完整的定义)SELECT colums
FROM table
[WHERE (boolean expressions)]
[ORDER BY colums]
[GROUP BY colums]
[LIMIT start [, count]]
因此,要从虚拟用户表中查看所有虚拟用户,我们可以这样做:
/* Show all users */
SELECT *
FROM user;
/* Show specific data for a specific user */
SELECT first_name,
last_name
FROM user
WHERE user_name = 'Atli';
/* Show the last user */
SELECT *
FROM user
ORDER BY user_id DESC
LIMIT 1;
要查看用户联系信息,我们可以这样做:
/* Show for user_id=1 */
SELECT contact_label AS 'Lable',
contact_value AS 'Value'
FROM user_contact
WHERE user_id_fk = 1;
/* This is a more complex way
* to do the same, by joining the
* two tables */
SELECT contact_label AS 'Lable',
contact_value AS 'Value'
FROM user_contact
INNER JOIN user
ON user.user_id = user_contact.user_id_fk
WHERE user.user_name = 'Atli';
9.更新数据。
假设我们的朋友约翰尼(Johnny)喝醉了,不小心在额头上刺了他的密码。 现在,这将构成一个安全线程,您不觉得吗?
我们需要做的就是更改他的密码!
但是,等等……这是否意味着我们需要删除数据库并重新开始?
没有! 幸运的是,对于约翰尼,我们拥有“ UPDATE”命令,可用于更新他的密码。
(点击
这里是一个完整的定义)UPDATE table
SET
field1 = value1,
field2 = value2,
…
fieldN = valueN
[WHERE (boolean expressions)]
[LIMIT amount]
因此,要更改约翰尼的密码,我们可以这样做:
UPDATE user
SET password = SHA('NewPassword')
WHERE user_name = 'Johnny'
LIMIT 1;
请注意,我使用了LIMIT子句,所以我不会意外地更新表中的每个密码。
(老实说,这些错误实际上已经杀死了人们!) 10.删除数据。
现在我们进入一个危险的话题。 删除东西!
像约翰尼 他刚刚变得烦人,我们决定他必须离开。
然后,我们将需要“删除”命令。
(完整定义
在这里 )DELETE FROM table
[WHERE (boolean expressions)]
[LIMIT amount]
由于这不是您要弄乱的命令,因此请尽可能使用LIMIT CLAUSE。
对于我们的朋友约翰尼,命令如下所示:
DELETE FROM user_contact
WHERE user_id_fk = 2;
DELETE FROM user
WHERE user_id = 2
LIMIT 1;
现在,如果我们要打扫房间并删除所有内容,则有两个选择。
我们可以只使用最基本的'DELETE'命令,也可以使用特制的'TRUNCATE'命令,这是首选方法。
/* Using the DELETE command */
DELETE FROM user;
/* Using the TRUNCATE command */
TRUNCATE user;
两者都使表完全为空,但是'TRUNCATE'命令重置所有'Auto_Increment'字段,而'DELETE'命令则不会。
11.删除表和数据库
既然我们的假想表已经达到目的,为什么不删除它们呢?
与删除数据不同,删除表和数据库称为“删除”它们。
直观地讲,我们为此所需的命令称为“ DROP”。 有两种版本,一种用于删除数据库(DROP DATABASE),另一种用于删除表(DROP TABLE)。
DROP DATABASE dbName;
DROP TABLE dbName.tbl_name;
因此,要完成我们的数据库,我们可以这样做:
DROP DATABASE new_db;
/* or if you want to delete the tables first */
DROP TABLE new_db.user;
DROP TABLE new_db.user_contact;
DROP DATABASE new_db;
12.用户创建。
现在我们知道如何操作数据库了,我们需要开始考虑
我们允许谁访问它。到目前为止,我们一直在使用
root用户执行我们的查询。 如前所述,这并不是一件非常安全的事情,尤其是当我们开始在其他应用程序(例如网站)中使用这些查询时。的
超级用户有权访问整个数据库系统,并且能够执行他想对它进行的任何操作。现在,如果有人掌握了您的应用程序代码并偷走了密码怎么办?
该小偷可以完全访问他想要对您的数据执行的任何操作。
为了防止这种情况,我们创建
受限用户 ,仅允许访问特定的数据库或表,并且只能执行特定的命令。我们可以创建一个仅具有在特定数据库上执行SELECT,INSERT和UPDATE命令的权限的用户,这样,如果用户密码被泄露,整个数据库就不会受到威胁。
有两个命令可用于创建用户:GRANT和CREATE USER。
12(a)赠款这是创建用户的首选方法。 它适用于所有MySQL版本。
它允许我们指定允许用户执行的命令,还允许我们指定用户有权访问的数据库甚至表。
GRANT <privileges>
ON database.table
TO 'User'@'location'
IDENTIFIED BY 'Password';
查询的<privileges>部分是您指定用户有权访问哪些命令的地方。
用户不能使用任何未指定的命令。
(有关特权列表,请参见第12(c)章)
下一部分,ON子句,指定用户有权访问的数据库或表。
您可以使用通配符char(*)来授予用户访问一系列表的权限。 例如,执行“ *。*”将使用户可以访问所有数据库(过去,现在和将来)中的所有表。
执行“ dbName。*”将授予名为“ dbName”的数据库上所有表(过去,现在和将来)的用户特权。
TO子句指定用户名和用户可以连接的位置。
该位置可以是域名或IP地址,并且可以包含通配符(%)。
例如,('John'@'192.168.%.%')将允许名为'John'的用户从典型本地网络上的任何计算机进行访问。 如果仅指定通配符('John'@'%'),它将允许用户从任何地方进行连接。
12(b)创建用户创建一个无权访问的用户。 该用户只能登录,没有其他权限。
注意,该方法不适用于MySQL 4及更早版本。CREATE USER 'user_name'@'location' IDENTIFIED BY 'Password';
7(c)特权
这些是我们允许用户在我们指定的表上执行的命令。
我们未指定任何命令,用户将无法执行。
这与完整的命令集相去甚远:(您可以找到完整的列表
在这里 )- SELECT –用于选择数据(请参阅第8部分)
- INSERT –用于插入数据(请参阅第7部分)
- UPDATE –用于更新数据(请参阅第9部分)
- DELETE –用于删除数据(请参阅第10部分)
- 创建 -用于创建表,数据库等。
- TRUNCATE –用于从表中完全清除所有数据。
- ALL –用于授予用户ALL特权。 这将为用户提供对指定表的“类root”特权。
因此,让我们创建一个能够将数据选择和插入到每个数据库的所有表中的用户。
并允许他从任何地方进行连接。
GRANT SELECT, INSERT
ON *.*
TO 'John'@'%'
IDENTIFIED BY 'MyPassword';
这将是一个相当安全的用户。
他将无法删除或编辑任何现有数据或表,而只能查看并添加新数据。
最后!
好吧,对于那些做到这一点的人。 做得好!
希望这对您有所帮助,并祝您一切顺利。
再见!
-AtliÞór
From: https://bytes.com/topic/mysql/insights/738857-mysql-basic-tutorial