Mysql笔记

数据类型与约束
连接密码: mysql
常用数据类型
整数:int,有符号范围(-2147483648 ~2147483647),无符号范围(0 ~ 4294967295),长度没有意义.
小数:decimal,如decimal(5,2)表示共存5位数,小数占2位,整数占3位,如果插入的数据超出小数的占位,那么会进行一个四舍五入的计算.
字符串:varchar,范围(0~65533),如varchar(3)表示最多存3个字符,一个中文或一个字母都占一个字符
日期时间: datetime,范围(1000-01-01 00:00:00 ~ 9999-12-31 23:59:59),如’2020-01-01 12:29:59’
Tinyint: 极小的整数,如果要查询不是上面的数据的极小值.
查看任何一个数据类型的使用:可以cmd,运行MySQL 然后输入help Tinyint就可以查看Tinyint这个的说明.

约束
主键(primary key): 代表一条记录的唯一标识,值唯一,不能为空,
自动递增: 从1开始,一直累加,值不会取以前的值
表清空: 删除所有数据,不删除表结构,如果存在自动递增的值不会受影响继续累加.
表截断: 删除所有数据,不删除表结构,自动递增从1开始
应用时: 自动递增+无符号+非空

非空(not null): 此字段不允许填写空值
唯一(unique): 此字段的值不允许重复
默认值(default): 当不填写此值时会使用默认值,如果填写时以填写为准
外键(foreign key): 维护两个表之间的关联关系
Unsigned = 无符号 Primary key = 主键 Auto_increment = 自动递增
Tinyint = 较小值得整数类型 decimal = 小数类型

数据表的操作
创建表
注意!!! 如果要同时执行两个不同操作的语句,那么每个操作后面要接一个英文的;分号来进行间隔,否则就会报错.
CREATE TABLE 表名(
字段名 类型 约束,
字段名 类型 约束,

)
例如:
create table student(
id int unsigned primary key auto_increment,
name varchar(10) not null,
age tinyint unsigned,
height decimal(5,2)
)
– 通过create…select来创建数据表并且同时写入记录,一步到位
查询出来的字段名,插入到创建表的相同的字段名中
– create table goods_brands(
– brands_id int unsigned primary key auto_increment
– brands_name varchar(20)
– ) select distinct brand_name from goods

删除表
Drop table 表名
Drop table if exists 表名 : 如果当前表存在就删除它

备份表
Create table 表名 select * from 需要备份的表名
例如: create table goods_back select * from goods
插入数据
格式: Insert into 表名 values(字段1的值,字段2的值…)
insert into student values(0,’波妞’,50,110,default)
Insert into student(id,name) values(0,‘宗介’)
Insert into student values(0,’大熊’,11,156,男),(0,’波妞’,50,170.1,女),
(0,’小明’,11,145.50,default)
插入一个一列多行的内容到指定的列中,方法如下:
insert into 表1 (表1的字段) 一行多列的表2;

如果主键设置了字段增长,那么插入值的时候可以填0,Null,default都可以设置为默认的自动增长.

修改数据
格式: update 表名 set 列1=值1,列2=值2… where 条件
例如:修改id为5的学生的数据,改名为狄仁杰,年龄改为20
Update student set name=’狄仁杰’,age=20 where id=5
Update student set name=’狄仁杰’,age=age+a where id = 5 在原来的age+3岁
通过goods_cates数据表来更新goods表
通过一个表更新另外一个表的数据
– update goods as g inner join goods_cates as c on g.cate=c.cate_name
– set cate=cate_id
删除数据
Delete from 表名 where = 条件

逻辑删除:对于重要的数据,不能轻易执行delete语句进行删除,一旦删除,数据无法恢复,这时可以进行逻辑删除。
1、给表添加字段,代表数据是否删除,一般起名isdelete,0代表未删除,1代表删除,默认值为0
2、当要删除某条数据时,只需要设置这条数据的isdelete字段为1
3、以后在查询数据时,只查询出isdelete为0的数据
例:
1、给学生表添加字段(isdelete),默认值为0,如果表中已经有数据,需要把所有数据的isdelete字段更新为0
update students set isdelete=0
2、删除id为1的学生
update students set isdelete=1 where id=1
3、查询未删除的数据
select * from students where isdelete=0

