启动MySQL 服务

图形化界面启动

右击“计算机”,在快捷菜单中选择“管理”命令,打开“计算机管理”对话框。也可以执行“开始”|“控制面板”|“管理工具”|“服务”来启动服务。

命令行启动

查看服务命令:net start
关闭服务命令:net stop MySQL80
启动服务命令:net start MySQL80

控制台登陆MySQL命令

mysql -h 127.0.0.1 -uroot -p

显示和创建数据库

mysql> show databases; //显示数据库
mysql>create database database_name; //创建数据库
(注:高亮部分为数据库名称,根据个人设置不同而不同)

选择数据库

mysql>use database_name;

删除数据库

mysql>drop database database_name;

数据表操作

创建表

mysql>create table table_name(create-definition,table-options,partition-options);
mysql>create table <表名> ([表定义选项])[表选项][分区选项];

表名

指定要创建表的名称。表名称可以被指定为 database_name.table_name,以便在特定的数据库中创建表。无论是否有当前数据库,都可以通过这种方式创建。在当前数据库中创建表时,可以省略 database_name。

例如:在学校库里创建班级表:
mysql>create table school.class(class_id int, class_name varchar(128),class_teacher varchar(64));

表定义选项

表创建定义,由列名(column_name)、列的定义(column_definition, 或者叫类型定义)以及可能的空值说明、完整性约束或表索引组成。

列的类型定义- 整数类型

整数类型是数据库中最基本的数据类型。标准SQL中支持INTEGER和SMALLINT这两种数据类型。MySQL数据库除了支持这两种类型以外,还扩展支持了TINYINT、MEDIUMINT和BIGINT。下表从不同整数类型的字节数、取值范围等方面进行对比。
MYSQL数据库使用手册
整数类型后缀属性

  1. 类型名称后面的小括号。指定显示宽度(并不是该类型占用字节数)。如果不显示指定宽度则默认为tinyint(3)、 smallint(5)、 mediumint(8)、 int(11) 和 bigint(20)。一般配合 zerofill 使用,顾名思义,zerofill 就是用“0”填充的意思,也就是在数字位数不够的空间用字符“0”填满。
  2. UNSIGNED(无符号)。如果需要在字段里面保存非负数或者需要较大的上限值时,可以用此选项,它的取值范围是正常值的下限取 0,上限取原值的 2 倍,例如,tinyint 有符号范围是-128~+127,而无符号范围是 0~255。如果一个列指定为 zerofill,则 MySQL 自动为该列添加 UNSIGNED 属性。
  3. AUTO_INCREMENT (自增长)在需要产生唯一标识符或顺序值时,可利用此属性,这个属性只用于整数类型。AUTO_INCREMENT 值一般从 1 开始,每行增加 1。 一个表中最多只能有一个 AUTO_INCREMENT列 。对于任何想要使用 AUTO_INCREMENT 的列,应该定义为 NOT NULL(非空),并定义为 PRIMARY KEY(主键) 或定义为 UNIQUE(唯一 键)。

例如:
mysql> create table class(id integer auto_increment PRIMARY KEY , name varchar(128), teacher varchar(64) ); //创建表class, id 具有自增长属性
mysql> create table class(id integerauto_increment UNIQUE, name varchar(128), teacher varchar(64) ); //创建表class, id 具有自增长属性

列的类型定义- 浮点类型和定点数类型

数据表中用浮点数类型和定点数类型来表示小数。浮点数类型包括单精度浮点数(FLOAT型)和双精度浮点数(DOUBLE型)。定点数类型就是DECIMAL型。下面从这三种类型的字节数、取值范围等方面进行对比,如下表所示。
MYSQL数据库使用手册
MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度,如float(7,4)的 可显示为-999.9999,MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001。对于decimal,M是最大位数(精度),范围是1到65。可不指定,默认值是10。D是小数点右边的位数(小数位)。范围是0到30,并且不能大于M,可不指定,默认值是0。FLOAT和DOUBLE在不指定精度时,默认会按照实际的精度来显示,而DECIMAL在不指定精度时,默认整数为10,小数为0,即(10, 0)。
忠告: 当我们需要存储小数,并且有精度要求,比如存储金额时,通常会考虑使用DECIMAL字段类型!!!

