前面我们已经讲述了,登录时,我们使用mysql –u root –p命令进行,此时如果设置了密码,则需要输入密码。

输入密码后即进入MySQL的操作界面,此时,命令行窗体左侧显示“mysql>”表示此时可接受mysql命令。

  • (1)列出全部数据库命令

我们使用“show databases;”命令列出当前MySQL管理的全部数据库。(注意:mysql命令以英文;为结束符)。

这里可以看到,目前mysql管理的数据库共有4个。

  • (2)切换数据库

我们可以在上述显示的4个数据库中进行切换,表示当前所使用的是哪个数据库。我们使用“use”+数据库名进行数据库切换。如

  • (3)列出当前数据库下全部表

我们使用“show tables;”命令,列出当前数据库下全部表名称,如

  • (4)创建一个数据库。

使用“create database”+数据库名,来创建一个新的数据库。如,按本节开始的例子,我们创建一个名为“db_edu_sys”的数据库,并切换至该数据库。

从提示信息上我们看到,我们成功创建了名为“db_edu_sys”,并将当前数据库切换至该数据库。

  • (5)向数据库中添加表。

我们使用SQL语句“CREATE TABLE”命令进行添加表的操作。

例如,上述例子中,我们建立教师表(Teacher),可以写成如下SQL语句

CREATE TABLE teacher(ID int auto_increment primary key,t_name varchar(30),t_title varchar(50));

这时,我们再查看数据库中的表,可以看到新建立的教师表(teacher)。

  • (6)导入sql文本

有时,对多条SQL语句进行操作时,我们一条一条的写入不是很方便,尤其是在有事务操作和结构化语句时,就更加困难,因此,我们可以将SQL语句事先写好,保存在文本中,然后一次性导入到数据库中,我们使用如下命令对sql文本进行导入。

“source ”+文本文件

如source c:/createtable.sql

(如果不写路径名,则默认为当前路径,即执行“mysql –u root –p”时前面显示的路径。)

我们将学生表、课程表、选课表、教学表写到一个sql文本中,一次导入。这个文本我们命名为createtable.sql,其内容如下:

CREATE TABLE student(ID int auto_increment primary key,s_name varchar(30),s_class varchar(50));

CREATE TABLE course(ID int auto_increment primary key,c_name varchar(30),c_credit varchar(50));

CREATE TABLE teaching(ID int auto_increment primary key,t_ID int,c_ID int);

CREATE TABLE selection(ID int auto_increment primary key,s_ID int,c_ID int);

我们运行导入,结果如下:

  • (7)查看表结构

我们可以通过“DESCRIBE”+表名,来查看某一张表的表结构,如执行“DESCRIBE teacher”结果如下

  • (8)添加数据

向表内添加数据要使用SQL语句“INSERT INTO”,如,我们要向teacher表中添加一条教师的信息,可以写成如下形式:

INSERT INTO teacher(t_name,t_title) VALUES('张老师','副教授');

执行后,如下

  • (9)查询数据

我们通过SQL语句“SELECT … FROM … WHERE …”进行查询,其中“SELECT”后面是要查询的字段名称,可以多个,也可以用“*”,表示查询全部字段,“FROM”后面是要查询的表名,“WHERE”后面是查询条件,支持“AND”和“OR”的组合。

查询条件中,运算符号可以为“=”(等于),“>”(大于),“<”(小于),“LIKE”(类似于),“<>”(不等于)等,请按照实际情况进行书写。比如,我们要查询出所有姓名不等于空的教师的信息,可以使用如下SQL语句:

SELECT * FROM teacher WHERE t_name <> '';

  • (10)删除数据

我们使用SQL语句的“DELETE FROM…WHERE”进行数据删除操作。例如,删除ID为1且姓名为张的老师

DELETE FROM teacher WHERE t_name LIKE '张%' AND ID = 1;

  • (11)修改数据

我们使用SQL语句“UPDATE [tablename] SET … WHERE …”来进行修改数据操作,例如,将ID为2的老师姓名改为“王志超”可以写作

UPDATE teacher SET t_name='王志超' WHERE ID=2;

  • (12)导出数据

我们使用“SELECT … FROM [tablename] INTO OUTFILE …”进行数据导出,例如,使用如下语句进行数据导出操作:

SELECT * FROM teacher INTO OUTFILE "E:/mysql-8.0.23/teacher.txt";

执行结果如下

得到的文件teacher.txt内容如下:

  • (13)数据库备份与恢复

使用mysqldump对MySQL进行备份。(注意:mysqldump是一个可执行程序,请直接在命令行下运行,不要进入mysql控制台后再运行)

例如,使用下面的命令对指定的数据库进行备份。

mysqldump -uroot -p123456 db_edu_sys > "E:/mysql-8.0.23/db_edu_sys.sql"

