前提要述:参考书籍《MySQL必知必会》
利用空闲时间快速回顾一些数据库基础。html
在最初安装MySQL,可能会要求你输入一个管理登陆(一般为root)和一个口令(密码)。mysql
链接MySQL须要如下信息:sql
cmd登陆前一篇有说。数据库
会简单介绍Navicat Premium 12,可是后面都是执行命令,因此在Navicat Premium 12的命令行窗口作或者在cmd作均可以。安全
如今说下:Navicat Premium 12,打开它。服务器
《MySQL必知必会》前面一开始就开讲SELETE查询等,而像新手可能就会不知道怎么建立数据库,建立表;而后利用这些表去测试所学的SELETE查询等。函数
下面提供两种方式建立数据库:工具
那么数据库就建立完成。布局
而后输入:性能
CREATE DATABASE ts;
更加规范的写法(推荐):
格式:
CREATE DATABASE IF NOT EXISTS <数据库名> DEFAULT CHARACTER SET='utf8';
好比:
CREATE DATABASE IF NOT EXISTS ts DEFAULT CHARACTER SET='utf8';
解释:
注意:写的时候注意中英文符号,好比 ''。
格式:
drop database <数据库名>;
能够看到咱们刚刚是在my链接这里开启命令界面,咱们操做的使用并非对全部数据库进行操做,而是对单个数据库进行操做,那么就须要输入选择数据库的语句。
格式:
USE <数据库名>;
选择刚刚创建的ts数据库:
USE ts;
命令行界面会返回:
Database changed # 表示成功
数据库、表、用户、列、权限等信息被存储在数据库和表中(MySQL用MySQL来存储这些信息)。不过,内部的表通常不直接访问。可用MySQL的SHOW命令来显示这些信息(MySQL从内部表中提取这些信息)。
SHOW DATABASES;
输出:
USE mysql; SHOW TABLES; # 显示数据库的所有表
输出:
USE mysql; SHOW COLUMNS FROM 表名称;
输出:
MySQL支持用 DESCRIBE 做为 SHOW COLUMNS FROM 的一种快捷方式。
4.其余的SHOW语句:
MySQL中定义数据字段的类型对你数据库的优化是很是重要的。
MySQL支持多种类型,大体能够分为三类:数值、日期/时间和字符串(字符)类型。
MySQL支持全部标准SQL数值数据类型。这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
BIT数据类型保存位字段值,而且支持MyISAM、MEMORY、InnoDB和BDB表。
做为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了须要的每一个整数类型的存储和范围。
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每一个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。
TIMESTAMP类型有专有的自动更新特性,将在后面描述。
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工做以及如何在查询中使用这些类型。 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 呢?
这三种类型比较:
总结起来,有几点:
下面转载
数据类型的选择特别重要:
因此当一个数据类型能够有多种选择多种类型的时候,应该优先考虑数字类型,其次是日期或二进制类型,最后应该是字符类型。对于相同级别的数据类型,应该优先选择占用空间小的数据类型。
原理:在对数据进行比较(查询条件,JOIN条件及排序)操做时:一样的数据,字符处理每每比数字处理慢,并且在数据库中,数据的处理是以页为单位,列的长度越小,数据类型占用的空间越小,利于性能的提高。
更多的优化等我看《高性能MySQL》再总结。
建立表有两种方式:
利用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值就是没有值或缺值。容许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也能够。
上面建立表中最后有一个 ENGINE=InnoDB。下面来解释一下:
MySQL与其余DBMS同样有一个具体管理和处理数据的内部引擎。好比当你使用CREATE TABLE语句时,该引擎具体建立表,而在你使用SELECE查询语句时或进行其余数据库处理时,该引擎在内部处理你的请求。因此它是对咱们透明化的。
MySQL与其余DBMS不同的是,MySQL具备多种引擎。这些引擎都隐藏在MySQL服务器内,全都能执行CREATE TABLE和SELECE等命令。
为何要这么多引擎,由于它们具备各自不一样的功能和特效,为不一样的任务选择正确的引擎可以得到良好的功能和灵活性。
可是在CREATE TABLE时也能够忽略它,会自动使用默认引擎(极可能是MyISAM),多数SQL语句都会默认使用它。
如下是几个必须知道的引擎:
引擎类型能够混用。可是外键不能跨引擎。混合引擎有一个很大缺陷。外键(用于强制实施引用完整性)不能跨引擎,即便用一个引擎的表不能引用具备使用不一样引擎的表的外键。
格式:
DROP TABLE <表名> ;
语法:
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 <要关联的表,好比班主任表>(<要关联的列>);
复杂得表结构更改通常须要手动删除过程,它涉及一下步骤:
当心使用ALTER TABLE :应该在改动前作一个完整的备份(模式和数据的备份)。数据库表的更改不能撤销,若是增长了不须要的列,可能不能删除它们。相似地,若是删除了不该该删除的列,可能会丢失该列中的全部数据。
语法:
RENAME TABLE <原表名> TO <新表名>;