学习在开源数据库管理系统MySQL中使用基本SQL命令,MySQL查询(命令)不区分大小写,但是,通常的做法是将ALL CAPS用于实际的命令关键字,将小写用于其余的。
连接到MySQL服务器和从MySQL服务器断开连接 安装数据库请参考在Ubuntu 18.04/16.04命令行上安装MySQL 8.0.11的全过程。 为了能够输入查询,您首先必须使用MySQL连接到服务器并使用MySQL提示符,执行此操作的命令是: mysql -h host_name -u user -p -h用于指定主机名(如果服务器位于另一台机器上,如果不是,则只省略它),-u提及用户,-p指定要输入密码。 虽然不推荐(出于安全原因),但您可以直接在命令中输入密码,方法是在-p之后输入密码。例如,如果test_user的密码是1234,并且您尝试在正在使用的计算机上进行连接,则可以使用: mysql -u test_user -p1234 如果您成功输入了所需的参数,那么您将受到MySQL shell提示符(mysql>)的欢迎:
要断开与服务器的连接并离开mysql提示符,请输入: QUIT 输入quit(MySQL不区分大小写)或\q也可以,按Enter退出。 您还可以使用简单的命令输出有关版本的信息: sudo mysqladmin -u root version -p 注意:在输入我要覆盖的任何查询之前,请确保已连接到服务器。 如果要查看选项列表,请使用: mysql --help
在MySQL中使用查询 MySQL将数据存储在表中并使用称为查询的命令(SQL=结构化查询语言),在深入研究存储,访问和修改数据之前,我将介绍基本查询,以便您掌握它。 由于MySQL使用表,查询的输出也将显示在表中。所有SQL语句都应该跟一个分号(;),尽管有例外(最值得注意的是:QUIT),您可以使用逗号(,)分隔列,以下是一些基本示例: mysql> SELECT VERSION(); mysql> SELECT CURRENT_DATE; mysql> SELECT VERSION(), CURRENT_DATE; 例如,第三个查询将打印出与此类似的内容:
由于分号(;)标记语句的结尾,因此您还可以在一行上编写多个语句。 例如,而不是: mysql> SELECT VERSION(); mysql> SELECT CURRENT_DATE; 你也可以这样写: mysql> SELECT VERSION(); SELECT CURRENT_DATE; 您还可以输入多行查询(如果在按Enter键之前未在行尾包含分号),在这种情况下,MySQL将只是输入一个不同的提示,让你继续你的命令,例如: mysql> SELECT -> VERSION() -> , -> CURRENT_DATE; 如果你没有在一行(一个被'或'包围的单词)上结束字符串,也会出现多行查询。 如果要取消查询,请键入\c并按Enter键。 有提示具有不同的含义: mysql> =准备好进行新查询。 -> =等待多行查询的下一行。 '> =等待下一行,等待以单引号(')开头的字符串的完成。 “> =等待下一行,等待以双引号(”)开头的字符串的完成。 `> =等待下一行,等待以反引号(`)开头的标识符的完成。 /*> =等待下一行,等待以/*开头的评论完成。 您还可以使用NOW()以及使用USER()连接的用户打印当前时间(hh:mm:ss)和当前日期: mysql> SELECT NOW(); mysql> SELECT USER(); 这将输出类似于此的内容:
MySQL还允许您计算数学计算: mysql> SELECT COS(PI()/3), (10-2+4)/3; 输出:
在MySQL中使用数据库 1.获取有关数据库的信息 首先,您可以列出可用的数据库: mysql> SHOW DATABASES; 您还可以使用以下命令查看所选数据库: mysql> SELECT DATABASE(); 如果没有选择数据库,这将输出NULL,以下是两个提到的语句的示例输出:
2.创建数据库 只需输入命令即可完成此操作: mysql> CREATE DATABASE example_db; 注意:在Ubuntu 18.04(或任何其他基于Unix的系统)中,数据库和表名称区分大小写。 3.选择数据库 要选择数据库,您必须提到要使用它: mysql> USE example_db; 如果成功,您将收到消息: Database changed 如果不成功,您将收到一条错误消息,告诉您MySQL无法找到指定的数据库。 您还可以通过在connect命令末尾提及现有数据库的名称来连接到服务器时选择数据库: mysql -h host_name -u user_name -p example_table 例如: mysql -u root -p example_table
在SQL中使用表 1.获取有关表的信息 要列出当前数据库中的表,请使用: mysql> SHOW TABLES; 注意:确保选择了数据库。 如果数据库为空(例如,新创建的),则输出将为: Empty set (0,00 sec) 创建表后,输出将沿着以下行:
2.创建表格 要创建表,您必须指定布局 - 列和应存储的数据类型。 在我的例子中,我将存储有关一群人的信息:姓名,出生日期,性别,国家。这是我如何创建该表: mysql> CREATE TABLE table_1 (name VARCHAR(30), birth_date DATE, sex CHAR(1), country VARCHAR(40)); 注意:您也可以在多行上编写命令。 您可以看到我提到了表名(table_1)和列名(name,birth_date,sex,country),在列名之后,我指定了它们存储的数据类型,VARCHAR(n)是长度最多为n个字符的字符串,DATE是不言自明的(CCYY-MM-DD格式),CHAR(1)表示单个字符(具体来说,我打算使用'm'和'f '对于男性和女性),其他常见类型包括INT(整数),BOOL(布尔值),TIME(hh:mm:ss),MySQL中有许多可用的数据类型(数字,字符串,日期和时间),您还可以使用更复杂的数据类型,例如AUTO_INCREMENT。 如果您显示表格,现在将显示该表格。 如果您愿意,可以使用ALTER TABLE修改表的布局: mysql> ALTER TABLE table_1 ADD email VARCHAR(50); mysql> ALTER TABLE table_1 DROP birth_date; 这些示例添加了一列(第一个示例)并删除了一列(第二个示例),您可以在此处查看有关ALTER TABLE的更多信息,因为它还具有更高级的用途。 3.描述表格 您可以随时查看表格的结构: mysql> DESCRIBLE table_name; 例如: mysql> DESCRIBE table_1; 将要输出:
4.删除表格 删除表的声明是: DROP TABLE table_name; 5.将数据插入表中 要插入数据,您必须指定要在每列中引入的值(与表定义中的顺序相同),对于空值或未知值,您应该使用NULL,确保带引号(')或双引号(“)的非数字值,值应以逗号(,)分隔, 以下是例子: mysql> INSERT INTO table_1 VALUES ('Smith', '1980-04-24', 'm', 'Argentina'); mysql> INSERT INTO table_1 VALUES ('Emily', '1994-07-19', 'f', NULL); 6.清空表格 如果要清空表(删除所有条目),请使用: DELETE FROM table_name; 使用WHERE,您可以删除特定的行: DELETE FROM table_name WHERE col_name = value 我将在以下部分进行更深入的介绍。 7.更新表条目 更新条目的语法是: UPDATE table_name SET col = 'value' WHERE conditions 例如: UPDATE table_1 SET country = 'France' WHERE name = 'Emily' 如果未指定条件,则将更改所有条目。 8.从表中检索数据 用于从表中提取数据的MySQL命令是SELECT,这种陈述的结构是: SELECT what FROM where WHERE conditions; 我将介绍一些常见的应用程序,以便您了解如何从数据库中精确提取所需内容。 a.选择所有数据 首先,最简单的用法是显示表中的所有数据,例如: mysql> SELECT * FROM table_1; 通配符(*)代表一切,table_1是我正在提取的表,你可以看到我省略了WHERE部分,为所选数据提供条件是可选的。 b.选择特定数据 首先,我将继续选择行。 要选择特定行,您必须指定缩小数据范围的条件: mysql> SELECT * FROM table_1 WHERE name = 'Smith'; mysql> SELECT * FROM table_1 WHERE sex = 'm'; mysql> SELECT * FROM table_1 WHERE birth_date < '1990-1-1'; mysql> SELECT * FROM table_1 WHERE sex = 'f' AND birth_date > '1991-1-1'; mysql> SELECT * FROM table_1 WHERE sex = 'm' OR country = 'France'; mysql> SELECT * FROM table_1 WHERE country IS NOT NULL; 在前两个示例中,我只是比较字符串(不区分大小写),您还可以将日期和整数等值与比较运算符(>,<,> =,<=,=)进行比较,<>用于表示'不相等',您可以使用逻辑运算符(AND,OR)指定多个条件,AND的优先级高于OR,在具有更复杂的条件时最好使用括号。 IS NOT NULL是一种仅显示没有指定列值的行的方法,您不能将算术比较运算符与NULL一起使用,因为它表示缺少值(结果也只是NULL),您应该使用IS NULL和IS NOT NULL。 NULL和被视为FALSE,其余为TRUE。 现在我将介绍显示特定列。 为此,您必须指定要显示的列,以逗号分隔,例如: mysql> SELECT name, birth_date FROM table_1; 您还可以摆脱重复数据,例如,如果我想获得所有出生日期(如果多个人在该日出生,则多次获得相同的值),我将使用: mysql> SELECT DISTINCT birth_date FROM table_1; 这只会显示DISTINCT结果。 为了更具体,您可以将特定列与条件(WHERE)结合使用: mysql> SELECT name, sex FROM table_1 WHERE country = 'France' AND birth_date < '1991-1-1'; C.排序数据 要对数据进行排序,请使用ORDER_BY: mysql> SELECT name FROM table_1 ORDER BY birth_date; 您可以看到我将其与选择特定数据相结合,上面的命令将显示所有条目的名称,按出生日期的升序排序。 您也可以按降序排序: mysql> SELECT name FROM table_1 ORDER BY birth_date DESC; 排序可以应用于多个列,例如,要按出生日期降序排序,并按名称按升序排序同一天出生的人,我会使用: mysql> SELECT name FROM table_1 ORDER BY birth_date DESC, name; d.操纵日期 您可以使用CURDATE()获取当前日期,使用这个和另一年,您可以使用TIMESTAMPDIFF()计算差异(例如,获得一个人的年龄): mysql> SELECT name, birth_date, CURDATE(), -> TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) AS age -> FROM table_1 ORDER BY age; 以下是exampletable_1的输出:
TIMESTAMPDIFF()将用于结果(YEAR)的单位和用于计算差异的两个日期(birth_date,CURDATE())作为参数,AS(别名)关键字命名结果列并使其易于使用(在此示例中:按年龄排序)。 要引用日期的特定部分,可以使用日期作为参数来使用YEAR(),MONTH()和DAYOFMONTH(),例如: mysql> SELECT name, birth_date, MONTH(birth_date) FROM table_1; 您可以像普通数字一样比较结果(月,年,日),但是,要将这些内容与下个月的内容进行比较,您不能简单地添加到CURDATE(),因为这可能会导致您检查第13个月或其他此类无意义,解决方法是INTERVAL和DATE_ADD(): mysql> SELECT name, birth_date FROM table_1 WHERE MONTH(birth_date) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH)); 您还可以使用模运算符(MOD): mysql> SELECT name, birth_date FROM pet WHERE MONTH(birth_date) = MOD(MONTH(CURDATE()), 12) + 1; 使用无效日期将返回NULL并生成警告,如下所示: mysql> SHOW WARNINGS; e.使用模式匹配 在MySQL中,_代表任何单个字符,%代表0+字符和模式(默认情况下)不区分大小写,使用模式而不是=和<>,你应该使用LIKE和NOT LIKE: mysql> SELECT birth_date FROM table_1 WHERE name LIKE '%a%'; mysql> SELECT birth_date FROM table_1 WHERE name LIKE '%b'; mysql> SELECT birth_date FROM table_1 WHERE name LIKE 'c%'; mysql> SELECT * FROM table_1 WHERE name LIKE '___'; 这些示例选择名称包含“a”(第一个示例)的条目的出生日期,以“b”结尾(第二个示例)或以“c”开头(第三个示例),最后一个示例选择名称恰好包含三个字符的行(三个“_”实例)。 您还可以使用扩展正则表达式,REGEXP_LIKE()(还有REGEXP和RLIKE运算符),不过正则表达式超出了本文的范围。 F.计算结果 计数数据很重要,在现实世界中有很多用途,MySQL使用COUNT()执行此类任务,最简单的例子是计算表的条目: mysql> SELECT COUNT(*) FROM table_1; 您还可以在组之间拆分计数,例如,我可以GROUP BY国家/地区并显示每个国家/地区的条目数: mysql> SELECT country, COUNT(*) FROM table_1 GROUP BY country; 您可以通过输入更多列来分组来提及更具体的组,例如: mysql> SELECT country, sex, COUNT(*) FROM table_1 GROUP BY country, sex; 这些结果也可以与WHERE一起使用以缩小输出。 计数时要小心,如果除了COUNT()之外还指定了要打印的其他内容,并且在GROUP BY之后没有提及这些列,则可能会出现错误或意外结果(请参阅ONLY_FULL_GROUP_BY)。 G.使用多个表 这是您可能希望在稍微复杂的上下文中执行的操作。 例如,假设给某人参加会议。 您可以显示这些表中的人员在参加会议时的年龄: mysql> SELECT table_1.name, TIMESTAMPDIFF(YEAR, birth_date, date) AS age, meeting FROM table_1 INNER JOIN table_2 ON table_1.name = table_2.name; 这将输出如下内容:
我会尝试解释语法,对于name,我们不得不提到table_1.name和table_2.name,因为该列存在于两个表中(对于birth_date,date和meeting,我们不需要指定表,因为它们对于其中一个是唯一的),这使用了我已经涵盖的语句。 有趣的是这个: FROM table_1 INNER JOIN table_2 ON table_1.name = table_2.name; INNER JOIN将表放在一起并获取具有共同点的行,由关键字ON指定的条件,在这种情况下,名称匹配。 注意:您也可以将自己的表放在一起,也许比较两个SELECT结果。
在MySQL中使用批处理模式 另一个简洁的功能是批处理模式,您可以将语句放在文件中并执行它们,而不是交互式shell: mysql -h host_name -u user_name -p < batch_file 然后,系统将提示您输入密码(如果用户需要),如果要继续运行而不是停止错误,请使用-force。 您甚至可以将输出重定向到另一个程序或文件: mysql -h host_name -u user_name -p < batch_file | less mysql -h host_name -u user_name -p < batch_file > output_file 您还可以使用带-v参数的-t或echo输出获得交互式输出。 如果您在交互式MySQL shell中并且想要运行脚本,请使用以下两种方法之一: mysql> source batch_file; mysql> \. batch_file;
结语 在本文中,我介绍了将MySQL与基本SQL命令配合使用、使用MySQL处理表格数据库的不同方法,甚至可以深入研究更高级的功能。
相关主题 |