MySQL基础【通俗易懂】

一、MySQL的环境搭建

1.1、window镜像下载

镜像下载:FileHorse.com / Free Software Download for Windows

MySQL下载:MySQL

注意:每一条SQL语言结束都要有分号,关键字之间以空格进行分割

window终端启动MySQL:

# 停止MySQL:win+R输入net stop mysql80
​
# 开启MySQL:win+R输入net start mysq80

1.2、Ubuntu安装MySQL

1)更新apt-get包管理器----在安转MySQL之前应该检验apt-get包管理器为最新版本

sudo apt-get update

2)使用apt-get安装MySQL---MySQL服务器由mysql-server提供

# 服务端安装:sudo apt-get install mysql-server
# 客户端安装:sudo apt-get install mysql-client

3)启动MySQL

sudo systemctl start mysql || sudo service mysql start

4)检查MySQL状态---如果正常运行会看到active(running)

sudo systemctl status mysql

5)设置MySQL自启动

sudo systemctl enable mysql

1.3、设置MySQL远程登录

1)先进入数据库

use mysql;

2)查询用户信息

select host,user from user;

3)将其中一个host值改为%---表示可以在任意地方登录

update user set host = '%' where host = '要改的host名'

4)刷新权限表或重启MySQL

flush privilegs;

二、DDL-数据库和表操作

2.1、查询数据库

## 显示当前MySQL中的数据库列表
show databases;
​
## 查询当前数据库
select database();
​
## 显示指定名称的创建的数据库类型格式
show create databases 数据库名称;

2.2、创建数据库

## 创建数据库
create database 数据库名称;
​
## 创建数据库名称,当指定数据库名称不存在时创建
create database if not exists 数据库名称;
​
## 在创建数据库的时候指定数据库的字符集
create database 数据库名称 character set utf8;

2.3、修改数据库字符集

## 修改数据库的字符集
alter database 数据库名称 character set utf8;

2.4、删除数据库

## 删除数据库
drop database 数据库名;
​
## 如果数据库存在就删除数据库
drop database if exists 数据库名;

2.5、使用切换数据库

use 数据库名;

2.6、创建数据表

在小括号中定义列表名,需要通过逗号分割,最后一个字段没有逗号

  • char(8):不可变字符串(定长,如果长度不够自动补0)

  • varchar(20):可变字符串(一个字符占两个字节)

  • not noll:约束不能为空

  • unique:约束不可重复

## 创建数据表之前要确定使用的数据库
create table students(
  stu_num char(8) not null unique,   ## 定义学号为不可变字符集不为空切不重复
    stu_name varchar(20) not null,     ## 定义名字为可变字符串且不为空
    stu_gender char(2) not null      ## 定义性别为不可变字符串且不为空
);

2.7、查询全部数据表

show tables;

2.8、查询表结构

desc 表名;
​
# 查询指定表的建表语句
show create table 表名;

2.9、删除数据表

## 删除数据表
drop table 表名;
​
## 如果表名存在就删除
drop table if exists 表名;

2.10、修改数据表数据

## 修改表名
alter table 表名 rename to 新表名;
​
## 修改表的字符集
alter table 表名 character set utf8;
​
## 添加字段----在指定表中添加字段
alter table 表名 add 字段名 字段类型;
​
## 修改字段的名称和类型
alter table 表名 change 旧字段名 新字段名 新字段类型;
​
## 只修改字段类型
alter table 表名  modify 字段名 新字段类型;
​
## 删除字段
alter table 表名 drop 字段名;

2.11、数据类型

注意:前三种数字类型使用少,一般整数类型直接使用int或integer,如果数值过大使用bigint,同样浮点数类型一般默认使用double类型。

数值类型 内存空间大小 说明
tinyint 1byte 特小性整数
smalint 2byte 小型整数
mediumint 3byte 中型整数
int/integer 4byte 整数
bigint 8byte 大型整数
float 4byte 单精度
double 8byte 双精度
decimal decimal(10,2)表示数值有10位小数两位

注意:在数据库中存储图片或者视屏音频等内容,一般是存储文件在服务器上的路径,如果非要存储就需要将图片等数据转换成二进制数据,所以blob类型可以存储所有类型,但前提是要转换成二进制。

longtext一般用于varchar类型存不下的时候