字段的修改
修改原有字段名称及类型:
ALTER TABLE 表名 CHANGE 原有的字段名 新的字段名 VARCHAR(50) NOT NULL DEFAULT ‘’;
添加新字段:
alter table 表名add 字段名varchar(6) not null default 0;

查询
查询所有字段 select * from 表名
查询指定字段,在select后面的列名部分,可以使用as为列起别名
Select 列名1 as 别名,列名2 as 别名2… form 表名 where
例如:
select name as 姓名,age as 年龄,hometown as 家乡 from students where name = ‘王昭君’

可以为表起别名
Select * from students as s
Select s.name,s.age from students as s

– 消除重复数据
– select distinct hometown from students
– select distinct age,class from students
– select distinct * from students

比较运算符
等于: =
大于: >
大于等于: >=
小于: <
小于等于: <=
不等于: != 或 <>

– 查询学号是007的学生的身份证号
– select card from students where studentNo=007
– 查询1班以外的学生信息
– select * from students where class != ‘1班’
– 查询年龄大于20岁的学生的姓名和性别
– select name,sex from students where age>20

逻辑运算符
and, or, not

– 查询河南或河北的学生
– select * from students where hometown=‘河南’ or hometown=‘河北’
– 查询2班的上海的学生
– select * from students where class=‘2班’ and hometown=‘上海’
– 查询非20岁的学生
– select * from students where not age=20

模糊查询
like
%表示任意多个任意字符
表示一个任意字符,如果要两个就_ ,如此类推

– 1、查询姓名为两个字的学生
– select * from students where name like ‘__’
– 2、查询姓百且年龄大于20的学生
– select * from students where name like ‘百%’ and age>20

– 3、查询学号以1结尾的学生
– select * from students where studentNo like ‘%1’
– 查询姓名含白的学生
– select * from students where name like ‘%白%’

范围查询
in表示在一个非连续的范围内
between…and…表示在一个连续的范围内

– 查询家乡是北京或上海或广东的学生
– select * from students where hometown in (‘北京’,‘上海’)
– 查询家乡不在北京或上海或广东的学生
– select * from students where hometown not in (‘北京’,‘上海’)
– 询年龄为18至20的学生
– select * from students where age between 18 and 20
空判断
注意:null与””是不同的
判断空 is null
判断非空 is not null
– 查询没有填写身份证的学生
– select * from students where card is null
– 查询填写了身份证的学生
– select * from students where card is not null

排序
语法:select * from 表名
order by 列1 asc|desc,列2 asc|desc,…
将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推
默认按照列值从小到大排列
asc从小到大排列,即升序
desc从大到小排序,即降序

– 查询所有学生信息,按年龄从小到大排序
– select * from students order by age asc
– 查询所有学生信息,按年龄从大到小排序,年龄相同时,再按学号从小到大排序
– select * from students order by age desc,studentNo asc
– 1、查询所有学生信息,按班级从小到大排序,班级相同时,再按学号从小到大排序
– select * from students order by class asc,studentNo asc

#常用函数

-- 数学运算
SELECT ABS(-8) -- 绝对值
SELECT CEILING(9.4) -- 向上取整
SELECT FLOOR(9.4)  -- 向下取整
SELECT RAND() -- 返回0-1随机数
SELECT SIGN(-10) -- 判断一个数的符号 0-0 负数返回-1 正数返回1

-- 字符串函数
SELECT CHAR_LENGTH('2323232') -- 返回字符串长度
SELECT CONCAT('我','233') -- 拼接字符串
SELECT INSERT('java',1,2,'cccc') -- 从某个位置开始替换某个长度
SELECT UPPER('abc') 
SELECT LOWER('ABC')
SELECT REPLACE('坚持就能成功','坚持','努力')

-- 查询姓 周 的同学 ,改成邹
SELECT REPLACE(studentname,'周','邹') FROM student
WHERE studentname LIKE '周%'

-- 时间跟日期函数(记住)
SELECT CURRENT_DATE() -- 获取当前日期
SELECT CURDATE() -- 获取当前日期
SELECT NOW() -- 获取当前日期
SELECT LOCATIME()  -- 本地时间
SELECT SYSDATE()  -- 系统时间

SELECT YEAR(NOW())
SELECT MONTH(NOW())
SELECT DAY(NOW())
SELECT HOUR(NOW())
SELECT MINUTE(NOW())
SELECT SECOND(NOW())