列的类型定义- 日期和时间类型

日期与时间类型是为了方便在数据库中存储日期和时间而设计的,数据库有多种表示日期和时间的数据类型。其中,YEAR类型表示年,DATE类型表示日期,TIME类型表示时间,DATETIME和TIMESTAMP表示日期和时间。下面从这5种日期与时间类型的字节数、取值范围和零值等方面进行对比,如下表所示。
MYSQL数据库使用手册
插入日期时间时,日期年月日和时间时分秒可以使用 “: - _ / ”中的任意字符来分隔,如果单独插入时间,则会报错!!!
常用的时间函数:
CURDATE() - 获得当前的DATE, 可直接插入DATE 类型中。
NOW() - 获得当前的DATETIME, 可直接插入DATETIME 和TIMESTAMP类型中。
TIME() - 获取参数给定时间串中的时分秒,可直接插入TIME 类型中。
YEAR() - 获取参数给定时间串中的年份,可直接插入YEAR类型中。
MONTH() 、DAY()、HOUR()、MINUTE()、SECOND() 获取参数给定时间串中的月、日、时、分、秒值。

例如:
mysql>create table date_example (e_date date, e_datetime datetime, e_timestamp
timestamp, e_time time, e_year year); //创建表dt_example
mysql>insert into date_example values(‘2020-5-9’, ‘2020-5-9 15:01:00’, ‘2020-05-09 15:01:00’, ‘15:56:01’, 2011);
mysql>insert into date_example values(CURDATE(), NOW(), NOW(), time(NOW()), YEAR(NOW()) );//使用时间函数表示

列的类型定义- 字符串类型

CHAR(M)
VARCHAR(M)

其中,“字符串类型”参数指定了数据类型为CHAR类型还是VARCHAR类型;M参数指定了该字符串的最大长度为M。例如,CHAR(4)就是数据类型为CHAR类型,其最大长度为4。

1. CHAR类型的长度是固定的,在创建表时就指定了。其长度可以是0~255的任意值。例如,CHAR(100)就是指定CHAR类型的长度为100。CHAR 存储值时,它们会用空格右填充到指定的长度。
2. VARCHAR类型的长度是可变的,在创建表时指定了最大长度。定义时,其最大值可以取0~65535之间的任意值。指定VARCHAR类型的最大值以后,其长度可以在0到最大长度之间。例如,VARCHAR(100)的最大长度是100,但是不是每条记录都要占用100个字节,而是在这个最大值范围内使用多少就分配多少。VARCHAR类型实际占用的空间为字符串的实际长度加1或2,这样即可有效节约系统的空间。

列的类型定义- TEXT类型

MYSQL数据库使用手册
特别注意:

  1. 以上各类型无须指定长度!
  2. 允许的长度是指实际存储的字节数,而不是实际的字符个数,比如假设一个中文字符占两个字节, 那么TEXT 类型可存储 65535/2 = 32767 个中文字符,而varchar(100)可存储100个中文字 符,实际占200个字节,但varchar(65535) 并不能存储65535个中文字符,因为已超出表达范围。

列的类型定义- ENUM和SET类型

ENUM类型又称为枚举类型。在创建表时,ENUM类型的取值范围以列表的形式指定,其基本形式如下:

属性名 ENUM(‘值1’, ‘值2’, …, ‘值n’)
例如:
mysql> create table enum_example (e_enum enum(‘男’,‘女’,‘选择保密’) ); #创建表
mysql> insert into enum_example values(‘男’);

其中,“属性名”参数指字段的名称,“值n”参数表示列表中的第n个值。ENUM类型的值只能取列表中的一个元素。其取值列表中最多能有65535个值。如果数据值列表在255个以内,那么一个字节就够,如果超过255但是小于65535,那么系统采用两个字节保存。列表中的每个值独有一个顺序排列的编号,MySQL中存入的是这个编号,而不是列表中的值。默认编号从1开始!
如果ENUM类型加上了NOT NULL属性,其默认值为取值列表的第一个元素。如果不加NOT NULL属性,ENUM类型将允许插入NULL,而且NULL为默认值。