字符串类型 字符长度 说明
char 0-255字节 定长字符串,char(n)数据少于n,自动补0
varchar 0-65535字节 可变长度字符串
tinyblob 0-255字节 存储二进制字符串
blob 0-65535字节 存储二进制字符串
mediumblob 0-1677215字节 存储二进制字符串
longblob 0-4294967295 存储二进制字符串
tinytext 0-255 文本数据(字符串)
text 0-65535 文本数据(字符串)
mediumtext 文本数据(字符串)
longtext 文本数据(字符串)
日期类型 格式 说明
date 2023-09-03 只存储年月日
time 11:23:33 只存储时分秒
year 2023 年份
datatime 2023-09-09 11:23:33 存储年月日时分秒
timestamp 20230909 112333 日期加时间

枚举类型:

# 格式:字段名 enum('值1','值2',·····)   
gender enum('男','女')        ## gender的值只能选择其一

2.12、字段约束

  • 非空约束(not null):限制此字段的值必须提共,不能为null

  • 唯一约束(unique):表中的字段中,此字段的值不能重复

  • 主键约束(primary key):非空+唯一,能够唯一标识数据表中的一条数据

  • 外键约束(foreign key):建立不同表之间的关联关系

  • 主键自动增长(auto_increment):设置主键的字段会自动增长,且类型必须为int类型

  • 检查约束(check):保证字段值满足某一个条件

删除数据表中主键约束:

alter table 表名 drop primary key;

创建表之后添加主键约束:

## 创建表时没有添加主键约束,创建表后添加
alter table 表名 modify 需要设置主键的字段名 字段类型 primary key;

设置主键自动增长:

create table 表名 (
  字段1 类型 primary key auto_increment, ##设置字段1为自动增长的主键约束
    字段2 类型
);

联合主键:将数据表中的多列组合一起设置为表的主键

## 学生1的1号课程成绩联合起来才能唯一
create table 表名(
  学生id 类型,
    课程id 类型,
    score int,
    primary key(学生id,课程id)
);
​
##不能这样定义----相当于定义了两个主键
create table 表名(
  学生id 类型 primary key,
    课程id 类型 primary key,
    score int
);

三、DML-数据操纵

3.1、插入数据

## 格式语法
insert into 表名(各字段名) values(个字段所对应的值);
## 示例----sql语句中单引号代表字符串
​
## 向数据表中添加数据
insert into 表名(字段1,字段2,字段3,字段4,字段5) 
values('字段1值','字段2值','字段3值','字段4值','字段5值');
​
## 向数据表中添加数据--省略字段,但值的顺序需要和建表语句顺序相同
insert into 表名 value('值',······);

3.2、删除数据

## 语法格式
delete from 表名 where 通过什么条件;
​
## 删除学号为2033的学生信息
delete from 表名 where 字段名=2033;
​
## 删除年龄大于20的(如果满足多条就删除多条)
delete from 表名 where 字段名>20;
​
## 如果删除语句没有where,表示删除表中的所有数据
delete from 表名;

3.3、修改数据

## 格式语法
update 表名 set 需要修改的字段=修改的值 where 条件;
​
## 将学号为222002的学生姓名修改为张三(修改一次)
update 表名 set 字段名='张三' where 字段名='222003' ## where后面相当于查找条件
​
## 修改多条数据--用逗号隔开
update 表名 set 字段1='值',字段2='值' where 条件;
​
## 修改数据时不加where--表示将表中对应字段的全部数据修改
update 表名 set 字段='值';

四、DQL-数据查询

4.1、查询基础语法

## 格式语法--如果要查询的字段有多个中间用逗号隔开
select 要查询的字段名 from 表名;
​
## 查询全表---不建议使用,表中数据过多,效率低
select * from 表名;

注意:where 表示用于筛选特定的条件,可以指定查询的条件

4.2、条件关系运算符

##   !=    <> 不等于
select * from 表名 where 字段名 != '值' ## 表示该表中字段名不等于该值的有
select * from 表名 where 字段名 <> '值'
​
##  between 起始值 and 终止值   
select * from 表名 where 字段名 between 10 and 20;   ## 表示查询字段在[10,20]的所有
​
## is null---判断是否为空
select * from 表名 where 字段名 is null;     ## 查找指定字段为空的值

4.3、条件逻辑运算符