-- 系统
SELECT SYSTEM_USER()
SELECT USER()
SELECT VERSION()


聚合函数
为了快速得到统计数据,经常会用到如下5个聚合函数
count()表示计算总行数,括号中写星与列名,结果是相同的
聚合函数不能在 where 中使用
count(列)表示求此列的总数
max(列)表示求此列的最大值
min(列)表示求此列的最小值
sum(列)表示求此列的和
avg(列)表示求此列的平均值
– 查询学生总数
– select count(
) as 学生总数 from students
– 查询女生的最小年龄
– select min(age) as 最小年龄 from students where sex = ‘女’
– 查询1班的最大年龄
– select max(age) as 最大年龄 from students where class = ‘1班’
– 询北京学生的年龄总和
– select sum(age) as 年龄总和 from students where hometown= ‘北京’
– 查询女生的平均年龄
– select avg(age) as 女生平均年龄 from students where sex= ‘女’
– 查询所有学生的最大年龄、最小年龄、平均年龄
– select max(age),min(age),avg(age) from students
– 一班共有多少个学生
– select count() as 1班学生总数 from students where class = ‘1班’
– 查询3班年龄小于18岁的同学有几个
– select count(
) as 3班小于18岁的学生总数 from students where class=‘3班’ and age<18

分组
按照字段分组,表示此字段相同的数据会被放到一个组中
分组后,分组的依据列会显示在结果集中,其他列不会显示在结果集中
可以对分组后的数据进行统计,做聚合运算
语法:
select 列1,列2,聚合… from 表名 group by 列1,列2…

– 查询各种性别的人数
– select sex,count() from students group by sex
– 查询各种年龄的人数
– select age,count(
) from students group by age
– 查询各个班级学生的平均年龄、最大年龄、最小年龄
– select class,avg(age),max(age),min(age) from students group by class

分组后的数据筛选
语法:
select 列1,列2,聚合… from 表名
group by 列1,列2,列3…
having 列1,…聚合…
having后面的条件运算符与where的相同

– 查询男生总人数
– select sex,count() from students group by sex having sex=‘男’
– select sex,count(
) from students where sex=‘男’

– 查询1班除外其他班级学生的平均年龄、最大年龄、最小年龄
– select class,avg(age),max(age),min(age) from students group by class having class != ‘1班’

对比where与having
where是对from后面指定的表进行数据筛选,属于对原始数据的筛选
having是对group by的结果进行筛选

获取部分行
当数据量过大时,在一页中查看数据是一件非常麻烦的事情
语法
select * from 表名
limit start,count
从start开始,获取count(总共)条数据
start索引从0开始

– 查询前3行学生信息
– select * from students limit 0,3
– 查询第4到第6行学生信息
– select * from students limit 3,3

分页
已知:每页显示m条数据,求:显示第n页的数据
select * from students limit (n-1)*m,m
求总页数
查询总条数p1
使用p1除以m得到p2
如果整除则p2为总数页
如果不整除则p2+1为总页数

– 12条,每页显示3条,总共4页
– select * from students limit 0,3
– select * from students limit 3,3
– select * from students limit 6,3
– select * from students limit 9,3

– 12条,每页显示5条,总共3页
– n=第几页,m=每页显示条数
– 公式:limit(n-1)*m,m
– 每页显示5条数据,显示每一页的数据
– select * from students limit 0,5
– select * from students limit 5,5
– select * from students limit 10,5

– 统计每个班级中每种性别的学生的人数,并按照班级进行升序排序
– select class,sex,count(*) from students group by class,sex order by class

– 查询年龄最小的学生的全部信息
方法:先升序排序年龄,然后分页选取第一个.
– select * from students order by age asc limit 1

在这里插入图片描述

笛卡尔积 = 两个表数据个数 相乘

连接查询
当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的列返回
等值连接
方式一
select * from 表1,表2 where 表1.列=表2.列
方式二(又称内连接)
select * from 表1
inner join 表2 on 表1.列=表2.列

– 例子1: 查询学生信息及学生的成绩

方法一:
– select * from
– students as stu,scores as sco
– where stu.studentNo = sco.studentno order by stu.studentNo asc,sco.studentno asc

方法二:
– select stu.name,sc.score from students as stu inner join scores as sc on stu.studentNo=sc.studentno

