MySQL 零基础详细讲解(基础部分)
1、数据库的基本了解
数据库的介绍
存储和管理数据的仓库 英文单词为 Database,简称 DB 数据中的数据是有组织的进行存储的 MySQL 由瑞典 MySQL AB 公司开发,后来被 Sum 公司收购,Sum 公司又被 Oracle 收购
数据库的优点
永久保存 通过 SQL 语句比较方便的操作数据库
2、MySQL 安装
下载 MySQL
搜索 MySQL 官网:MySQL :: Download MySQL Community Server

点击下载

下载完之后解压到自己想要存放的路径
记住你自己的存放路径

创建 my.ini 文件
首先创建一个文本,填入下列内容,再将后缀名改成 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
# 服务端使用的字符集默认为utf8mb4
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
#mysql_native_password
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[client]
# 设置mysql客户端连接服务端时默认使用的端口,不建议修改,这是公认端口号
port=3306
default-character-set=utf8mb4

初始化 MySQL
win+r,输入 cmd,在切换到你的 MySQL 目录下,==这里要管理员运行 cmd==
cd C:\Program Files\MySQL\bin
mysqld --initialize --console
==注意复制临时密码==

安装启动 MySQL
mysqld --install
net start mysql

登录 MySQL
mysql -u root -p刚才复制的密码

修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

打开电脑添加环境变量

将 MySQL 的路径添加进去就成功了

3、MySQL 登录
使用 DOS 命令行登录
#第一种
mysql -uroot -p123456
#第二种
mysql -uroot -p
#登录远程的MySQL
mysql -uroot -p123456 -h远程ip
==如果报错这个,说明密码错了==
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
使用其他图形化软件登录
SQLyog Navicat DataGrip 等等有很多
4、MySQL 相关概念
数据库、表、数据的关系
MySQL 服务器中可以创建多个数据库 每个数据库可以存放多张表 每个表可以存储多条数据记录
SQL 的介绍
结构化查询语言,一门操作关系型数据库的编程语言。
定义操作所有关系型数据库的统一标准,每一个数据库操作方式可能会存在一些不同的地方。