##  and 并且--筛选的多个条件同时满足的记录
select * from 表名 where 条件1 and 条件2;
​
##  or 或者--筛选多个条件中至少满足一个的记录
select * from 表名 where 条件1 or 条件2;
​
## in(条件1,条件2)----筛选多个条件中至少满足一个的记录
select * from 表名 where in(条件1,条件2,····)
​
## not 取反
select * from 表名 where 字段名 not between 10 and 20;  ## 不在该区间的所有

4.4、LIKE模糊查询

select * from 表名 where 字段名 like 'reg';

在like关键字后的reg表达式中:

  • % 表示任意多个字符【%o% 表示包含字母o】

  • _ 表示任意一个字符【_o% 表示第二个字母为o】

## 查询学生姓名带字母o的学生信息
select * from 表名 where 字段名 like '%o%';
​
## 查询第一个为张的信息
select * from 表名 where 字段名 like '张%';
​
## 查询最后一个字母为o的信息
select * from 表名 where 字段名 like '%o';
​
## 查询第二个字母为o的信息
select 需要查询的字段名 from 表名 where 条件字段名 like '_o%';

4.5、查询结果的处理

对数据表中查询到的数据进行处理后显示出来

## 显示表中姓名和年龄的所有信息
select stu_name,stu_age from 表名;
​
## 进行模糊查询出生年---出生年 = 当年 - 年龄
select stu_name,2023-stu_age from 表名;
​
## 取别名----使用as关键字
select stu_name,2023-stu_age as 别名称[出生年] from 表名;
​
## 去重--使用distinct关键字从查询的结果中消除重复
select distinct stu_age from 表名;   ## 查看表中的年龄有哪些不需要重复

4.6、排序-order by

将查询到满足条件的数据进行排序

select * from 表名 where 查询条件 order by 需要按照排序的字段 desc/asc;

order by 需要按照排序的字段--表示查询的结果按照指定字段排序

  • asc 表示按照指定的字段升序排列(默认)

  • desc 表示按照指定的字段降序排列

单字段排序:

select * from 表名 where 查询条件 order by 指定的字段 desc;

多字段排序:--先按照第一个规则排序,再按照第二个规则排序--用逗号分隔

# 先按照指定字段1降序排列,在按照指定字段2升序排列相同的字段1
select * from 表名 where 条件 order by 指定字段1 desc,指定字段2 asc;

4.7、聚合函数

SQL中提供了一些可以对查询的记录的字段进行计算的函数-----聚合函数

  • count(参数为需要统计的字段) 统计函数---统计满足条件的 指定字段的个数

## 不指定条件----统计的是表中的数据
select count(拿那个字段统计) from 表名;
​
## 指定条件后查询到的个数
select count(字段) from 表名 where 条件;
  • max(指定的字段) 计算最大值---查询满足条件记录中指定字段的最大值

## 不指定条件
select max(指定字段) from 表名;
​
## 指定条件
select max(指定字段) from 表名 where 条件;
  • min(指定字段) 计算最小值---查询满足条件记录中指定字段的最小值

  • sum(指定字段) 计算和---查询满足条件记录中指定字段的总和

## 不指定条件
select sum(指定字段) from 表名;
​
## 指定条件--计算指定条件下的和
select sum(指定字段) from 表名 where 条件;
  • avg(指定字段) 求平均值---查询满足条件记录中指定字段的平均值

## 不指定条件
select avg(指定字段) from 表名;
​
## 指定条件--计算指定条件下的和
select avg(指定字段) from 表名 where 条件;

4.8、日期函数

