MySQL安装与初入门

it2025-12-12  1


title: MySQL安装与初入门

简略记录了个人在Windows 10环境下安装MySQL的过程,以及一些基础的SQL语句,作为备忘录。

文章目录

title: MySQL安装与初入门 0、MySQL安装0.1 准备工作0.2 安装0.3 修改root密码0.4 MySQL图形化管理工具 1、SQL 语句1.1 SQL操作数据库1.1.1 创建数据库1.1.2 查看数据库1.1.3 修改数据库1.1.4 删除数据库1.1.5 其他数据库操作 1.2 SQL操作数据库中的表1.2.1 创建表1.2.2 查看表1.2.3 修改表1.2.4 删除表 1.3 SQL操作数据库中表的记录1.3.1 添加表记录1.3.2 修改表记录1.3.3 删除表记录1.3.4 查看表记录1.3.5 查询语句总结 2、多表2.1 多表设计2.1.1 约束2.2.2 表关系 2.2 多表查询2.2.1 交叉连接2.2.2 内连接2.2.3 外连接2.2.4 子查询2.2.5 多表查询练习 3、事务3.1 事务概述3.2 事务特性3.3 事务的隔离性3.3.1 安全问题3.3.2 解决方法

0、MySQL安装

参考菜鸟教程-MySQL安装

0.1 准备工作

环境:Windows10 1909 64位

材料:MySQL安装包

配置文件:

下载好MySQL Community Server 8.0.21后,选择一个路径解压,这里我解压到了“D:\web\mysql-8.0.21-winx64”。

在该解压路径下新建一个文件:my.ini

使用文本编辑器打开"my.ini",写入以下内容,注意修改MySQL的安装路径

[client] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] # 设置3306端口 port = 3306 # 设置mysql的安装目录 basedir=D:\\web\\mysql-8.0.21-winx64 # 设置 mysql数据库的数据的存放目录,MySQL 8+ 不需要以下配置,系统自己生成即可,否则有可能报错 # datadir=C:\\web\\sqldata # 允许最大连接数 max_connections=20 # 服务端使用的字符集默认为8比特编码的latin1字符集 character-set-server=utf8 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB

准备工作完成后,MySQL文件夹下的目录应如下所示

0.2 安装

1、在路径"C:\Windows\System32"中找到"cmd.exe",右击,以管理员方式运行

2、进入MySQL安装路径下的bin目录中,我这里是"D:\web\mysql-8.0.21-winx64\bin",如果MySQL安装在其他盘,可以先输入"盘符:",回车,切换硬盘后,再使用"cd"命令进入相应的bin目录

3、初始化数据库,输入以下>后的命令,然后等待命令窗口执行完成

>mysqld --initialize --console

4、执行完成后,在最下面会出现root用户的初始密码,如

... 2018-04-20T02:35:05.464644Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: APWCY5ws&hjQ ...

其中"APWCY5ws&hjQ"就是初始密码,务必记录保存好,之后会介绍如何修改密码

5、安装,输入以下命令

>mysqld install

6、启动,安装完成后,输入以下命令

>net start mysql

7、以root账户登录,提示MySQL服务启动后,输入以下命令,回车确认后出现"Enter password:",输入初始密码

>mysql -u root -p

8、登录成功后,出现如下界面

0.3 修改root密码

修改root密码有两种情况,第一种情况是在能登录进MySQL的情况下修改,第二种情况是在忘记密码,不能登录进MySQL的情况下修改。

能登录MySQL

输入以下SQL语句,其中’newpassword’中就是新密码,注意最后要加英文的分号

>alter user 'root'@'localhost' identified by 'newpassword';

忘记初始密码,不能登录MySQL

这里直接贴上链接,里面的讲解十分详细

0.4 MySQL图形化管理工具

MySQL本身没有提供图形管理工具,日常的开发和维护需要在命令行窗口中进行,所以对于编程初学者来说,上手就略微有点困难,增加了学习成本。这里推荐几款MySQL图形化处理工具:

Navicat:适合初学者,和微软SQLServer的管理器很像,易学易用,支持中文,14天试用。

SQLyog:轻量级,易于使用、快速而简洁,需要注册码。

1、SQL 语句

1.1 SQL操作数据库

1.1.1 创建数据库

create database 数据库名称 [character set 字符集 collate 字符集校对规则];

1.1.2 查看数据库

查看所有数据库 show databases; 查看某个数据库的具体信息 show create database 数据库名称;

1.1.3 修改数据库

alter database 数据库名称 character set 字符集 collate 校对规则;

1.1.4 删除数据库

drop database 数据库名称;

1.1.5 其他数据库操作

切换数据库 use 数据库名称; 查看正在使用的数据库 select database();

1.2 SQL操作数据库中的表

1.2.1 创建表

先切换到某个具体的数据库:use 数据库名称

create table 表名称(字段名称 字段类型(长度) 约束,字段名称 字段类型(长度) 约束……);

字段类型

Java中的类型MySQL中的类型byte/short/int/longtinyint/smallint/int/bigintfloatfloatdoubledoublebooleanbitchar/Stringchar和varchar类型Datedate/time/datetime/timestamp

注:

char和 varchar的区别:

char代表是固定长度的字符或字符串

varchar代表的是可变长度的字符串

datetime和timestamp区别:

datetime就是既有日期又有时间的日期类型,如果没有向这个字段中存值,数据库使用null存入到数据库中

timestamp也是既有日期又有时间的日期类型,如果没有向这个字段中存值,数据库使用当前的系统时间存入到数据库

字段约束

主键约束:primary key

唯一约束:unique

非空约束:not null

1.2.2 查看表

先切换到某个具体的数据库:use 数据库名称

查看某个数据库下所有的表 show tables; 查看某个表的具体结构 desc 表名称;

1.2.3 修改表

对列

添加列 alter table 表名称 add 列名称 类型(长度) 约束; 删除列 alter table 表名称 drop 列名称; 修改列名 alter table 表名称 change 旧列名 新列名 类型(长度) 约束; 修改列的类型、长度、约束 alter table 表名称 modify 列名 新类型(新长度) 新约束;

对表

修改表名 rename table 表名称 to 新表名; 修改表的字符集 alter table 表名称 character set 字符集;

1.2.4 删除表

drop table 表名称;

1.3 SQL操作数据库中表的记录

1.3.1 添加表记录

插入某几列 insert into 表名称 (列1, 列2, 列3,...) values (值1, 值2, 值3,...); 插入所有列 insert into 表名称 values (值1, 值2, 值3,...);

1.3.2 修改表记录

update 表名称 set 列1=值1, 列2=值2, ... [where 条件];

1.3.3 删除表记录

delete from 表名称 [where 条件]; #一条一条地删除记录,属于DML语句,可以rollback. truncate table user; #删除所有记录,再重建一个结构相同的表,属于DDL语句,不能rollback.

1.3.4 查看表记录

基本查询 select [distinct] *|列1[as 列别名],列2,... from 表名称; 条件查询 select [distinct] *|列1[as 列别名],列2,... from 表名称 [where 条件];

比较查询:>, >=, <, <=, =, <>