–例子2: 查询学生信息及学生的课程对应的成绩

– select stu.name as 学生姓名,sc.score 分数,cs.name 课程 from students as stu,scores as sc, courses as cs
– where stu.studentNo=sc.studentNo and sc.courseNo=cs.courseNo

内连接
– select stu.name as 姓名,sc.score as 成绩,cs.name as 课程 from students as stu
– inner join scores as sc on stu.studentNo=sc.studentNo
– inner join courses as cs on sc.courseNo=cs.courseNo

–例子3: 查询王昭君的成绩,要求显示姓名、课程号、成绩

– select stu.name as 姓名,cs.courseNo as 课程号,cs.name as 课程,sc.score as 成绩 from students as stu
– inner join scores as sc on stu.studentNo=sc.studentno
– inner join courses as cs on sc.courseNo=cs.courseNo
where stu.name=‘王昭君’

– 例子4:查询所有学生的数据库成绩,要求显示姓名、课程名、成绩

– select stu.name 姓名,cs.name 课程,sc.score 成绩 from students stu
– inner join scores sc on stu.studentNo=sc.studentno
– inner join courses cs on sc.courseNo=cs.courseNo
– where cs.name=‘数据库’

–例子5: 查询男生中最高成绩,要求显示姓名、课程名、成绩
– select stu.sex 性别,stu.name 姓名,cs.name 课程,max(sc.score) 最高成绩 from students stu
– inner join scores sc on stu.studentNo=sc.studentno
– inner join courses cs on sc.courseNo=cs.courseNo
– where stu.sex=‘男’

方法2:
– select stu.sex 性别,stu.name 姓名,cs.name 课程,sc.score 成绩 from students stu
– inner join scores sc on stu.studentNo=sc.studentno
– inner join courses cs on sc.courseNo=cs.courseNo
– where stu.sex=‘男’
– order by sc.score desc
– limit 1
左连接
左连接查询:查询的结果为两个表匹配到的数据加左表特有的数据,对于右表中不存在的数据使用null
select * from 表1
left join 表2 on 表1.列=表2.列

例1:查询所有学生的成绩,包括没有成绩的学生
– select stu.name 姓名,sc.score 成绩 from students stu
– left join scores sc on stu.studentNo=sc.studentno

例2:查询所有学生的成绩,包括没有成绩的学生,需要显示课程名
– select stu.name 姓名,sc.score 成绩,cs.name 课程 from students stu
– left join scores sc on stu.studentNo=sc.studentno
– left join courses cs on sc.courseNo=cs.courseNo

右连接
右连接查询:查询的结果为两个表匹配到的数据加右表特有的数据,对于左表中不存在的数据使用null填充
select * from 表1
right join 表2 on 表1.列=表2.列

左连接和右连接中先写的表代表左表,后的表是右表, join 左边的是左表, 右边的是右表
– 查询所有课程的成绩,包括没有成绩的课程
– select cs.name 课程,sc.score 成绩 from scores sc
– right join courses cs on sc.courseNo=cs.courseNo
– 例2:查询所有课程的成绩,包括没有成绩的课程,包含学生
– select cs.name 课程,sc.score 成绩,stu.name 学生 from scores sc
– right join courses cs on sc.courseNo=cs.courseNo
– left join students stu on sc.studentno=stu.studentNo

自关联
自关联的查询方法就是把那一张表进行查询两次,建立起一个笛卡尔积的新的虚拟表,然后在虚拟表里面进行查询操作.

– 例1:查询河南省的所有城市

方法一:
– select * from areas a
– inner join areas b on a.aid=b.pid
– where a.atitle= ‘河南省’

方法二:
– select * from areas a,areas b where a.aid=b.pid and a.atitle= ‘河南省’

– 查询郑州市的所有区县
– select * from areas a
– inner join areas b on a.aid=b.pid
– inner join areas c on c.pid=b.aid
– where b.atitle=‘郑州市’

– 例4:查询河南省的所有的市和区县
– select * from areas a
– left join areas b on a.aid=b.pid
– left join areas c on c.pid=b.aid
– where a.atitle=‘河南省’