SET类型在创建表时,SET类型的取值范围就以列表的形式指定了,其基本形式如下:

属性名 SET(‘值1’, ‘值2’, …, ‘值n’)
例如:
mysql> create table set_example (interest set(‘足球’,‘追剧’,‘篮球’,‘撩妹’) ); #创建表
mysql> insert into set_example values( ‘足球,撩妹’ );

其中,属性名参数指字段的名称,“值n”参数表示列表中的第n个值,这些值末尾的空格将会被系统直接删除。其基本形式与ENUM类型一样。SET类型的值可以取列表中的一个元素或者多个元素的组合。取多个元素时,不同元素之间用逗号隔开。SET类型的值最多只能是由64个元素构成的组合。

列的类型定义- 二进制类型

二进制数据和文本数据在mysql 中的最大区别在于:
二进制类型存储原始的二进制数据(如图片,视频,exe文件等)。文本类型(TEXT)用来存储字符字符串(如由英文字符、中文字符或其它语言字符组成的字符串)。
二进制类型没有字符集,并且排序和比较基于列值字节的数值。而TEXT类型有字符集,并且根据字符集的校对规则对值进行排序和比较。
二进制类型是存储二进制数据的数据类型,包括BINARY、VARBINARY、BIT、TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。二进制类型之间的对比如下表所示。
MYSQL数据库使用手册BINARY(M)类型VARBINARY(M)类型都是在创建表时指定最大长度。其中,“字符串类型”参数指定数据类型为BINARY类型还是VARBINARY类型;M参数指定该二进制数的最大字节长度为M。这与CHAR类型和VARCHAR类型相似。例如,BINARY(10)就是指数据类型为BINARY类型,其最大长度为10。
1. BINARY(M)类型的长度是固定的,在创建表时就指定了,不足最大长度的空间由″\0″补全。例如,BINARY(50)就是指定BINARY类型的长度为50。
2. VARBINARY(M)类型的长度是可变的,在创建表时指定了最大的长度,其长度可以在0到最大长度之间,在这个最大值范围内使用多少就分配多少。
3. BIT(M)类型
BIT类型在创建表时指定最大长度,其中,“M”指定该二进制数的最大存储长度为M,M的最大值为64。例如,BIT(4)就是指数据类型为BIT类型,长度为4。若字段的类型BIT(4)存储的数据是0~15,因为变成二进制之后15的值为1111,则其长度为4。如果插入的值为16,其二进制数为10000,长度为5,超过了最大长度,因此大于16的数是不能插入BIT(4)类型字段中的。
操作要点:
插入数据时,使用 b’位串’的方式插入相应值!
查询时,可以使用 bin() 、oct() 、hex() 函数讲字段的值转成相应的二进制、八进制和十六进制.

例如:
mysql> create table bit_example (b bit(8) ); //创建表
mysql> insert into bit_example values( b’10110111’ ); //插入记录,可以是二进制位
mysql> insert into bit_example values( ‘a’ ); //插入记录,可以是字符,但不能超出字节长度

4. BLOB类型

以上各类型无须指定长度!允许的长度是指实际存储的字节数,不用考虑字符编码。

列的完整性约束

完整性约束条件是对字段进行限制,要求用户对该属性进行的操作符合特定的要求。如果不满足完整性约束条件,数据库系统将不再执行用户的操作。MySQL中基本的完整性约束条件如表3-11所示。下表是完整性约束条件:
MYSQL数据库使用手册

主键约束(PRIMARY KEY)

主键是表的一个特殊字段,能唯一标识该表中的每条信息。主键和记录的关系,如同身份证和人的关系。主键用来标识每个记录,每个记录的主键值都不同。身份证用来表明人的身份,每个人都具有唯一的身份证号。设置表的主键是指在创建表时设置表的某个字段为该表的主键。
主键的主要目的是帮助数据库管理系统以最快的速度查找到表的某一条信息。主键必须满足的条件就是主键必须是唯一的,表中任意两条记录的主键字段的值不能相同,并且是非空值。主键可以是单一的字段,也可以是多个字段的组合。
CONSTRAINT关键字可以为主键添加一个别名。