模糊查询:like [’_‘表示一个字符,’%'表示任意字符]

范围查询:in

条件关联:and, or, not

排序查询 select [distinct] *|列1[as 列别名],列2,... from 表名称 [[where 条件] order by 列名1 asc|desc,列名2 asc|desc];

分组统计查询

聚合函数 sum();count();max();min();avg(); 分组查询 select [distinct] *|列1[as 列别名],列2,... from 表名称 group by 条件1 having 条件1的条件;

1.3.5 查询语句总结

SFWGHO(select……from……where……group by……having……order by……)

2、多表

2.1 多表设计

2.1.1 约束

添加外键约束

alter table 表名称1 add foreign key (外键) references from 表名称2(主键);

2.2.2 表关系

一对一

一对多

多对多

2.2 多表查询

2.2.1 交叉连接

select * from 表名称1 cross join 表名称2; #相当于笛卡尔积 select * from 表名称1, 表名称2; #与cross join效果相同

2.2.2 内连接

select * from 表名称1 inner join 表名称2 on 关联条件; #显式内连接,相当于自然连接inner可不写,默认为内连接 select * from 表名称1, 表名称2 where 关联条件; #隐式内连接

2.2.3 外连接

select * from 表名称1 left outer join 表名称2 on 关联条件; #保留左边表1的含null记录(此记录对应的右边表2的记录全为null),outer可省略 select * from 表名称1 right outer join 表名称2 on 关联条件; #保留右边表2的含null记录(此记录对应的左边表1的记录全为null)

2.2.4 子查询

带 in 子查询带 exists 子查询带 any 子查询带 all 子查询 #带in的子查询 SELECT * FROM classes WHERE cid IN (SELECT cno FROM student WHERE birthday>'1991-01-01'); #带exists的子查询 SELECT * FROM classes WHERE EXISTS (SELECT cno FROM student WHERE birthday>'1991-01-01'); #只要exists后面的子查询为true,则执行exists前面的语句 #带any的子查询 SELECT * FROM classes WHERE cid>ANY (SELECT cno FROM student) #大于任意一个 #带all的子查询 SELECT * FROM classes WHERE cid>ALL (SELECT cno FROM student) #大于全部

2.2.5 多表查询练习

#查询班级名称和班级总人数 SELECT cname, COUNT(*) FROM classes c JOIN student s ON c.`cid`=s.`cno` GROUP BY c.`cid`; # 查询学生姓名以及学生所选的总课程的平均成绩 SELECT s.`sname`, AVG(sc.`score`) FROM student s JOIN sc ON s.`sid`=sc.`sno` GROUP BY s.`sid`; # 查询学生的姓名和学生的选课总数,显示选课超过2门学生姓名 SELECT s.sname, COUNT(*) FROM student s JOIN sc ON s.`sid`=sc.`sno` GROUP BY s.`sid` HAVING COUNT(*)>2; # 查询平均成绩大于80分的学生的总数 SELECT COUNT(*) FROM student s WHERE s.sid IN(SELECT sc.sno FROM sc GROUP BY sc.sno HAVING AVG(sc.score)>80); # 查询学生姓名和平均成绩,但是平均成绩大于01班的任何一个学生的平均成绩

3、事务

3.1 事务概述

开启事务:start transaction;提交事务:commit:回滚事务:rollback;

3.2 事务特性

原子性 原子性:事务的不可分割,组成事务的各个逻辑单元不可分割 一致性 一致性:事务执行的前后,数据完整性保持一致 隔离性 隔离性:事务执行不应该受到其他事务的干扰 持久性 持久性:事务一旦结束,数据就持久化到数据库中

3.3 事务的隔离性

3.3.1 安全问题

隔离性:一个事务的执行,不应该受到其他事务的干扰。

如果不考虑隔离性(一个事务执行受到其他的事务的干扰),引发一些安全问题,主要体现在读取数据上:

脏读:一个事务读到了另一个事务未提交的效据,导致查询结果不一致

不可重复读:一个事务读到了另ー个事务已经提交的 update的数据,导致多次查询结果不一致

虚读/幻读:一个事务读到了另一个事务已经提交的 insert的数据,导致多次查询结果不一致

3.3.2 解决方法

设置事务的隔离级别:

read uncommitted:脏读,不可重复读,虚读都有可能发生read committed :避免脏读。但是不可重复读和虚读是有可能发生repeatable read :避免脏读和不可重复读,但是虚读有可能发生serializable(串行化): 避免脏读,不可重复读,虚读 #设置事务的隔离级别的语句: set session transaction isolation level 隔离级别; #查看当前的隔离级别 select @@transaction_isolation; #8.0之后 select @@tx_isolation; #8.0之前
最新回复(0)