当我们向日期类型字段添加数据的时,可以通过字符串赋值(格式必须为:yyyy-MM-dd hh:mm:ss

  • curdate()获取当前日期------年-月-日

  • curtime()获取当前时间-------时:分:秒

  • now()获取当前日期和时间-----yyyy-MM-dd hh:mm:ss

  • year()--获取指定日期的年份

    select year(now())
  • month()--获取指定日期的月份

    select month(now())
  • day()--获取指定日期的天

    select day(now())
  • date_add(date,interval expr type)---时间值加上type类型时间间隔expr返回一个日期

    # 当前时间加上70天后的时间
    select date_add(now(),interval 70 day);
    # 当前时间往后推7个月
    select date_add(now(),interval 7 month);
  • datediff(date1,tate2)---返回起始时间date1和结束时间date2之间的天数

    select datediff('2021-12-01','2022-12-01');

如果我们想要获取当前系统的时间来添加到日期类型的字段时,可以使用now() 或者sysdate()函数

## 通过字符串类型给日期类型添加数据
insert into 表名(字段1,字段2,日期型字段) values('字段1值','字段2值','2023-09-09');
​
## 通过now()获取当前系统时间
insert into 表名(字段1,字段2,日期型字段) values('字段1值','字段2值',now());
​
## 通过sysdate()获取系统时间
insert into 表名(字段1,字段2,日期型字段) values('字段1值','字段2值',sysdate());

4.9、字符串函数

  • concat(字段1,'拼接格式',字段2) 拼接函数

select concat(字段1,'-',字段2) from 表名;
  • upper(指定字段) 将字段的值转化为大写

select upper(指定字段) from 表名;
  • lower(指定字段) 将指定字段转换为小写

select lower(指定字段) from 表名;
  • substring(指定字段,start,len) 从指定字段中截取部分显示

## 表示从指定字段的第8位开始,截取4位长度的字符串
select substring(指定字段,8,4) from 表名;
  • trim()去除前后空格

select trim(' heool  eoke ')
  • rpad和lpad前后添加指定字符

# 格式:lpad(str,n,pad)---左填充,用字符串pad对str左边进行填充,达到n个字符长度
update 表名 set 字段名 = lpad(字段名,n,'0')

4.10、分组查询-group by

分组-----就是将数据表中的记录按照指定的类进行分组

while和having的区别:

  • 执行时机不同:where是分组之前进行过滤,不满足where条件不进行分组,而having是分组之后对结果进行过滤

  • 判断条件不同:where不能对聚合函数进行判断,而having可以

## []中的限制可有可无,group by 和 having 一起使用
select 分组字段,聚合函数 from 表名 [where 条件] group by 分组字段 [having 筛选条件] [order by 排序字段]
  • select 后面使用*号对查询结果分组后,只显示每一组第一条记录(无意义)

  • select 后面通常显示分组字段和聚合函数(对分组后的数据进行统计,求和,平均值等)

  • 语句执行顺序:1.根据where条件从数据库中查询条件

    2.group by对数据进行分组

    3.执行having对分组后的数据进行筛选

## 按照性别分组,然后统计个数
select 性别字段名 count(指定字段) from 表名 group by 性别字段名;
​
## 按照性别进行分组,再计算平均年龄
select 性别字段名 avg(年龄字段名) from 表名 group by 性别字段名;
​
## 按照年龄分组,统计每组人数,再筛选每组人数大于1的组,再按照年龄升序显示
select 年龄字段 count(指定字段) from 表名 group by 年龄字段 having count(指定字段)>1 order by 年龄字段;

4.11、分页查询-limit

当数据表中数据比较多的时候,如果全部提取出来可读性很差,因此我们可以将这些数据分页进行展示

select 查询字段名 from 表名 where 查询条件 limit parm1,parm2;
  • parm1 int :表示获取查询语句的结果中的起始索引(索引从0开始)

  • parma2 int :表示获取的查询记录的条数

## 查询的记录显示在第一页---从第一条数据开始显示三条
select 要查询的字段 from 表名 limit 0,3;
​
## 显示第二页的数据---从第三条数据开始显示三条
select 要查询的字段 from 表名 limit 3,3;
​
## 显示第三页的数据---从第六条数据开始显示三条
select 要查询的字段 from 表名 limit 6,3;
​
## 指定查询页码显示数据
select 要查询的字段 from 表名 limit (要查询的页码-1)* 显示的条数,显示的条数;

注意:SQL的书写顺序的执行顺序

  • 书写:select , from , where , group by , having , order by , limit

  • 执行:from , where , group by , having , select , order by , limit

4.12、流程函数

解释:如果case后面的字段名满足when后面的值,就显示then后面的内容,不满足显示else后面得内容

# 格式:
case 字段名 when '值' then '要显示的值' when '值2' then '要显示的值' else '值' end
​
# 查询emp表中姓名和对应的城市,将城市按一线二线显示
select name,(case workaddress when '北京' then '一线城市' else '二线城市' end)as '工作城市' from emp;
​
# if(value,t,f)-----如果value的值为真,返回t,否则返回f
# ifnull(value1,value2)-----如果value1值为真,返回value1,否则返回value2
​
# 判断分数是否合格
select name,if(score>=60,'合格','不合格') from students;
select name,(case when score>=60 then '合格' else '不合格' end) from students;

你可能感兴趣的:(mysql)