==通用语法规则:==
SQL 语句可以单行或者多行书写,以分号结尾 MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写 单号注释:-- 注释内容 # 注释内容(MySQL 特有) 多行注释: /_ 注释内容 _/
5、DDL 操作
==DDL (Data Definition Language):== 数据库定义语言,用来定义数据库对象:数据库,表,列等
5.1、DDL 操作数据库
查询所有数据库
show databases;
创建数据库
-- 直接创建数据库db1,db2
create database db1;
create database db2;
-- 判断是否存在并创建数据库db2,db3
create database if not exists db3;
-- 判断是否存在并创建数据库db4
create database if not exists db4;
删除数据库
-- 删除db4数据库
drop database db4;
-- 判断数据库存在才删除db4,db3
drop database if exists db3;
drop database if exists db4;
使用(选中)数据库
-- 切换数据库到db1
use db1;
5.2、DDL 操作表
创建表格
==创建表格格式:==
CREATE TABLE 表名(
字段名 数据类型,
字段名 数据类型,
...
字段名 数据类型
);
常用的数据类型
int | 整数类型 |
---|---|
double | 小数类型 |
varchar(长度) | 字符串类型 |
data | 日期类型:yyyy-MM-dd |
创建表格
/*
创建商品表(goods)包含:
商品名称(name),
商品价格(price),
商品销量(sales_volume),
商品生产日期(produced_date)
*/
create table goods(
NAME VARCHAR(20),
PRICE DOUBLE,
SALES_VOLUME INT,
PRODUCED_DATE DATE
);
/*
需求:设计一张学生表,请注重数据类型、长度的合理性
编号, 整数
姓名, 姓名最长不超过10个汉字
性别, 因为取值只有两种可能,因此最多一个汉字
生日, 取值为年月日
入学成绩, 小数点后保留两位
邮件地址, 最大长度不超过 64
家庭联系电话, 不一定是手机号码,可能会出现 - 等字符,20位以内
*/
create table Student(
ID int,
NAME varchar(10),
SEX char(1),
BIRTHDAY date,
SOCRE double(5,2),
EMAIL varchar(64),
PHONE varchar(20)
);
查看所有表
-- 查看db1数据库中的所有表
show tables;
查看表结构
-- 查看表结构
desc goods;
删除表
-- 直接删除表student表
drop table Student;
修改表名
-- 将goods改名成goods2
ALTER TABLE goods RENAME TO goods2;
增加新字段
-- 为goods2表添加一个新的字段img,类型为varchar(20)
ALTER TABLE goods2 ADD IMG VARCHAR(20);
修改字段数据类型
-- 将goods2表中的img字段的改成varchar(100)
ALTER TABLE goods2 MODIFY IMG varchar(100);
修改字段名和数据类型
-- 将goods2表中的img字段名改成icon,类型varchar(80)
ALTER TABLE goods2 CHANGE IMG ICON varchar(80);
删除某一字段
-- 删除goods2表中的字段icon
ALTER TABLE goods2 DROP ICON;
6、DML 操作
==DML (Data Manipulation Language):== 数据操作语言,用来对数据库中表的数据进行增删改
6.1、DML 新增数据
给指定添加数据
==格式:== insert into 表名 (字段一,字段二...) values (数据一,数据二...);
-- 插入数据, 给指定列添加数据 给goods表添加一条数据 NAME='格力空调', price=3699
-- 注意:在MySQL中字符串可以使用""或'', 建议''
insert into goods2(NAME,PRICE) values ('格力空调',3400);
-- 插入数据, 所有的字段名都写出来(少数做法)
-- 注意:日期使用''
insert into goods2(NAME, PRICE, SALES_VOLUME, PRODUCED_DATE) values('美的',3500,1000,'2023-10-26');
不写字段名插入所有数据
-- 插入数据, 插入所有字段不写字段名(常用做法)
-- '小米11', 4999, 300, '2021-03-22'
insert into goods2 values ('小米11', 4999, 300, '2021-03-22');
一次性插入多行数据
-- 扩展:一条SQL语句加入多条数据, VALUES 后面可以跟多个(), 一个()对应一条数据
-- 'iPhone 12', 6799, 12000, '2020-10-28'
-- 'DELL 7590', 8799, 300, '2019-06-18'
-- '立白洗衣粉', 12.9, 39000, '2018-02-13'
insert into goods2 values ('iPhone 12', 6799, 12000, '2020-10-28'),
('DELL 7590', 8799, 300, '2019-06-18'),
('立白洗衣粉', 12.9, 39000, '2018-02-13');
==注意:==
字段名和值的数量要对应 值的类型和字段类型要对应 除了数值类型,其他数据类型的数据都要加引号(单引号和双引号都行)
6.2、DML 修改数据
==格式:== UPDATE 表名 SET 字段名=新的值 [WHERE 条件];
不带条件修改数据
-- 不带条件修改数据,将所有的price改成0 这样子会修改所有的price
update goods2 set PRICE = 0;
带条件修改
-- 带条件修改数据,把name为'华为P40'的商品price改成5999
update goods2 set PRICE = 4999 where NAME = '华为P40';
一次修改多列
-- 一次修改多个列,把name为'小米11'的商品price改成3999, sales_volume改成10000
update goods2 set PRICE = 3999 , SALES_VOLUME = 10000 where NAME = '小米11';
6.3、删除表中的数据
==格式:== DELETE FROM 表名 [WHERE 条件];
带条件删除数据
-- 带条件删除数据,删除name为'小米11'的数据
delete from goods2 where NAME = '小米11';
不带条件删除
-- 不带条件删除数据,删除表中的所有数据
delete from goods2;
7、DQL 操作
==DQL:== 数据查询语言,用来查询数据库中表的记录(数据)
7.1、DQL 基础查询
查询指定字段
-- 查询goods2表中的 name 和 price 列
select NAME,price from goods2;
查询所有字段的数据
-- 细节:查询只是查看数据,不会修改表中数据
-- 查询goods2表中所有字段
select * from goods2;
去重查询
-- 去除重复查询: DISTINCT
select distinct NAME from goods2;
计算查询
-- 扩展:查询每个商品的销售额price * sales_volume
select price * sales_volume from goods2;
给查询列名取别名
-- 查询goods2表中的 name 和 price 列
-- name列的别名为 商品名称,price列的别名为 价格
select NAME as 商品名称 , price as 价格 from goods2;
7.2、DQL 条件查询
==格式:== select 字段名 from 表名 where 条件;
条件查询
-- 查询price大于1000的商品
select * from goods2 where price > 1000;
-- 查询sales_volume小于5000的商品
select * from goods2 where sales_volume < 5000;
-- 查询price不等于6799的商品
select * from goods2 where price != 6799;
逻辑运算符
-- 逻辑运算符
-- 查询price大于1000且sales_volume小于500的商品(两个条件同时满足)
select * from goods2 where price > 1000 and sales_volume < 500;
-- 查询price大于8000 或 sales_volume小于100的商品(两个条件其中一个满足)
select * from goods2 where price > 8000 or sales_volume < 100;
-- 查询name是华为P40和小米11和米糊的商品
select * from goods2 where NAME = '华为P40' or NAME = '小米11' or NAME = '米糊';
-- in: 在...里面,只要是满足()里面的数据都可以
-- 查询name是 华为P40 和 小米11 和 米糊 的商品
select * from goods2 where NAME in ('华为P40' , '小米11' , '米糊');
-- 扩展:查询name不是华为P40和小米11和米糊的商品
select * from goods2 where NAME not in('华为P40' , '小米11' , '米糊')
-- 范围: BETWEEN 值1 AND 值2 -- 表示从值1到值2范围,包头又包尾
-- 查询price大于等于1000,且小于等于5000的商品
select * from goods2 where price between 1000 and 5000;
-- 扩展:查询商品名称是null的商品
select * from goods2 where NAME is null;
-- 扩展:查询商品名称不是null的商品
select * from goods2 where NAME is not null;
7.3、DQL 模糊查询
==格式:== select * from 表名 where 字段名 LIKE '通配符字符串'
MySQL 通配符有两个
% :表示任意多个字符 _ : 表示一个字符
模糊查询
-- 模糊查询like
-- 查询米开头的商品
select * from goods2 where NAME like '米%';
-- 查询商品名称中包含'米'字的商品
select * from goods2 where NAME like '%米%';
-- 扩展:查询名称第二个字为米的商品
select * from goods2 where NAME like '_米';
-- 扩展:查询商品名称为4个字的
select * from goods2 where NAME like '____';
7.4、DQL 查询排序
==格式:== select 字段名 from 表名 order by 列名 排序方式;
==排序方法==
AES 升序 DESC 降序
查询排序
/* 查询排序 */
-- order by 表示排序, ASC升序, DESC降序
-- 单列排序
-- 查询所有数据,使用price升序排序
select * from goods2 order by price ASC;
-- 查询所有数据,使用price降序排序
select * from goods2 order by price DESC;
-- order by 默认是升序
select * from goods2 order by price
-- 组合排序
-- 查询所有数据,在price降序排序的基础上,如果price相同再以sales_volume降序排序
select * from goods2 order by price DESC,sales_volume DESC;
7.5、DQL 复杂查询-聚合函数
五个聚合函数
count:统计指定列记录数 sum:计算指定列的数值和 max:计算指定列的最大值 min:计算指定列的最小值 avg:计算指定列的平均值
==格式:== SELECT 聚合函数(字段) FROM 表名;
代码演示
-- 查询商品个数, COUNT统计时会忽略NULL值
select count(NAME) from goods2;
-- COUNT最好的处理方式, *表示所有列理解为统计行数,最准确
select count(*) from goods2;
-- 扩展用法:统计price大于1000的总个数
select count(*) from goods2 where price > 1000;
-- 查询所有商品总销量
-- 总销量是把所有商品的销量加起来
select sum(sales_volume) from goods2;
-- 查询销量最高的商品
select max(sales_volume) from goods2;
-- 查询商品平均价格
select avg(price) from goods2;
-- 扩展:让小数显示指定的位数(2位)
-- ROUND(数据, 小数位数)
select round(avg(price),2) from goods2;
7.6、DQL 复杂查询-分组查询
==格式:== select 字段名 from 表名 group by 字段名;
代码演示
/* 分组查询 */
-- 按商品类型分组
select category from goods2 group by category;
-- 查询每种类型的商品数量
select category,count(*) as '数量' from goods2 group by category;
-- 查询销量大于100的商品,按商品类型分组,统计每组的数量,并只显商品类型数量大于2的数据
-- having 也是用来筛选的,但是一般都是分组后和聚合函数一起用
select category,count(*) from goods2 where sales_volume > 100 group by category having count(*) > 2;
7.7、DQL 复杂查询-分页查询
LIMIT
LIMIT 是限制的意思,作用是获取部分查询的数据 ==格式:== select * from 表名 LIMIT offset,length offset 是指偏移量,可以认为是跳过的记录数量,不写则默认为 0 length 是只需要显示的总记录数
代码演示
-- 假设我们一每页显示3条记录的方式来分页,SQL语句如下:
-- 第一页: 跳过0条, 获取3条, 如果跳过的条数是0,offset可以省略
select * from goods2 limit 3;
-- 第二页: 跳过3条, 获取3条
select * from goods2 limit 3,3;
-- 第三页: 跳过6条, 获取3条
select * from goods2 limit 6,3;
-- 第四页: 跳过9条, 获取3条
select * from goods2 limit 9,3;
-- 如何实现动态呢,我们不能一直去写sql语句实现固定
-- 计算公式:起始索引 = (当前页码-1) * 每页显示的条数
发表评论