MySQL快速回顾:数据库和表操作

时间:2022-08-28 08:44:22

前提要述:参考书籍《MySQL必知必会》

利用空闲时间快速回顾一些数据库基础。

4.1 连接

在最初安装MySQL,可能会要求你输入一个管理登录(通常为root)和一个口令(密码)。

连接MySQL需要以下信息:

  • 主机名(计算机名)——如果连接到本地MySQL服务器,为localhost;
  • 端口(如果使用默认端口3306之外的端口);
  • 一个合法的用户名(默认为root)
  • 用户口令(密码,如果需要的话)。

cmd登录前一篇有说。

会简单介绍Navicat Premium 12,但是后面都是执行命令,所以在Navicat Premium 12的命令行窗口做或者在cmd做都可以。

现在说下:Navicat Premium 12,打开它。

MySQL快速回顾:数据库和表操作

MySQL快速回顾:数据库和表操作

3.2 创建数据库

《MySQL必知必会》前面一开始就开讲SELETE查询等,而像新手可能就会不知道怎么创建数据库,创建表;然后利用这些表去测试所学的SELETE查询等。

下面提供两种方式创建数据库:

  1. 图形界面创建数据库

MySQL快速回顾:数据库和表操作

MySQL快速回顾:数据库和表操作

那么数据库就创建完成。

  1. 命令行创建数据库

MySQL快速回顾:数据库和表操作

MySQL快速回顾:数据库和表操作

然后输入:

CREATE DATABASE ts;

更加规范的写法(推荐):

格式:

CREATE DATABASE IF NOT EXISTS <数据库名> DEFAULT CHARACTER SET='utf8';

比如:

CREATE DATABASE IF NOT EXISTS ts DEFAULT CHARACTER SET='utf8';

解释:

  • CREATE DATABASE ts:表示创建一个名为ts的数据库;
  • IF NOT EXISTS:翻译过来就是如果不存在,防止当数据库存在时会报错;
  • CREATE DATABASE IF NOT EXISTS ts:表示如果不存在一个名为ts的数据库,则创建该数据库;
  • CHARACTER SET='utf8':这个跟我们上面图形界面设置的一样,就是设置数据库的字符集。
  • ; :分号表示语句结束,所以每一条语句都需要分号结尾。

注意:写的时候注意中英文符号,比如 ''。

4.3 删除数据库

格式:

drop database <数据库名>;

4.4 选择数据库

可以看到我们刚刚是在my连接这里开启命令界面,我们操作的使用并不是对所有数据库进行操作,而是对单个数据库进行操作,那么就需要输入选择数据库的语句。

格式:

USE <数据库名>;

选择刚刚建立的ts数据库:

USE ts;

命令行界面会返回:

Database changed # 表示成功

4.5 了解数据库和表

数据库、表、用户、列、权限等信息被存储在数据库和表中(MySQL用MySQL来存储这些信息)。不过,内部的表一般不直接访问。可用MySQL的SHOW命令来显示这些信息(MySQL从内部表中提取这些信息)。

  1. 查询已经存在的数据库(包括MySQL系统数据库:mysql和information_schema):
SHOW DATABASES;

输出:

MySQL快速回顾:数据库和表操作

  1. 获取一个数据库中的表的列表,前提是已经选择数据库,不然也不知道你要获取哪个数据库,假设获取mysql数据库的表。这里只是演示,一般别去动mysql数据库,毕竟是mysql的系统数据库。
USE mysql;
SHOW TABLES; # 显示数据库的全部表

输出:

MySQL快速回顾:数据库和表操作

  1. 显示一个表中的列
USE mysql;
SHOW COLUMNS FROM 表名称;

输出:

MySQL快速回顾:数据库和表操作

MySQL支持用 DESCRIBE 作为 SHOW COLUMNS FROM 的一种快捷方式。

4.其他的SHOW语句:

  • SHOW STATUS:用于显示广泛的服务器状态信息;
  • SHOW CREATE DATABASE和SHOW CREATE TABLE:分别用来显示创建特定数据库或表的MySQL语句;
  • SHOW GRANTS:用来显示授予用户(所有用户或特定用户)的安全权限;
  • SHOW ERRORS和SHOW WARNINGS:用来显示服务器错误或警告消息。

4.6 MySQL数据类型

转自菜鸟教程

MySQL中定义数据字段的类型对你数据库的优化是非常重要的。

MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

4.6.1 数值类型

MySQL支持所有标准SQL数值数据类型。这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。

关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。

BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。

作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

MySQL快速回顾:数据库和表操作