主键的语法如下:创建表school,设置id字段为主键约束
方式1:
mysql> create table class(id int PRIMARY KEY, name varchar(128), teacher varchar(64));
mysql> insert into class values(1,‘孙悟空’,‘菩提祖师’); //插入成功
mysql> insert into class VALUES(1,‘猪八戒’,‘唐僧’); //因主键约束,插入失败
方式2:
mysql> create table class(id int , name varchar(128), teacher varchar(64),CONSTRAINT id_pk PRIMARY KEY(id));
方式3:
mysql> create table class(id int , name varchar(128), teacher varchar(64),CONSTRAINT id_pk PRIMARY KEY(id,name)); //设置联合主键

外键约束(FOREIGN KEY)

外键是表的一个特殊字段,外键约束是为了保证多个表(通常为两个表)之间的参照完整性,即构建两个表的字段之间的参照关系。
设置外键约束的两个表之间具有父子关系,即子表中某个字段的取值范围由父表决定。例如,表示一个班级和学生关系,即每个班级有多个学生。首先应该有两个表:班级表和学生表,然后学生表有一个表示班级编号的字段no,其依赖于班级表的主键,这样字段no就是学生表的外键,通过该字段班级表和学生表建立了关系。
在具体设置FK约束时,设置FK约束的字段必须依赖于数据库中已经存在的父表的主键,同时外键可以为空(NULL)。

例如:
mysql>create table class(id int primary key,class_name varchar(128),class_teacher varchar(128)); //创建班级表,并将班级id设为主键
mysql> create table student(id int primary key auto_increment,name varchar(128) not null,class_id int,sex enum(‘男’,‘女’),foreign key(class_id) references class(id));//创建学生表,并将班级id设为外键
mysql> insert into class(1,‘阴曹地府’,‘地藏王菩萨’);
mysql> insert into student(name,class_id,sex) values (‘牛头’,1,‘男’); //正确
mysql> insert into student(name,class_id,sex) values (‘马面’,2,‘男’); //错误,没有相关主键

非空约束(NOT NULL)

当数据库表中的某个字段上的内容不希望设置为NULL时,可以使用NOT NULL约束进行设置。非空约束在创建数据库表时为某些字段上加上“NOT NULL”约束条件,保证所有记录中的该字段都有值。如果在用户插入的记录中该字段为空值,那么数据库管理系统会报错。

例如:
mysql> create table class(id int, name varchar(128) NOT NULL, teacher varchar(64));
mysql> desc class ; //查询表class 的定义, describe class 效果等同
mysql> show create table class ; //同样可以实现查询表class 的定义

唯一约束(UNIQUE)

当数据库表中某个字段上的内容不允许重复时,可以使用UNIQUE约束进行设置。唯一约束在创建数据库时为某些字段加上“UNIQUE”约束条件,保证所有记录中该字段上的值不重复。如果在用户插入的记录中该字段上的值与其他记录中该字段上的值重复,那么数据库管理系统会报错。
注意: unique 约束允许受约束的字段出现多个空值 NULL, 不算重复

例如:
mysql> create table class(id int, name varchar(128) UNIQUE, teacher varchar(64));

自动增加(AUTO_INCREMENT)

AUTO_INCREMENT是MySQL唯一扩展的完整性约束,当向数据库表中插入新记录时,字段上的值会自动生成唯一的ID。在具体设置AUTO_INCREMENT约束时,==一个数据库表中只能有一个字段使用该约束,该字段的数据类型必须是整数类型。由于设置AUTO_INCREMENT约束后的字段会生成唯一的ID,因此该字段也经常会同时设置成主键。==默认情况下,增加的值从1开始增加,每增加一条记录,记录中该字段的值就会在前一条记录(或已存在的最大值(包括曾经存在的))的基础上加1。

例如:
create table class(id int PRIMARY KEY AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64)); //设置为主键并自增

注意: mysql8 中,AUTO_INCREMENT 必须设为键(主键、外键和唯一键均可)! 否则会报错!

