0%

MySQL

视频资源:黑马程序员完整JavaWeb快速入门教程【收藏比赞多系列】_哔哩哔哩_bilibili

MySQL下载安装

[(4条消息) MySQL8.0.18安装自定义安装_思苑-CSDN博客_mysql自定义安装](https://blog.csdn.net/qq_27009225/article/details/103956756#:~:text=我们选择 Custom:自定义安装,可以自由选择需要安装的组件、选择安装路径等。 MySQL Server:是数据库服务,要安装这个 。 MySQL Workbench:一款MySQL的ER%2F数据库建模工具。 MySQL,:是一款 MySQL 数据库的辅助工具。 它可以在系统任务栏通知区域(系统托盘) 处驻留图标,用于快捷监视、更改服务器实例(服务)的状态。 同时,也可以与一些图形化管理工具(如 MySQL Workbench)集成使用。)

官网下载,一般来说历史版本会更稳定一点。

server下载不了,require vc:
mysql的安装–visual studio C++ Redistritable Packag - whyisthatyou - 博客园 (cnblogs.com)

看着很有道理的样子,但我还是无法安装,最后将server版本换到8.0才解决。

接着在download环节卡住,一直很慢,于是我睡了一觉起来重新安装,就OK了。

安装的过程中可以修改端口。

PHPstudy相关

由于PHPstudy自带MySQL,若另外安装独立的MySQL则需要修改任意一方的端口号,否则会因为端口冲突而不能正常运行。

查看端口被占用的情况:cmd命令行下输入:

1
netstat -ano

修改PHPstudy自带MySQL的端口

旧版:

phpStudy自带的MySQL和独立安装的MySQL冲突 - 不睡 - 博客园 (cnblogs.com)

新版:

首页-MySQL配置直接修改端口

值得注意的是:修改端口后,与PHPstudy相关的数据库配置也要修改,如sqli-labs,自己创建的本地网站等,还未深入研究,下次一定!

修改独立的MySQL端口

1.安装过程中;

2.安装完成后[怎么修改mysql的默认端口号-mysql教程-PHP中文网](https://www.php.cn/mysql-tutorials-421503.html#:~:text=修改mysql的默认端口号的步骤: 1、找到MYSQL安装目录的my.ini,2、打开my.ini文件,修改port端口。直接Ctrl%2BF,搜索port,如图所示 3306为mysql默认端口号,将它修改为你想要的端口号,注意两个地方都要修改;修改完成后保存关闭。)

因为我PHPstudy端口不太方便改,所以将MySQL端口改为3366.

配置MySQL环境变量

参考网上配置环境变量后可在cmd中打开。

也可不配置,安装好后,可以在启动栏win中看到MySQL 8.0 Command Line Client,打开后也可进入mysql。

重置MySQL密码

网上搜索到的结果都是在cmd命令行中操作,不过我没有配置cmd的环境,有待探索。

MySQL数据存储

数据库—一个应用/项目

表—一个实体/对象

记录—一个实体的实例

SQL语句

不区分大小写

SQL分类

  • DDL(数据定义语言):create,drop,alter
  • DCL(数据控制语言):grant,if
  • DML(数据操纵语言):insert,update,delete
  • DQL(数据查询语言):select

简单使用SQL

对数据库进行操作

创建数据库

create database DBname

可在后面接其他参数进行字符集的指定和校对;校对主要用于表中记录的排序规则。

查看数据库

  • show databases; 查看所有数据库

  • show create database DBname; 查看某个数据库的定义信息(如字符集和校对规则)

修改数据库

alter database DBname; 修改字符集和校对规则

删除数据库

drop database DBname;

其他数据库操作

切换数据库

use DBname;

查看当前使用数据库

select database();

对数据库表进行操作

创建表

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

字段类型

Java与SQL的属性对应:

byte-tinyint short-smallint int-int long-bigint

float-float double-double

boolean-bit(01)

char-char char/string-varchar

  • char-固定长度的字符或字符串
  • varchar-可变长度的字符串

Date-date/time/datetime/timestamp

File-BLOB(二进制)/TEXT(文本)

约束(单表)

作用:保证数据的完整性

  • 主键约束:primary key(默认唯一&非空)
  • 唯一约束:unique
  • 非空约束:not null

创建表时,需要先use数据库。

查看表

  • show tables; 所有
  • desc Tabname; 查看某个表的结构信息

删除表

drop table Tabname;

修改表

  • 添加列:alter table Tabname add Colname 类型(长度) 约束;
  • 修改列类型,长度,约束:alter table Tabname modify Colname 类型(长度) 约束;
  • 删除列:alter table Tabname drop Colname;
  • 修改列名称:alter table Tabname change OldColname NewColname 类型(长度) 约束;
  • 修改表名:rename table OldTabname to NewTabname;
  • 修改表的字符集:alter table Tabname character set 字符集;

对数据库表的记录进行操作

添加

  • insert into Tabname (Col1,Col2…) values (value1,value2…); 插入某些列
  • insert into Tabname values (value1,value2…); 插入所有列

值的类型是字符串或者是日期类型,使用单引号引起来。

如果向数据库插入中文记录报错的话,可通过命令show variable like '%character%'查看数据库中与字符集相关参数。由于命令行使用gbk,所以要将MySQL数据库服务器中的客户端部分的字符集改为gbk。我用的8.0没有这种情况,如果其他版本有问题,可在my.ini中修改字符集,再重启MySQLservices.msc

修改

  • update Tabname set Col1=value1,Col2=value2; 将一列中的所有记录都修改成相同的值

  • update Tabname set Col1=value1,Col2=value2 where 条件; 可用于修改特定的一条或几条记录

update user set telephone=180 where id=1;

删除

delete from Tabname [where 条件]; 至少删除表中的一行记录,如果不加条件则默认删除表中所有记录。(DML)

tips:truncate table Tabname;将表删除再重建一个结构一样的表,可达到删除所有记录的效果。(DDL)

上述两种方法的区别与事务有关。

查看

基本查询

select [distinct] *|Col1,Col2 from Tabname [条件];

distinct: 表示去掉重复值

select后可直接执行运算:select Col1+Col2 [as Sum] from Tabname; as可以将运算结果列进行命名

时间查询:select * from 表名 where ColName between “2018-01-01” and “2018-10-31”;

Q:以select查询结果作为另一个select的查询源时报错:Every derived table must have its own alias;

A:mysql要求每一个派生出来的表都必须有一个自己的别名,那给派生表加上别名即可;例:select * from ( select * from t_shop_xs limit 10) as s where...(通过as)

条件查询

where子句

  • 比较(<,>,=,>=,=!);

  • 模糊(like),l可以使用_或者%作为占位符,一个下划线代表一个字符,一个百分号代表任意个字符(可以为null);

    select * from user where name like 'S%'

  • 范围(in/not in/between..and)select * from user where id in (1,2,3)

  • 条件(and,or,not),连接多个条件;

排序查询

order by Colname [asc/desc];

asc-升序(默认);desc-降序。

多个排序条件用逗号隔开(有优先级),即条件1有重复值时,按照条件2排序。select * from user order by 条件1 asc,条件2 desc;

tips:有条件时先写条件语句再排序

分组统计查询

聚合函数

sum(); 求和
select sum(Col1),sum(Col2) from user where 条件;
select sum(Col1+Col2) from user;
select sum(Col1)+sum(Col2) from user;
Null加上任何值都等于Null
count();
max(); min();
avg(); 平均值

group by Colname 前后对应
如果要加带有聚合函数的条件语句,不能用where,使用having。eg.select Col1,sum(Col2) from Tab group by Col1 having sum(Col2)>1 order by sum(Col2) asc;

语句顺序
1
select...from...where...group by...having...order by...;
子查询some/all

注释

单行:--space #

多行:/**/

可视化工具

在下载时,已经下载了官方的可视化工具workbench,英文界面有点为难。

简单使用参考:MySQL Workbench使用教程 (biancheng.net)

Q:无法勾选auto_increment
A:在上面勾选AI

多表

多表设计

外键约束

Foreign Key(下面使用的是命令行,用workbench操作也可)

alter table Tab1 add foreign key (Col1) references Tab2(Col2);

一般不允许外键为空alter table Tab1 modify Col1 int not null;

Q:在workbench上设置外键时失败显示:Can’t DROP ‘res’; check that column/key exists
A:对同一个表只能同时进行一种操作,即最上方的工作台只能有一个,单开,这件事做完了再去做其他的。

表间关系

一对多

建表时,在“多”的一方创建外键指向“一”这一方的主键。

多对多

创建第三方表(中间),让该表的至少两个字段作为外键分别指向两个“多”。

一对一

少见。可使用唯一外键约束或主键约束进行联系。

多表查询

连接查询

交叉连接

  • select * from Tab1 cross join Tab2;
  • select * from Tab1,Tab2;

内连接

  • select * from Tab1 inner join Tab2 on 关联条件; 显示内连接;
    三张表则嵌套join:from (tab1 join tab2 on condition1) as tab12 join tab3 on condition2
  • select * from Tab1,Tab2 where 关联条件; 隐式内连接;

inner可省略;查询的是交集。

外连接

  • select * from Tab1 left outer join Tab2 on 关联条件; 左外连接;
  • select * from Tab1 right outer join Tab2 on 关联条件; 右外连接;

outer可省略
若关联条件是Col1=Col2,left查询的是以Col1为标准的所有Tab1加上交集部分;right以Col2为标准。

交并差

事务

概念:逻辑上的一组操作,组成这组操作的各个逻辑单元,要么全部成功要么全部失败。

在MySQL中的操作

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

事务的特性

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

事务的隔离级别

隔离性相关的安全问题

如果不考虑隔离性,即受到干扰,会影响读取数据。(事务2执行sql但事务未提交时,在事务1中查询)

  • 脏读:一个事务读到另一个事务未提交的数据,导致查询结果不一致;
  • 不可重复读:一个事务读到另一个事务已经提交的update的数据,导致多次查询结果不一致。
  • 虚读/幻读:一个事务读到另一个事务已经提交的insert的数据,导致……

设置事务的隔离级别

隔离级别:

  • read uncommitted
  • read committed 避免脏读;
  • repeatable read 避免脏读和不可重复读;(mysql默认)
  • serializable 都可避免,但效率低

设置:select session transaction isolation level 隔离级别;

查看:select @@tx_isolation;