4.6.2 日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

TIMESTAMP类型有专有的自动更新特性,将在后面描述。

MySQL快速回顾:数据库和表操作

4.6.3 字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

MySQL快速回顾:数据库和表操作

CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。

有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

转自菜鸟教程评论区

关于 char、varchar 与 text 平时没有太在意,一般来说,可能现在大家都是用 varchar。但是当要存储的内容比较大时,究竟是选择 varchar 还是 text 呢?

这三种类型比较:

  1. char: char 不用多说了,它是定长格式的,但是长度范围是 0~255。 当你想要储存一个长度不足 255 的字符时,Mysql 会用空格来填充剩下的字符。因此在读取数据时,char 类型的数据要进行处理,把后面的空格去除。 这就是一个坑。
  2. varchar: 关于 varchar,有的说最大长度是 255,也有的说是 65535,查阅很多资料后发现是这样的:++varchar 类型在 5.0.3 以下的版本中的最大长度限制为 255++,而++在 5.0.3 及以上的版本中,varchar 数据类型的长度支持到了 65535++,也就是说可以存放 65532 个字节(注意是字节而不是字符!!!)的数据(起始位和结束位占去了3个字节),也就是说,在 5.0.3 以下版本中需要使用固定的 TEXT 或 BLOB 格式存放的数据可以在高版本中使用可变长的 varchar 来存放,这样就能有效的减少数据库文件的大小。
  3. text: 与 char 和 varchar 不同的是,text 不可以有默认值,其最大长度是 2 的 16 次方-1

总结起来,有几点:

  • 经常变化的字段用 varchar
  • 知道固定长度的用 char(比如性别)
  • 超过 255 字符的只能用 varchar 或者 text
  • 能用 varchar 的地方不用 text
  • 理论上在表中的列全都可以使用varchar来定义列的数据类型,但是千万不要这样,最好根据列的实际情况选择对应的数据类型,并且可以优化数据库,比如:性别-》char,学生学号位一般用整型来存储。

下面转载

数据类型的选择特别重要:

  1. 数据类型会影响存储空间的开销。
  2. 数据类型会影响数据库查询性能。

所以当一个数据类型可以有多种选择多种类型的时候,应该优先考虑数字类型,其次是日期或二进制类型,最后应该是字符类型。对于相同级别的数据类型,应该优先选择占用空间小的数据类型。

原理:在对数据进行比较(查询条件,JOIN条件及排序)操作时:同样的数据,字符处理往往比数字处理慢,而且在数据库中,数据的处理是以页为单位,列的长度越小,数据类型占用的空间越小,利于性能的提升。

更多的优化等我看《高性能MySQL》再总结。

4.7 创建数据库表

创建表有两种方式:

  • 使用具有交互式创建和管理表的工具(Navicat Premium 12 图形界面);
  • 表也可以直接用MySQL语句操纵。

利用CREATE TABLE创建表需要以下信息:

  • 新表的名称,再关键字CREATE TABLE之后给出;
  • 表列的名字和定义,用逗号隔开

创建表的语法:

CREATE TABLE 表名(
列名1 列的定义比如数据类型,是否为空,是否为主键等,
列名2 列的定义,
...
);

简单创建单表的例子:

CREATE TABLE student(
stu_id INT AUTO_INCREMENT,
stu_name varchar(10) NOT NULL,
stu_sex char(1) NULL,
PRIMARY KEY(stu_id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;;

解释:

  • 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
  • AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
  • PRIMARY KEY关键字用于定义列为主键。表中的每个行必须具有唯一的主键值,也就是一个表中至少有一个主键。 可以使用多列来定义主键,列间以逗号分隔。该关键字也可以直接写在stu_id的定义中。
  • ENGINE 设置存储引擎(这个先别管),CHARSET 设置编码。

额外:

NULL和NOT NULL:NULL值就是没有值或缺值。允许NULL值的列也允许在插入行时不给出该列的值。不允许NULL值的列不接受该列没有值的行。

理解NULL:不要把NULL值与空串相混淆。NULL值是没有值,它不是空串。如果指定''(两个单引号,其间没有字符),这在NOT NULL列中是允许的。空串是一个有效的值,它不是无值。NULL值用关键字NULL而不是空串指定。

主键中只能使用不允许NULL值得列。允许NULL值得列不能作为唯一标识。

AUTO_INCREMENT:被该关键字指定的列,表示每次插入数据时会对该列自动增长,通常使用它去定义主键。比如在增加一个新记录时,需要一个ID值,这ID可以任意,只要它是唯一的即可,那么最简单的就是使用下一个ID值,即当前表中最后一条记录的ID为1,那么新插入数据时,新插入的数据的ID就为2。所以就可以使用AUTO_INCREMENT自动增加ID值,我们在插入的时候也不用去理会ID是多少。

如何在表中获得AUTO_INCREMENT的值,输入:

SELECT last_insert_id();

就会返回最后一个AUTO_INCREMENT值。

也可以自己修改AUTO_INCREMENT的值,只要是唯一的。

DEFAULT:指定列的默认值,注意默认值不允许为函数,《MySQL必知必会》推荐使用默认值而不是使用NULL值。否则使用NOT NULL也可以。

评论区说的注意事项

MySQL快速回顾:数据库和表操作

4.8 引擎类型

上面创建表中最后有一个 ENGINE=InnoDB。下面来解释一下:

MySQL与其他DBMS一样有一个具体管理和处理数据的内部引擎。比如当你使用CREATE TABLE语句时,该引擎具体创建表,而在你使用SELECE查询语句时或进行其他数据库处理时,该引擎在内部处理你的请求。所以它是对我们透明化的。

MySQL与其他DBMS不一样的是,MySQL具有多种引擎。这些引擎都隐藏在MySQL服务器内,全都能执行CREATE TABLE和SELECE等命令。

为什么要这么多引擎,因为它们具有各自不同的功能和特效,为不同的任务选择正确的引擎能够获得良好的功能和灵活性。

但是在CREATE TABLE时也可以忽略它,会自动使用默认引擎(很可能是MyISAM),多数SQL语句都会默认使用它。

以下是几个必须知道的引擎:

  • InnoBD是一个可靠的事务处理引擎,它步支持全文本搜索;
  • MEMORY在功能等同于MyISAM,但由于数据存储在内存(不是磁盘)中,速度很快(特别适合于临时表)。
  • MyISAM是一个性能极高的引擎,它支持全文本搜索,但不支持事务处理。

引擎类型可以混用。但是外键不能跨引擎。混合引擎有一个很大缺陷。外键(用于强制实施引用完整性)不能跨引擎,即使用一个引擎的表不能引用具有使用不同引擎的表的外键

4.9 删除表

格式:

DROP TABLE <表名> ;

4.10 更新表

语法:

ALTER TABLE <表名>
操作

比如:

给表添加一个列:

ALTER TABLE student
ADD stu_phone CHAR(11);

给表删除一个列:

ALTER TABLE student
DROP stu_phone;

外键可以在创建表定义,也可以使用ALTER TABLE来定义,下面是定义外键的一种方式:

再创建一张班主任表

CREATE TABLE Headmaster(
ma_id INT PRIMARY KEY AUTO_INCREMENT,
ma_name VARCHAR(10) NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET='utf8';

先给学生表添加一个 班主任的列:

ALTER TABLE student ADD ma_id INT;

定义外键:与学生表相关联。

ALTER TABLE student
ADD CONSTRAINT fk_student_master
FOREIGN KEY (ma_id) REFERENCES Headmaster(ma_id);

外键语法:在创建表直接加上下面这句,修改表得再加个ADD

CONSTRAINT <外键名,自定义>
FOREIGN KEY (<当前表的列,比如学生表>) REFERENCES <要关联的表,比如班主任表>(<要关联的列>);

复杂得表结构更改一般需要手动删除过程,它涉及一下步骤:

  • 用新的列布局创建一个新表;
  • 使用INSERT SELECT语句(待了解)从旧表复杂数据到新表。如果有必要,可使用转换函数和计算字段;
  • 校验包含所需数据的新表;
  • 重命名旧表(如果确定,可以删除它);
  • 用旧表原来的名字重命名新表;
  • 根据需要,重新创建触发器,存储过程,索引和外键(除外键其他待了解)。

小心使用ALTER TABLE :应该在改动前做一个完整的备份(模式和数据的备份)。数据库表的更改不能撤销,如果增加了不需要的列,可能不能删除它们。类似地,如果删除了不应该删除的列,可能会丢失该列中的所有数据。

4.11 重命名表

语法:

RENAME TABLE <原表名> TO <新表名>;

MySQL快速回顾:数据库和表操作的更多相关文章

  1. MySQL快速回顾:高级查询操作

    8.1 排序数据 检索出的数据并不是以纯粹的随机顺序显示的.如果不排序,数据一般将以它在底层表中出现的顺序显示.这可以是数据最初添加到表中的顺序.但是,如果数据后来进行过更新或删除,则此顺序将会受到M ...

  2. mysql基础之对库表操作

    原文:mysql基础之对库表操作 查看一下所有的库,怎么办? Mysql>Show databases; 选库语句: Use 库名 创建一个数据库: create database 数据库名 [ ...

  3. SQL快速入门 &lpar; MySQL快速入门&comma; MySQL参考&comma; MySQL快速回顾 &rpar;

    SQL 先说点废话,很久没发文了,整理了下自己当时入门 SQL 的笔记,无论用于入门,回顾,参考查询,应该都是有一定价值的,可以按照目录各取所需.SQL数据库有很多,MySQL是一种,本文基本都是SQ ...

  4. day 46 Django 学习3 数据库单表操作以及反向解析

    前情提要: Django 已经学了不少了, 今天学习链接数据库的操作.以及相关的反向解析等 一:反向解析 1:反向解析模板层 跳转时设定url会随着前面的路由改变而改变         2:反向解析之 ...

  5. mysql基础篇 - 数据库及表的修改和删除

    基础篇 - 数据库及表的修改和删除         修改和删除 一.实验简介 本节实验中,我们将学习并实践如何对数据库的内容做修改,删除,重命名等操作. 二.实验准备 在正式开始本实验内容之前,需要先 ...

  6. MySQL 导入导出数据库、表

    使用 GUI 软件很好操作,下面介绍命令行操作. 导出 cmd 命令 # 1.1 导出整个数据库 mysqldump -hlocalhost -uroot -p student_db > C:\ ...

  7. 【MySQL】初识数据库及简单操作

    一.数据库概述 1.1 什么是数据(Data) 描述事物的符号记录称为数据,描述事物的符号既可以是数字,也可以是文字.图片,图像.声音.语言等,数据由多种表现形式,它们都可以经过数字化后存入计算机. ...

  8. 【MySQL】对数据库和表的增删改查

    数据库的基本概念 数据库的英文单词: DataBase 简称 : DB 什么是数据库? 用于存储和管理数据的仓库. 数据库的特点: 持久化存储数据的.其实数据库就是一个文件系统 方便存储和管理数据 使 ...

  9. zabbix 数据库分表操作

    近期zabbix数据库占用的io高,在页面查看图形很慢,而且数据表已经很大,将采用把数据库的数据目录移到新的磁盘,将几个大表进行分表操作 一.数据迁移: 1.数据同步到新的磁盘上,先停止mysql(不 ...

随机推荐

  1. HBASE列族不能太多的真相 (一个table有几个列族就有几个 Store)

    HRegionServer内部管理了一系列HRegion对象,每个HRegion对 应了table中的一个region,HRegion中由多 个HStore组成.每个HStore对应了Table中的一 ...

  2. vert&period;x学习(六),动态模板与静态文件的结合

    这篇学习在动态模板里面引入css,把动态模板与静态文件结合起来使用. 编写DynamicReference.java package com.javafm.vertx.helloworld; impo ...

  3. nodejs字符与字节之间的转换

    new Buffer("Hello World").toString("base64"); /* yields SGVsbG8gV29ybGQNCg== */ ...

  4. 使用HTML&period;ActionLink实现一个图片链接

    学习ASP.NET MVC 的Razor的语法,尝试把一段普能的图片链接<a ...><img ... />改为HTML.ActionLink实现. 最原始的代码: <a ...

  5. C&plus;&plus;strng流(入门级)

    /************************************************************************* * * FILENAME: stringTest. ...

  6. Tomcat中文乱码问题的原理和解决方法

    1) 更改 D:\Tomcat\conf\server.xml,指定浏览器的编码格式为“简体中文”: 方法是找到 server.xml 中的 <Connector port="8080 ...

  7. opengl截图

    int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) { UINT num = ; // number of image encoders U ...

  8. WPF多语言化的实现

    Metro插件系统系列就暂时停一下,这次我们讨论一下WPF的资源本地化实现,主要用到的:CultureInfo,ResourceManger,MarkupExtension,RESX文件,这些都是.N ...

  9. Redis最有用的中文资源,你值得拥有

    只是为了记录资源地址,最好直接访问doc.redisfans.com更美观 Redis 命令参考 本文档是 Redis Command Reference 和 Redis Documentation ...

  10. &lbrack;读书笔记&rsqb; 四、SpringBoot中使用JPA 进行快速CRUD操作

    通过Spring提供的JPA Hibernate实现,进行快速CRUD操作的一个栗子~. 视图用到了SpringBoot推荐的thymeleaf来解析,数据库使用的Mysql,代码详细我会贴在下面文章 ...