【MySQL系列】01.mysql环境&基本操作&数据类型&完整性约束

一、MySQL服务的安装与连接

1、Windows10安装MySQL服务

说明:以MySQL8为例。

第一步:去官网下载mysql-8.0.22-winx64.zip;
第二步:解压,并配置my.ini文件(若无该文件,则在安装根目录下新建),基本配置如下:

[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=C:\Program Files\MySQL
# 设置mysql数据库的数据的存放目录
datadir=C:\Program Files\MySQL\Data
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
# mysql_native_password
default_authentication_plugin=mysql_native_password

[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8

[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8

第三步:使用管理员身份运行CMD,直接进入mysql8安装目录,在bin目录下执行以下命令:

mysqld --initialize --console

输出结果(示例参考):(暂先记住这个账号与密码,系统默认分配的,用于登录mysql)

 [Note] [MY-010454] [Server] A temporary password
      is generated for root@localhost: 9P0gYk-?0,kT

第四步:在bin目录下继续执行以下命令:

# 执行完,提示Service successful installed,代表服务安装成功
# 服务名可以不加,默认为mysql
mysqld --install [服务名]

注意:如果提示The service already existed,执行以下删除该服务的命令 sc delete mysql,再执行上面安装的命令。

第五步:至此,MySQL服务安装完毕,操作以下命令可以查看、启动、关闭MySQL服务:

# 查看mysql服务是否运行
netstat -an|find "3306"
# 启动mysql服务
net start mysql
# 关闭mysql服务
net stop mysql

注意

  • 用管理员身份运行CMD,然后启动或停止MySQL服务,不然会报系统错误的提示。
  • 如果不止一个MySQL服务,建议用版本区分,如本机用mysql5、mysql8区分的。

2、使用Docker安装MySQL服务

参考我的另一篇博客:https://blog.csdn.net/qq_29119581/article/details/112909718

二、数据库基本概念和操作

1、数据库管理系统(DBMS)

数据库管理系统的基本认识:

  • 数据库管理系统(DBMS):即Database Management System,为管理数据库而设计的软件系统,具有存储,更新,安全保障,备份等基础功能。
  • DBMS分类:关系数据库管理系统(RDBMS)、非关系数据库管理系统(NoSQL),二者最直观的区别是RDBMS基于表结构存储数据,而NoSQL是key-value结构存储数据的。
  • DBMS类型的数据库有:Oracle数据库、MySQL数据库、SQL Server数据库、DB2数据库、SyBase数据库等。
  • NoSQL类型的数据库有:Redis数据库、Memcached数据库、MongoDB数据库等。

数据库的优点:

  • 数据一致性 :所有的数据都存储在一起,所有的程序操作的数据都是统一的,就不会出现数据不一致的现象;
  • 稳定性:相对来说,程序会更加稳定;
  • 并发性能 :数据库可以良好的支持并发,所有的程序操作数据库都是通过网络,而数据库本身支持并发的网络操作;
  • 效率 :使用数据库对数据进行增删改查的效率要高出处理文件。

2、结构化查询语言(SQL)

1. SQL概述:是一种数据库查询和程序设计语言,用于存取,查询,更新及管理关系型数据库。

2. SQL语言类型:可分为以下四种

类型 含义 解释
DDL 数据定义语言 数据库、表、视图、索引、存储过程,如create/drop/alter等
DML 数据操作语言 插入insert、修改update、删除delete
DQL 数据查询语言 查询select
DCL 数据控制语言 定义访问权限、取消访问权限,安全设置,如grant

3. 注意:不同数据库系统之间的SQL语句不完全相同!

3、基本操作命令

1. 远程登陆

mysql  -h 主机名 -u 用户名 -p 密码 -P 端口号

2. 操作数据库

# 1.查看数据库
show databases;
# 2.创建数据库
create database db1;
# 3.查看其中的一个库
show create database db1;
# 4.创建数据库并指定编码
create database db2 charset utf8;
# 5.使用数据库
use db2;
# 6.修改数据库编码
alter database db1 charset utf8;
# 7.删除数据库
drop database db1;
# 8.查看当前所在的库
select database();

3. 数据库表及记录的操作

# 查询当前数据库下所有的数据表
SHOW TABLES;
# 创建数据表
CREATE TABLE `taobao_test`.`order`  (
  `order_id` int(10) AUTO_INCREMENT COMMENT '订单id',
  `order_seq` char(100) NOT NULL COMMENT '订单序号',
  `order_name` varchar(200) NULL COMMENT '订单名称',
  `order_from` char(150) NULL COMMENT '商家地址',
  `order_to` char(150) NULL COMMENT '客户地址',
  `order_date` datetime(0) NULL COMMENT '下单日期',
  `order_type` char(100) NULL COMMENT '订单类型',
  `order_details` varchar(200) NULL COMMENT '订单明细',
  `order_price` double(20, 0) NULL COMMENT '订单原价',
  `order_totalprice` decimal(20, 0) NULL COMMENT '订单总价',
  `custorm_name` char(100) NULL COMMENT '客户姓名',
  `custorm_mobile` char(100) NULL COMMENT '客户手机号',
  `pay_type` char(100) NULL COMMENT '支付类型',
  `finish_date` date NULL COMMENT '完成配送日期',
  PRIMARY KEY (`order_id`)
);

/**
 * 数据表的插入添加操作
 */
-- 缺省字段名,需要设置所有的字段值
INSERT INTO taobao_test.order 
    VALUES(1000,"20200514224420","尼克思汉堡单人套餐",null,null
                ,null,null,null,null,null,null,null,null,null);
-- 指定某些字段名,设置对应的字段值
INSERT INTO taobao_test.order (order_seq,order_name) 
    VALUES("20200514223955","正新鸡排套餐(大份)");
-- 增加数据表的字段(可以通过frist,after等指定字段位置)
ALTER TABLE taobao_test.order ADD order_remake varchar(150);
ALTER TABLE taobao_test.order 
        ADD curr_postion varchar(50) after custorm_name;

/**
 * 数据表的查询操作
 */
# 查看数据表的结构
DESC taobao_test.order;
# 查询数据表的记录
SELECT * FROM taobao_test.order;

/**
 * 数据表的删除操作
 */
# 删除数据表的所有记录
DELETE taobao_test.order;
TRUNCATE TABLE taobao_test.order;
# 删除数据表的结构和记录
DROP TABLE taobao_test.order;
# 删除数据表的字段
ALTER TABLE taobao_test.order DROP order_remake;
# 删除数据表的外键约束
ALTER TABLE taobao_test.order DROP FOREIGN KEY fk_order1_order;

/**
 * 数据表的更新修改操作
 */
# 修改数据表的记录
UPDATE taobao_test.order SET order_name="尼克思汉堡单人套餐(大份)" 
        ,order_type=1 WHERE order_id=101;
# 修改数据表的字段数据类型(使用MODIFY)
ALTER TABLE taobao_test.order MODIFY order_type char(50);
# 修改数据表的字段数据类型(使用CHANGE)
ALTER TABLE taobao_test.order CHANGE order_type order_type int(50);
# 设置数据表的字段默认值
ALTER TABLE taobao_test.order ALTER order_type SET DEFAULT 1;
# 修改数据表的表名(使用RENAME)
ALTER TABLE taobao_test.new_order RENAME taobao_test.order;

4. 常见的查询操作

-- 单表查询(无条件,DISTINCT过滤重复数据,where条件,as设置别名)
SELECT * FROM  taobao_test.order;
SELECT order_id,order_seq,DISTINCT order_name FROM  taobao_test.order;
SELECT order_id,order_seq,order_name,pay_type FROM  taobao_test.order;
SELECT order_id as id,order_seq as seq,order_name name
                        ,pay_type type FROM  taobao_test.order;
SELECT * FROM  taobao_test.order WHERE order_id=101 OR pay_type="2";

# 子查询(IN、NOT IN、EXISTS、NOT EXISTS等)
SELECT * FROM  taobao_test.order WHERE order_id IN(100,101,102);
SELECT * FROM  taobao_test.order WHERE pay_type IS NULL
     AND EXISTS(SELECT order_id FROM taobao_test.order WHERE order_id=101);

# 分页查询 (语法:LIMIT 初始位置,记录数 或 LIMIT 记录数)
SELECT * FROM  taobao_test.order LIMIT 1,5;
SELECT * FROM  taobao_test.order LIMIT 5;

# 模糊匹配(LIKE)
SELECT * FROM  taobao_test.order WHERE order_name LIKE "%大份%";

# 范围匹配(BETWEEN .. AND ..)
SELECT * FROM  taobao_test.order WHERE order_id BETWEEN 101 AND 105;

# 空值查询(NULL判断)
SELECT * FROM  taobao_test.order WHERE order_id=101 AND pay_type IS NULL;
SELECT * FROM  taobao_test.order WHERE order_type IS NOT NULL;
SELECT * FROM  taobao_test.order WHERE order_type <> NULL;

# 分组查询(GROUP BY),分组过滤(HAVING)
SELECT SUM(order_totalprice) moy FROM  taobao_test.order GROUP BY order_id;
SELECT SUM(order_totalprice) moy FROM  taobao_test.order 
    GROUP BY order_id HAVING order_id > 101;

# 排序 asc-升序(不写,默认升序)  desc-降序
SELECT * FROM  taobao_test.order ORDER BY order_id;
SELECT * FROM  taobao_test.order ORDER BY order_id DESC;

# 正则表达式查询 
SELECT * FROM  taobao_test.order WHERE order_name REGEXP '套餐';
SELECT * FROM  taobao_test.order WHERE order_name REGEXP '(大份)$';
SELECT * FROM  taobao_test.order WHERE order_name REGEXP '[堡,鸡]';

-- 多表查询(子查询,交叉/内/左/右连接查询,UNION与UNION ALL结果合并)

三、MySQL的基本类型

总体上有以下四种类型:

1、整数类型

tinyint、smallint、mediumint、int、bigint

在这里插入图片描述
它们区别在于占用字节不一样,表示的整数数值范围不同。

2、浮点数类型

float、double、decimal

它们都可以表示小数,精度不同。float占4字节;double占8个字节;decimal用于金融货币结算,精细工程的运算。

3、日期时间类型

year、data、time、datatime、timestamp

分别表示年、日期、时间、日期时间、时间戳,它们的时间格式不同。

4、字符串类型

char、varchar、enum、tinyblob、blob、mediumblob、longblob、tinytext、text、mediumtext、longtext、varbinary、binary

  • enum、set:分别表示枚举和集合类型,不同的是enum适合存储表单界面中的“单选值”,set适合存储表单界面的“多选值”。
  • char、varchar:前者固定长度类型,后者可变长度类型。
  • binary和 varbinary类似于 char和 varchar,不同的是它们包含二进制字节字符串。
  • tinytext、text、mediumtext、longtext:属于非二进制字符串,只能存储字符数据,它们区别在于纯文本的存储空间范围不同。
  • tinyblob、blob、mediumblob、longblob:属于二进制字符串,用来存储可变数量的字节数据,适合保存图片等。

四、MySQL完整性约束

1、约束类型

MySQL 中,主要支持以下 6 种约束:

  • 主键(PRIMARY KEY):唯一标识该表中的每条记录,主键字段值不能为空。
  • 外键(FOREIGN KEY):和主键约束一起使用,用来确保数据的一致性。
  • 唯一(Unique Key):在一个表中可以有多个,并且设置唯一约束的列是允许有空值的,只能有一个空值,如要避免表中的用户名重名,就可以把用户名列设置为唯一约束。
  • 检查(CHECK):来检查数据表中,字段值是否有效。
  • 非空(NOT NULL):用来约束表中的字段不能为空。
  • 默认值(Default):来约束当数据表中某个字段不输入值时,自动为其添加一个已经设置好的值。

MySQL 中,查看数据表的约束命令如下:

mysql> show create table taobao_test.order \G;
*************************** 1. row ***************************
       Table: order
Create Table: CREATE TABLE `order` (
  `order_id` int NOT NULL AUTO_INCREMENT COMMENT '订单id',
  `order_seq` char(100) NOT NULL COMMENT '订单序号',
  `order_name` varchar(200) DEFAULT NULL COMMENT '订单名称',
  `order_from` char(150) DEFAULT NULL COMMENT '商家地址',
  `order_to` char(150) DEFAULT NULL COMMENT '客户地址',
  `order_date` datetime DEFAULT NULL COMMENT '下单日期',
  `order_type` char(100) DEFAULT NULL COMMENT '订单类型',
  `order_details` varchar(200) DEFAULT NULL COMMENT '订单明细',
  `order_price` double(20,0) DEFAULT NULL COMMENT '订单原价',
  `order_totalprice` decimal(20,0) DEFAULT NULL COMMENT '订单总价',
  `custorm_name` char(100) DEFAULT NULL COMMENT '客户姓名',
  `custorm_mobile` char(100) DEFAULT NULL COMMENT '客户手机号',
  `pay_type` char(100) DEFAULT NULL COMMENT '支付类型',
  `finish_date` date DEFAULT NULL COMMENT '完成配送日期',
  PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

从order表的查询结果可以看出:

  • order_id字段使用了主键约束,并默认非空约束;
  • order_seq字段使用了非空约束;
  • 其他字段均使用了默认值约束,默认NULL。

2、约束设置与删除

①. 主键约束:

-- 设置主键约束
-- 单字段主键:在字段后面指定主键约束
CREATE TABLE `taobao_test`.`order`  (
  `order_id` int(10) PRIMARY KEY COMMENT '订单id',
  ...
} 
-- 单字段主键:在字段后面指定主键约束
CREATE TABLE `taobao_test`.`order`  (
  `order_id` int(10) COMMENT '订单id',
  ...,
  PRIMARY KEY (`order_id`)
} 
-- 联合主键:对多个字段指定主键约束
CREATE TABLE `order` (
  `order_id` int(10) COMMENT '订单id',
  `order_seq` char(100)  NOT NULL COMMENT '订单序号',
    ...,
  PRIMARY KEY (`order_id`, `order_seq`)
}  
-- 修改数据表时添加主键约束
ALTER TABLE taobao_test.order ADD PRIMARY KEY (`order_id`);

-- 删除主键约束
ALTER TABLE taobao_test.order ADD PRIMARY KEY;

注意,设置主键自增长问题:

  • 在目标字段后指定AUTO_INCREMENT 关键字即可;
  • 默认情况下,AUTO_INCREMENT 的初始值是 1,每新增一条记录,字段值自动加 1;
  • AUTO_INCREMENT 约束的字段只能是整数类型(TINYINT、SMALLINT、INT、BIGINT 等);
  • AUTO_INCREMENT 约束字段的最大值受该字段的数据类型约束,如果达到上限,AUTO_INCREMENT 就会失效;
  • 一个表中只能有一个字段使用 AUTO_INCREMENT,且该字段必须有唯一索引,以避免序号重复。

②. 外键约束:

--新增从表goods,指定dd_id字段为外键,关联主表order的主键order_id字段
-- 建表时设置外键约束
CREATE TABLE `taobao_test`.`goods` (
  `good_id` int PRIMARY KEY AUTO_INCREMENT COMMENT '商品id',
  `good_seq` char(100) NOT NULL COMMENT '商品序号',
  `good_name` varchar(200)  COMMENT '商品名称',
  `dd_id` int(10)  COMMENT '产生的订单id',
  `good_from` char(150)  COMMENT '生产地址',
  `good_type` char(100) COMMENT '商品类型',
  `good_price` double(20,0)  COMMENT '商品原价',
  `good_remake` double(20,0) COMMENT '备注',
  CONSTRAINT fk_goods_order
  FOREIGN KEY(`dd_id`) REFERENCES taobao_test.order(`order_id`)
)
-- 修改表时设置外键约束
ALTER TABLE taobao_test.goods ADD CONSTRAINT fk_goods_order
      FOREIGN KEY(`dd_id`) REFERENCES taobao_test.order(`order_id`);
      
--删除外键约束
ALTER TABLE taobao_test.goods DROP FOREIGN KEY fk_goods_order;

③. 唯一约束:

--建表时设置,在目标字段后加上UNIQUE即可
CREATE TABLE `order` (
   ...,
  `order_name` varchar(200) UNIQUE COMMENT '订单名称',
  ...
)
-- 修改表时设置外键约束
ALTER TABLE taobao_test.goods ADD 
                CONSTRAINT unique_name UNIQUE(`good_name`);

-- 删除唯一约束:
ALTER TABLE taobao_test.goods DROP INDEX unique_name;

④.检查约束:

-- 建表时设置检查约束
CREATE TABLE `order` (
   ...,
  `good_price` double(20,0)  COMMENT '商品原价',
  CHECK(good_price < 0 AND good_price >100000),
  ...
} 
-- 修改表时设置检查约束
ALTER TABLE taobao_test.goods ADD CONSTRAINT check_price_id 
                        CHECK(good_price < 0 AND good_price >100000);

-- 删除检查约束
ALTER TABLE taobao_test.goods DROP CONSTRAINT check_price_id;

五、MySQL的sql_mode模式说明

sql_mode:默认值是空值,在这种设置下是可以允许一些非法操作的,在生产环境必须将这个值设置为严格模式,所以开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题。

1、MySQL的sql_mode的四种模式

  • ANSI模式/宽松模:

对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告

  • STRICT_TRANS_TABLES模式/严格模式:

进行数据的严格校验,错误数据不能插入,报error错误。只对支持事务的表有效。

  • STRICT_ALL_TABLES模式/严格模式:

进行数据的严格校验,错误数据不能插入,报error错误。对所有表都有效。

  • STRICT_ALL_TABLES模式/严格模式:

当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误。用于事务时,会进行事务的回滚。

2、如何设置和修改sql_mode

方式一:当前会话配置

-- 查看当前会话sql_mode模式
select @@sql_mode

-- 设置当前会话sql_mode模式
set sql_mode = '修改后的值';
set session sql_mode='修改后的值';
例如:set session sql_mode='STRICT_TRANS_TABLES';

-- 改为严格模式,session可以不用写   
-- 此方法只在当前会话中生效,关闭当前会话就不生效了。

方式二:全局配置/当前服务

-- 查看全局sql_mode模式
select @@global.sql_mode
-- 设置全局sql_mode模式
set global sql_mode = '修改后的值'-- 此方法在当前服务中生效,重新MySQL服务后失效

方法三:全局配置/永久

sql_mode = STRICT_TRANS_TABLES
-- 在mysql配置文件my.cnf文件(windows系统是my.ini文件),添加sql_mode

-- 示例如下:
[mysqld] sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES

-- ONLY_FULL_GROUP_BY:限制必须是分组依据,或统计结果
-- STRICT_TRANS_TABLES:严格模式

猜你喜欢

转载自blog.csdn.net/qq_29119581/article/details/112400488