子查询
主查询和子查询的关系
子查询是嵌入到主查询中
子查询是辅助主查询的,要么充当条件,要么充当数据源
子查询是可以独立存在的语句,是一条完整的 select 语句
子查询分类
标量子查询: 子查询返回的结果是一个数据(一行一列)
列子查询: 返回的结果是一列(一列多行)
行子查询: 返回的结果是一行(一行多列)
表级子查询: 返回的结果是多行多列

标量子查询

– 例子1: 查询大于平均年龄的学生
– select * from students where age>(select avg(age) from students)

–例子2: 查询王昭君的成绩,要求显示成绩
– select score from scores where studentno = (select studentno from students where name=‘王昭君’)
列级子查询
例3:查询18岁的学生的成绩,要求显示成绩
– select * from scores where studentno in (select studentno from students where age=18)
行级子查询
– 例4:查询男生中年龄最大的学生信息
– select * from students where sex=‘男’ order by age desc limit 1
– select * from students where age=(select max(age) from students where sex=‘男’)
Select * from students where (sex,age)=(‘男’,(select max(age) from students where sex=’男’))
表级子查询
– 例5:查询数据库和系统测试的课程成绩
– select * from scores sc inner join (select * from courses where name in(‘数据库’,‘系统测试’)) as b
– on sc.courseNo=b.courseNo

子查询中特定关键字使用

in 范围
格式: 主查询 where 条件 in (列子查询)
any | some 任意一个
格式: 主查询 where 列 = any (列子查询)
在条件查询的结果中匹配任意一个即可,等价于 in
all
格式: 主查询 where 列 = all(列子查询) : 等于里面所有
格式: 主查询 where 列 <>all(列子查询) : 不等一其中所有
select * from students where age in (select age from students where age between 18 and 20)
大于any相当于大于范围内的最小值
select * from students where age >any (select age from students where age between 18 and 20) —大于18

小于any相当于小于范围内的最大值
select * from students where age <any (select age from students where age between 18 and 20) —小于20

MySQL命令行操作
连接数据库:mysql -u 用户名 -p 然后输入密码
显示当前连接的所有数据库: show databases;
连接指定的数据库: use 数据库名;
显示当前数据库的所有表: show tables;
数据库的备份,跳转到bin目录下: mysqldump -u 用户名 -p 需要备份的数据库名 > 输入备份到的路径
例如: mysqldump -u root -p testsql > D:testsql_back.sql
使用备份的数据库: mysql -u 用户名 -p 备份到表1 < 备份数据库的路径
例如: mysql -u root -p ceshi_back < D:\testsql_back.sql
查看表的结构: desc 表名

数学函数
求四舍五入值round(n,d),n表示原数,d表示小数位置,默认为0
随机数rand(),值为0-1.0的浮点数
1.select rand();
2.-- 随机取表中的一条
– select * from students order by rand() limit 1

创建函数语法
create function 函数名称(参数列表) returns 返回类型
begin
sql语句
end

– create function my_trim(aa varchar(100)) returns varchar(100)
– begin
– return rtrim(ltrim(aa));
– end
调用: select my_trim

存储过程

create procedure 存储过程名称(参数列表)
begin
sql语句
end

– create procedure myproce()
– begin
– select * from students;
– end

调用: call procedure

视图
对于复杂的查询,在多个地方被使用,如果需求发生了改变,需要更改sql语句,则需要在多个地方进行修改,维护起来非常麻烦
解决:定义视图
视图本质就是对查询的封装
定义视图,建议以v_开头
create view 视图名称 as select语句;

例如:
create view v_stu_score_course as
select stu.name,sc.score,cs.name as 课程名 from students stu
inner join scores sc on stu.studentNo=sc.studentno
inner join courses cs on sc.courseNo=cs.courseNo

调用: select * from v_stu_score_course

事务

1.事务的开始是begin,结束时commit,事务的回滚是rollback
2.在事务还没结束时数据不会真正创建
3.例子:

-- mysql 自动开启事务提交
SET autocommit=0 -- 关闭
SET autocommit=1 -- 开启(默认的)

-- 手动处理事务
SET autocommit =0 -- 关闭自动提交

-- 事务开启

START TRANSACTION -- 标记一个事务的开始,从这个之后的SQP都在同一个事务内

INSERT XX
INSERT XX