将“db_edu_sys”数据库备份至“E:/mysql-8.0.23/db_edu_sys.sql”文件中,执行后如下图所示

这里会出现一个警告:在命令行上使用密码是不安全的。但是,命令已经执行完毕了,我们到对应的文件夹下可以看到备份出来的文件。部分内容如下:

即表明已经备份成功。

恢复数据库时,导入备份文件(参看本节第(6)点)即可,我们进入mysql命令行状态,输入下列语句即可恢复数据:

 USE db_edu_sys

SET SQL_LOG_BIN=0;

source "E:/mysql-8.0.23/db_edu_sys.sql";
  • (14)事务

我们来讨论下数据库中一个比较重要的概念——事务,这在数据操作时会经常遇到。

我们将上述5个数据表内容进行了填充,将教师表、学生表、课程表、教学表、选课表内容进一步充实,每个表中都存在了数据。

考虑这样一种情况,有一门课程(例如:课程ID:1,课程名称:高等数学),已被教师(教师ID:2,教师姓名:王志超)领取了教学任务,同时,该课程被学生(学生ID:1,学生姓名:李晓军)选课。由于一些原因,我们准备删除这门课程,那么,我们怎么删除才能保证数据的一致性呢?

如果要删除这门课程,我们首先要删除教师教学任务,还要删除学生的选课情况,最后才能删除这门课程,同时,我们还要保证上述过程必须同时完成,不能只删除了课程,而教学任务和选课情况没有删除,这样就会在教学表和选课表中留下不一致的数据(无法与课程表关联)。

我们将必须一起完成的操作成为一个原子操作,我们使用事务来完成这个操作。即,当整个过程均无误的完成时,我们对事务过程整体进行提交,确保事务操作全部完成;而当事务操作中部分操作出现错误时,我们可以通过“回滚”确保事务全部都没有提交,返回没有执行该事务时的状态,从而确保数据的一致性。

例如,上述操作我们可以通过以下事务代码进行

delimiter $

CREATE PROCEDURE deleteCourse(IN cid int)  -- 声明删除课程的存储过程(函数)参数为课程ID

BEGIN

  DECLARE i_error integer; -- 定义一个变量,用于接收出错信息

  DECLARE CONTINUE handler FOR SQLEXCEPTION SET i_error = 1; -- 一旦出错则将变量设置为1

  START TRANSACTION ;   -- 发起事务

  DELETE FROM teaching WHERE c_ID=cid;   -- 删除教学表中有关该课程数据

  DELETE FROM selection WHERE c_ID=cid;  -- 删除选课表中有关该课程数据

  DELETE FROM course WHERE id=cid;       -- 删除课程表中的该课程

  IF i_error = 1 THEN    -- 判断是否出错

     ROLLBACK;          -- 回滚事务

  ELSE

     COMMIT;             -- 提交事务

  END IF;

END $

定义了上述存储过程后,在命令行下调用

Call deleteCourse(1);

即可执行对应的事务,按照上述分析结论,同时删除3个表对应的课程表编号为1的全部数据。

  • (15)复杂SQL查询

本节的最后,我们介绍复杂一些的SQL查询——多表联合查询。

在实际运用查询时,单独对一个表的查询往往不能满足查询的需求,这时就需要对多表进行联合查询。例如,我们想查询“数值分析”这门课的教师姓名是什么,这就涉及到从“课程表”、“教学表”和“教师表”3个表中联合查询出结果,我们使用“AND”关键字进行查询。

SELECT a.t_name,c.c_name FROM teacher a,teaching b,course c WHERE a.ID = b.t_ID AND b.c_ID = c.ID AND c.c_name='数值分析';

再比如,我们想要查询哪些课程都由哪个教师教学,以便学生进行选课,我们可以使用左连接的方式进行查询。

(“左连接”即表示,只有左侧表中有数据,无论右侧表中是否有数据,都可查询出结果,右侧无数据的表使用“NULL”表示。本例中,由于不是所有的课程都由老师领取了教学任务,因此,将“课程表”放在左侧连接教学任务表,没有教师领取任务的课程,教师姓名一栏为“NULL”),SQL查询语句如下:

SELECT a.ID AS 课程编号,a.c_name AS 课程,b.t_name AS 教师 FROM
course a LEFT JOIN
(SELECT c.t_name,d.c_ID
FROM teacher c,teaching d WHERE c.ID=d.t_ID) b
ON a.ID = b.c_ID;

查询结果为:

本节小结

这一节,我们简单讲述了MySQL数据库的操作和一些基本的SQL语句,因为在后面的章节中,本节的内容会大量使用,请读者熟练掌握。有关SQL语法和相关操作,尤其是多表联合查询、存储过程和事务处理等,内容相对较难,有兴趣的读者可以参考有关数据库的书籍,这里仅为入门级的描述。本节中的数据库和表的设计还很简单,只为了说明问题并便于理解,由于本书后续环节还将使用这里的数据库和表,到时我们会对它们进行优化处理。有关本节所涉及的有关代码、表结构,成书过程中我们会逐渐整理并挂在书后附件对应的网站上,请读者自行下载学习。