默认值(DEFAULT)

当为数据库表中插入一条新记录时,如果没有为某个字段赋值,数据库系统就会自动为这个字段插入默认值。为了达到这种效果,可通过SQL语句关键字DEFAULT来设置。
注意: 如果没有设置,则默认为空。

调整列的完整性约束

查询

mysql>show keys from table_name;
mysql>desc table_name;

删除

删除主键:mysql>alter table table_name drop primary key;
外键或唯一键:mysql>alter table table_name drop index 约束名;

注意:删除主键之前需要将自增等先进行删除。

新增

mysql>alter table [table_name] add constraint [constraint_name] [unique key| primary key|foreign key] ([column_name])
例如:
alter table student add constraint primary key(id); //为学生表id字段添加主键

修改

主键、外键和唯一键:按照上述步骤 先执行 删除 然后再 新增 即可!
默认值DEFAULT、自增长和非空:alter table 表名 modify 列名 类定义;
例如:
mysql>alter table class modifyteacher varchar(64) DEFAULT ‘齐天大圣’ NOT NULL ; #设置默认值和非空
mysql> alter table class modify teacher varchar(64) ; #取消默认值和非空

表索引

索引是一种特殊的数据库结构,可以用来快速查询数据库表中的特定记录,是提高数据库性能的重要方式。MySQL中,所有的数据类型都可以被索引。
通过索引,查询数据时可以不必读完记录的所有信息,而只是查询索引列,否则数据库系统将读取每条记录的所有信息进行匹配。例如,索引相当于新华字典的音序表,如果要查“过”字,如果不适用音序,就需要从字典的第一页开始翻几百页;如果提取拼音出来,构成音序表,就只需要从10多页的音序表中直接查找,这样就可以大大节省时间。因此,使用索引可以在很大程度上提高数据库的查询速度,有效地提高了数据库系统的性能。

创建和查看索引

普通索引

所谓普通索引,就是在创建索引时,不附加任何限制条件(唯一、非空等限制)。该类型的索引可以创建在任何数据类型的字段上。

CREATE TABLE tablename(
propname1 type1,
……
propnamen type…n,
INDEX | KEY
[indexname] (propnamen [(length)] [ ASC | DESC ] ) );
其中,参数INDEX和KEY是用来指定字段为索引的,两者选择其中之一就可以了,作用是一样的;参数indexname是索引名字,可省略;参数propnamen是索引对应的字段的名称,该字段必须为前面定义好的字段;参数length是可选参数,其指索引的长度,必须是字符串类型才可以使用;参数ASC和DESC都是可选参数,ASC表示升序排列,DESC表示降序排列,如果不指定,则为升序。

例如:
方式1:在创建表时创建索引
mysql> create table class(id int, name varchar(128) UNIQUE, teacher varchar(64), INDEX index_no(id DESC));//创建表class, 并建立为id 字段索引
方式2:在已存在的表中创建索引
mysql> create index index_id on class(id ASC); #在class表上追加升序索引
方式3:
mysql> alter table clss add index index_id(id ASC);

唯一索引

唯一索引,就是在创建索引时,限制索引的字段值必须是唯一的。通过该类型的索引可以比普通索引更快速地查询某条记录。

ATE TABLE tablename(
propname1 type1,
……
propnamen type…n,
UNIQUE INDEX | KEY [indexname] (propnamen [(length)] [ ASC | DESC ] ) );

全文索引

全文索引主要对字符串类型建立基于分词的索引,主要是基于CHAR、VARCHAR和TEXT的字段上,以便能够更加快速地查询数据量较大的字符串类型的字段。
全文索引以词为基础的,MySQL默认的分词是所有非字母和数字的特殊符号都是分词符。
MySQL从3.23.23版本开始支持全文索引,MySQL5.6以前只能在存储引擎为MyISAM的数据表上创建全文索引,5.6之后InnoDB开始支持全文索引(5.7之后支持中文全文索引) 。在默认情况下,全文索引的搜索执行方式为不区分大小写,如果全文索引所关联的字段为二进制数据类型,就以区分大小写的搜索方式执行。