-- 提交 : 持久化(成功)
COMMIT 
-- 回滚:  回到原来的样子(失败)
ROLLBACK
-- 事务结束
SET autocommit = 1 -- 开启自动提交
-- 了解
SAVEPOINT 保存点名称 -- 设置一个事务的保存点
ROLLBACK TO SAVEPOINT 保存点名 -- 回滚到保存点
RELEASE SAVEPOINT 保存点 -- 删除保存点


#案例
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci
USE shop
CREATE TABLE `account`(
`id` INT(3) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(30) NOT NULL,
`money` DECIMAL(9,2) NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO account(`name`,`money`)
VALUES('A',2000),('B',10000)

-- 模拟转账:事务
SET autocommit = 0; -- 关闭自动提交
START TRANSACTION -- 开启事务(一组事务)
UPDATE account SET money = money-500 WHERE `name` = 'A' -- A 转账给B
UPDATE account SET money = money+500 WHERE `name` = 'B' -- B 收到钱

COMMIT ; -- 提交事务
ROLLBACK ; -- 回滚

SET autocommit=1 -- 恢复默认值


4.事务的回滚,要在commit前,回滚后相当于清空数据,不把数据添加到表里.

索引
当数据库中数据量很大时,查找数据会变得很慢
优化方案:索引
语法
查看索引
show index from 表名;
创建索引
方式一:建表时创建索引
创建表是,对于主键和unique字段,自动创建索引
create table create_index(
id int primary key,
name varchar(10) unique,
age int,
key (age)
);
方式二:对于已经存在的表,添加索引
如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致
字段类型如果不是字符串,可以不填写长度部分

create index 索引名称 on 表名(字段名称(长度))
例:
create index age_index on create_index(age);
create index name_index on create_index(name(10));

删除索引:
drop index 索引名称 on 表名;

查询索引
开启运行时间监控
set profiling=1;
查看执行时间
show profiles;

分析查询
explain
select * from test_index where title=‘test10000’

外键

查看外键
show create table 表名

设置外键约束
注意: 从表中的约束字段类型一定要和主表中的类型一致

方式一:创建数据表的时候设置外键约束
create table goods_fk(
id int unsigned primary key auto_increment,
name varchar(150),
cate_id int unsigned,
brand_id int unsigned,
price decimal(10,3) default 0,
is_show bit default 1,
is_saleoff bit default 0,
foreign key(cate_id) references goods_cates(cate_id),
foreign key(brand_id) references goods_brands(brand_id)
);

foreign key(自己的字段) references 主表(主表字段)

方式二:对于已经存在的数据表设置外键约束
alter table 从表名 add foreign key (从表字段) references 主表(主表字段);

alter table goods add foreign key (cate_id) references goods_cates(cate_id);
alter table goods add foreign key (brand_id) references goods_brands(brand_id);

删除外键

– 需要先获取外键约束名称
show create table goods;
– 获取名称之后就可以根据名称来删除外键约束
alter table goods drop foreign key 外键名称;

alter table goods drop foreign key goods_ibfk_1;
alter table goods drop foreign key goods_ibfk_2;

修改密码
使用root登录,修改mysql数据库的user表
使用password()函数进行密码加密
注意修改完成后需要刷新权限
use mysql;
update user set password=password(‘新密码’) where user=‘用户名’;

例:
update user set password=password(‘123’) where user=‘root’;
刷新权限:flush privileges;
忘记 root 账户密码怎么办
1、配置mysql登录时不需要密码,修改配置文件
Centos中:配置文件位置为/data/server/mysql/my.cnf
Windows中:打开隐藏文件选项,配置文件位置为C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
修改,找到mysqld,在它的下一行,添加skip-grant-tables
2、重启mysql服务,免密码登录,修改mysql数据库的user表
3、还原配置文件,把刚才添加的skip-grant-tables删除,重启

打开数据库日志文件
查看日志功能是否打开
– show VARIABLES like ‘general%’
打开日志文件功能,关闭就把值设置为0
– set global general_log=1
Log文件路径general_log_file就是路径
本机默认:C:\ProgramData\MySQL\MySQL Server 8.0\Data\WIN7-20190902OD.log

练习题:

在这里插入图片描述

查询表中学生每科的最大成绩和最小成绩
select a.* from students as a, (select max(scoure) as m,class from students group by class)as b where b.m = a.scoure and b.class = a.class
UNION
select a.* from students as a, (select min(scoure) as m,class from students group by class)as b where b.m = a.scoure and b.class = a.class
结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值