1.4 数据库和常用SQL语句(正文)——MySQL数据库命令和SQL语句的更多相关文章

  1. MySQL数据转移至SQL Server详解

    最近有个活是mysql数据转移到sql server 2012,直接手动转工作量太大,发现网上有工具教程,则记录一下. 一.安装MySQL ODBC驱动为MySQL安装Connector/ODBC驱动 ...

  2. 在PL/SQL使用游标获取数据及动态SQL

    1.游标概念: 当在PL/SQL块中执行DML(增删改)时,Oracle会为其分配上下文区(Context Area),游标是指向上下文区的指针 2.  游标分类: A.  隐式游标 a.  在PL/ ...

  3. MySQL数据迁移到SQL Server

    数据迁移的工具有很多,基本SSMA团队已经考虑到其他数据库到SQL Server迁移的需求了,所以已经开发了相关的迁移工具来支持. 此博客主要介绍MySQL到SQL Server数据迁移的工具:SQL ...

  4. Hadoop集群(第10期副刊)_常用MySQL数据库命令

    1.系统管理 1.1 连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 举例: 例1:连接到本机上的MySQL. 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入 ...

  5. window 常用MySQL数据库命令总结

    登录:cmd - mysql -uroot -p 创建数据库:CREATE DATABASE `tpcms` DEFAULT CHARACTER SET utf8 COLLATE utf8_gener ...

  6. Hadoop集群(第11期)_常用MySQL数据库命令

    1.系统管理 1.1 连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 举例: 例1:连接到本机上的MySQL. 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入 ...

  7. 数据库命令行操作语句 linux 详细

    1.连接数据库 命令: use <数据库名> 2.查看表的引擎类型等状态信息 SHOW TABLE STATUS [FROMdb_name] [LIKE 'pattern'] 3.当前数据 ...

  8. MySQL 数据 导入到 SQL Service

    1.下载安装ODBC驱动程序 地址:http://dev.mysql.com/downloads/connector/odbc/ 注意:系统的版本问题( 我的是64位的win7系统,但是SQL Ser ...

  9. MySQL数据查询子查询语句

随机推荐

  1. AtCoder AIsing Programming Contest 2020 D - Anything Goes to Zero (二进制,模拟)

    题意:给你一个长度为\(n\)的\(01\)串,从高位到低位遍历,对该位取反,用得到的十进制数\(mod\)所有位上\(1\)的个数,不断循环直到为\(0\),输出每次遍历时循环的次数. 题解:根据题 ...

  2. Linux 查看系统日志 ,查看服务日志

    journalctl 查看系统日志参数 -f 表示日志跟中-u 指定的是 unit 指定要查看的服务日志,如果不指定的话会显示所有服务的日志 journalctl -f -u 要查看的服务日志 jou ...

  3. Linux-用户/用户组身份提权

    sudo 身份提权(更安全) su命令在切换用户身份时,如果每个普通用户都能拿到root用户的密码,当其中某个用户不小心泄漏了root的密码,那系统会变得非常不安全. 为了改进这个问题,从而产生了su ...

  4. 2.API的理解和使用

    标题 : 2.API的理解和使用 目录 : Redis 序号 : 2 ​ zset的成员是唯一的,但分数(score)却可以重复. ​ 有序集合的内部编码 1.ziplist(压缩列表):当有序集合的 ...

  5. 缓冲区溢出实验 2 sizeof/strlen

    实验环境.代码.及准备 https://www.cnblogs.com/lqerio/p/12870834.html vul2 下面只给出有漏洞部分的代码.Vul2问题为sizeof函数在计算时会考虑 ...

  6. C# 类 (6) -继承

    继承 定义类的时候,public class Dog:Animal 表示 Dog 这个类是 继承自 Animal,冒号后面的是它的基类 继承后 的Dog 类,当调用Dog.Great() 的时候输出的 ...

  7. The Best One iOS Contacts App

    The Best One iOS Contacts App iPhone Contacts App SwiftUI Awesome iOS Contacts App 一款高度还原华为通讯录 iOS A ...

  8. React.js vs Vue.js All in One

    React.js vs Vue.js All in One React 与 Vue 区别对比 https://vuejs.org/v2/guide/comparison.html 1. 使用人数, 社 ...

  9. github & gist & Weekly development breakdown

    github & gist & Weekly development breakdown https://gist.github.com/xgqfrms WakaTime waka-b ...

  10. web effects collection

    web effects collection typewriter effect js 打字机效果 http://www.mattboldt.com/demos/typed-js/ https://g ...