CREATE TABLE tablename(
propname1 type1,
……
propnamen type…n,
FULLTEXT INDEX | KEY
[indexname] (propnamen [(length)] ) );

MySQL8 中文分词支持
配置文件my.ini(Windows 10默认路径: C:\ProgramData\MySQL\MySQL Server 8.0) 中增加如下配置项,同时重启MySQL80 服务:
[mysqld]
ngram_token_size=2

多列索引

CREATE TABLE tablename(
propname1 type1,
……
propnamen type…n,
INDEX | KEY [indexname] (propname1 [(length)] [ ASC | DESC ],
Propname2 [(length)] [ ASC | DESC ],
… …
Propnamen [(length)] [ ASC | DESC ])
);

注意:和普通索引定义基本相同,不同之处就是增加了多个索引列。

隐藏索引

MySQL 8开始支持隐藏索引。隐藏索引提供了更人性化的数据库操作。
隐藏索引,顾名思义,让索引暂时不可见,不会被优化器使用。默认情况下索引是可见的。隐藏索引可以用来测试索引的性能。验证索引的必要性时不需要删除索引,可以先将索引隐藏,如果优化器性能无影响就可以真正地删除索引。

ALTER TABLE tablename ALTER INDEX index_name INVISIBLE; #隐藏索引
ALTER TABLE tablename ALTER INDEX index_name VISIBLE; #取消隐藏

删除索引

DROP INDEX indexname ON tablename;

表数据插入

插入数据记录是常见的数据操作,可以显示向表中增加的新的数据记录。在MySQL中可以通过“INSERT INTO”语句来实现插入数据记录,该SQL语句可以通过如下4种方式使用:插入完整数据记录、插入部分数据记录、插入多条数据记录和插入JSON结构的数据记录(暂且不讲)。

插入完整数据记录:
INSERT INTO tablename VALUES(value1, value2,…,valuen);
插入部分数据记录:
INSERT INTO tablename(field1, field2, …, fieldn)VALUES(value1, value2, …, valuen);
注意: 如果域没有设定默认值,也没有设定为自增长,则插入记录时必须插入值
插入多条数据记录:
INSERT INTO tablename(field1, field2, …, fieldn) VALUES(value11, value12, …, value1n),(value21, value22, …, value2n),… …,1, valuen2, valuen3, …, valuenn);

表数据更新(修改)

更新数据记录是数据操作中常见的操作,可以更新表中已经存在数据记录中的值。在MySQL中可以通过UPDATE语句来实现更新数据记录。

UPDATE tablename SET field1 = value1, field2 = value2, …, fieldn = valuen) WHERE CONDITION;

上述语句中,参数tablename表示所要更新数据记录的表名,参数field表示表中所要更新数值的字段名字,参数valuen表示更新后的数值,参数CONDITION指定更新满足条件的特定数据记录

例如:将class表中的teacher字段‘孙悟空‘修改为玉皇大帝’。
mysql>update class set teacher = ‘玉皇大帝’ where teacher = ‘孙悟空’;
#通过teacher 字段匹配更新记录
mysql> update class set teacher = ‘玉皇大帝’ where id = 2;
#通过id 字段匹配更新记录

表数据删除

除数据记录是数据操作中常见的操作,可以删除表中已经存在的数据记录。在MySQL中可以通过DELETE语句来删除数据记录。

DELETE FROM tablename WHERE CONDITION;

在上述语句中,参数tablename表示所要删除数据记录的表名,参数CONDITION指定删除满足条件的特定数据记录。

例如:
mysql> delete from class where teacher = ‘玉皇大帝’; #通过teacher字段删除记录
mysql> delete from class ; #直接删除所有记录
mysql> delete from class where id > 0; #通过id 字段删除匹配的所有记录

表数据查询

相关文章:

  • 2021-11-23
  • 2021-10-24
  • 2022-12-23
  • 2021-09-03
  • 2022-01-19
  • 2022-02-09
猜你喜欢
  • 2021-10-06
  • 2021-12-04
  • 2021-12-04
  • 2021-08-30
  • 2021-09-29
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案