镜像下载: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)更新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)先进入数据库
use mysql;
2)查询用户信息
select host,user from user;
3)将其中一个host值改为%---表示可以在任意地方登录
update user set host = '%' where host = '要改的host名'
4)刷新权限表或重启MySQL
flush privilegs;
## 显示当前MySQL中的数据库列表
show databases;
## 查询当前数据库
select database();
## 显示指定名称的创建的数据库类型格式
show create databases 数据库名称;
## 创建数据库
create database 数据库名称;
## 创建数据库名称,当指定数据库名称不存在时创建
create database if not exists 数据库名称;
## 在创建数据库的时候指定数据库的字符集
create database 数据库名称 character set utf8;
## 修改数据库的字符集
alter database 数据库名称 character set utf8;
## 删除数据库
drop database 数据库名;
## 如果数据库存在就删除数据库
drop database if exists 数据库名;
use 数据库名;
在小括号中定义列表名,需要通过逗号分割,最后一个字段没有逗号
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 ## 定义性别为不可变字符串且不为空
);
show tables;
desc 表名;
# 查询指定表的建表语句
show create table 表名;
## 删除数据表
drop table 表名;
## 如果表名存在就删除
drop table if exists 表名;
## 修改表名
alter table 表名 rename to 新表名;
## 修改表的字符集
alter table 表名 character set utf8;
## 添加字段----在指定表中添加字段
alter table 表名 add 字段名 字段类型;
## 修改字段的名称和类型
alter table 表名 change 旧字段名 新字段名 新字段类型;
## 只修改字段类型
alter table 表名 modify 字段名 新字段类型;
## 删除字段
alter table 表名 drop 字段名;
注意:前三种数字类型使用少,一般整数类型直接使用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的值只能选择其一
非空约束(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
);
## 格式语法
insert into 表名(各字段名) values(个字段所对应的值);
## 示例----sql语句中单引号代表字符串
## 向数据表中添加数据
insert into 表名(字段1,字段2,字段3,字段4,字段5)
values('字段1值','字段2值','字段3值','字段4值','字段5值');
## 向数据表中添加数据--省略字段,但值的顺序需要和建表语句顺序相同
insert into 表名 value('值',······);
## 语法格式
delete from 表名 where 通过什么条件;
## 删除学号为2033的学生信息
delete from 表名 where 字段名=2033;
## 删除年龄大于20的(如果满足多条就删除多条)
delete from 表名 where 字段名>20;
## 如果删除语句没有where,表示删除表中的所有数据
delete from 表名;
## 格式语法
update 表名 set 需要修改的字段=修改的值 where 条件;
## 将学号为222002的学生姓名修改为张三(修改一次)
update 表名 set 字段名='张三' where 字段名='222003' ## where后面相当于查找条件
## 修改多条数据--用逗号隔开
update 表名 set 字段1='值',字段2='值' where 条件;
## 修改数据时不加where--表示将表中对应字段的全部数据修改
update 表名 set 字段='值';
## 格式语法--如果要查询的字段有多个中间用逗号隔开
select 要查询的字段名 from 表名;
## 查询全表---不建议使用,表中数据过多,效率低
select * from 表名;
注意:where 表示用于筛选特定的条件,可以指定查询的条件
## != <> 不等于
select * from 表名 where 字段名 != '值' ## 表示该表中字段名不等于该值的有
select * from 表名 where 字段名 <> '值'
## between 起始值 and 终止值
select * from 表名 where 字段名 between 10 and 20; ## 表示查询字段在[10,20]的所有
## is null---判断是否为空
select * from 表名 where 字段名 is null; ## 查找指定字段为空的值
## 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; ## 不在该区间的所有
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%';
对数据表中查询到的数据进行处理后显示出来
## 显示表中姓名和年龄的所有信息
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 表名; ## 查看表中的年龄有哪些不需要重复
将查询到满足条件的数据进行排序
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;
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 条件;
当我们向日期类型字段添加数据的时,可以通过字符串赋值(格式必须为: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());
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')
分组-----就是将数据表中的记录按照指定的类进行分组
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 年龄字段;
当数据表中数据比较多的时候,如果全部提取出来可读性很差,因此我们可以将这些数据分页进行展示
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
解释:如果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;