MySQL课上知识点

-- 连接认证
mysql.exe -h localhost -P 3306 -u root -p
mysql -u root -p
-h 找到电脑里的主机地址
-P 大P-默认端口3306
-p 小p-密码
-u user名字

show databases; -- 查看所有数据库

-- 退出命令
exit,quit,\q

-- 创建数据库
create database mydatabase charset utf8;

-- 创建关键字数据库
create database database charset utf8;

-- 告诉服务器当前中文的字符集是什么
set names gbk;

-- 创建中文数据库
create database 中国 charset utf8;

-- 创建数据库
create database informationtest charset utf8;

-- 查看以information_开始的数据库 (匹配需要被转义)
show databases like 'information_%';
show databases like 'information
%'; --相当于information%

-- 查看数据库的创建语句
show create database mydatabase;
show create database 'database';

-- 修改数据库informationtest的字符集
alter database informationtest charset GBK;

-- 删除数据库 -- 数据库名字
drop database informationtest;

-- 创建表
create table if not exists mydatabase.student (
-- 显示的将student表放到mydatabase数据库下面
name varchar(10),
gender varchar (10),
number varchar (10),
age int
)charset utf8;

-- 创建数据表 --常用的
-- 进入数据库
use mydatabase;
--创建表
create table class (
name varchar (10),
room varchar (10)
) charset utf8;

-- 查看所有表
show tables;

-- 查看以s结尾的表
show tables like '%s';

-- 查看表的创建语句:
show create table student;
show create table student\g -- \g 相当于 ;
show create table student\G -- \G 将查到的结构旋转90度变成纵向---------"方便观察"

-- 查看表结构
desc class;
describe class;
show columns from class;

-- 重命名表(student表 -> tal_student)
rename table student to my_student;

-- 修改表选项:字符集
alter table my_student charset = GBK;

-- 查看创建表的语句
show create table my_student;

-- 查看表结构
desc my_student;

-- 给学生表增加ID, first---放到第一个位置 column 列字段的意思
alter table my_student add column id int first;

-- 将学生表中的number学号字段变成固定长度,且放到第二位(ID之后)
alter table my_student modify number char(10) after id;

-- 修改学生表中的gender字段为sex
alter table my_student change gender sex varchar (10);

-- 删除学生表中的年龄字段
alter table my_student drop age;

-- 删除数据表
drop table class;

-- 插入数据
insert into my_student values
(1,'bc20190001','jim','male'),
(2,'bc20190002','Lily','female');

-- 插入数据:指定字段列表
insert into my_student (number,sex,name,id) values
('ba20190003','male','Tom',3),
('ba20190004','female','LUcy',4);

-- 查看所有数据
select * from my_student;

-- 查看指定字段、指定条件的数据
-- 查看满足ID为1的学生信息
select id,number,sex,name from my_student where id=1;

-- 更新数据 where条件 先开始的表名
update my_student set sex='female' where name='jim';

-- 删除数据
delete from my_student where sex='male';

**************************** 第二天的 *******************************

-- 创建整型表
create table my_int(
int_1 tinyint,
int_2 smallint,
int_3 int,
int_4 bigint
) charset utf8;

-- 插入数据
insert into my_int
values(100,100,100,100); --有效数据
insert into my_int
values('a','b','199','f'); --无效数据,类型限定
insert into my_int
values(255,10000,100000,1000000); --错误的写法,超出范围

-- 给表增加一个无符号的类型
alter table my_int add int_5
tinyint unsigned; -- 无符号类型
-- 插入数据
insert into my_int
values (127,10000,100000,100000,255);

-- 指定显示宽度为1
alter table my_int add int_6
tinyint(1) unsigned;
-- 插入数据
insert into my_int
values (127,0,0,0,255,255);

-- 显示宽度为2,0填充
alter table my_int add int_7
tinyint(2) zerofill; -- zerofill; 自动变成 unsigned无符号
-- 插入数据
insert into my_int
values (1,1,1,1,1,1,1);
insert into my_int
values (100,100,100,100,100,100,100);

-- 浮点数表
create table my_float(
f1 float,
f2 float(10,2), -- 10位在精度范围之外
f3 float(6,2) -- 6位在精度范围之内
);

-- 插入数据
insert into my_float
values(1000.10,1000.10,1000.10);
insert into my_float
values(1234567890,12345678.90,123.56);
insert into my_float
values(3e38,3.01e7,1234.56);
insert into my_float
values(9999999999,99999999.99,9999.99); -- 后两个是最大值

-- 超出长度插入数据
insert into my_float
values (123456,1234.12345678,123.9876543); -- 小数部分可以超出长度
insert into my_float
values (132456,1324.12,123456.56); -- 最后一个整数部分超出

-- 创建定点数表
create table my_decimal(
f1 float (10,2),
d1 decimal (10,2)
);

-- 插入数据
insert into my_decimal
values (12345678.90,12346578.90); -- 有效数据
insert into my_decimal
values (1234.123456,1234.123456); -- 小数部分是可以超出的

-- 查看警告
show warnings;

-- 插入数据
insert into my_decimal
values (99999999.99,99999999.99); -- 没有问题
insert into my_decimal
values (99999999.99,99999999.999); -- 进位超出范围

-- 创建时间日期表
create table my_date(
d1 datetime,
d2 date,
d3 time,
d4 timestamp,
d5 year
);

-- 插入数据
insert into my_date
values ('2019-11-21 13:38:36',
'2019-11-21','13:38:36',
'2019-11-21 13:38:36','2019');
-- 时间使用负数
insert into my_date
values ('2019-11-21 13:38:36',
'2019-11-21','-13:38:36',
'2019-11-21 13:38:36','2019');
insert into my_date
values ('2019-11-21 13:38:36',
'2019-11-21','-213:38:36',
'2019-11-21 13:38:36','2019');
insert into my_date
values ('2019-11-21 13:38:36',
'2019-11-21','-2:38:36',
'2019-11-21 13:38:36','2019'); -- -2表示过去2天,就是48小时 -- year可以使用2位或者4位
insert into my_date
values ('2019-11-21 13:38:36',
'2019-11-21','13:38:36',
'2019-11-21 13:38:36','69');
insert into my_date
values ('2019-11-21 13:38:36',
'2019-11-21','13:38:36',
'2019-11-21 13:38:36','70');

-- timestamp;修改记录
update my_date set d1=
'2019-11-21 13:46:45' where d5=2069;

-- 创建枚举表
create table my_enum(
gender enum('男','女','保密')
);

-- 插入数据
insert into my_enum
values ('男'),('保密'); -- 有效数据
insert into my_enum
values ('male'); -- 错误数据,没有该元素

-- 将字段结果取出来进行+0运算
select gender + 0, gender
from my_enum;

-- 数值插入枚举元素
insert into my_enum
values (1),(2);

-- 创建班级表
create table my_class(
name varchar (20) not null,
room varchar (20) null -- 代表允许为空,不写默认就是允许为空
);

-- 创建表
create table my_teacher(
name varchar (20) not null comment
'姓名',
money decimal (10,2) not null
comment '工资'
);

-- 默认值
create table my_default(
name varchar (20) not null,
age tinyint unsigned default 0,
gender enum('男','女','保密')
default '男'
);

-- 插入数据
insert into my_default (name)
values('臭蛋');
insert into my_default
values ('男闺蜜',18,default );

-- 增加主键
create table my_pri1(
name varchar (20) not null comment
'姓名',
number char (10) primary key
comment '学号:bc2019+0001,不能重复'
);

-- 复合主键
create table my_pri2(
number char (10) comment
'学号: bc20190001',
course char (10) comment
'课程代码:bc25890001',
score tinyint unsigned default 60
comment '成绩',
-- 增加主键限制:学号和课程号应该是对应的,具有唯一性
primary key(number, course)
);

-- 追加主键
create table my_pri3(
course char (10) not null comment
'课程代码:bc25890001',
name varchar (10) not null comment
'课程名字'
);
-- 第一种方式
alter table my_pri3 modify course
char(10) primary key comment
'课程代码:bc25890001';
-- 把第一种用drop table my_pri3; 删除然后在创建一个在用第二种方式
-- 删除表
drop table my_pri3;
-- 第二种方式
alter table my_pri3 add primary
key(course);

alter table my_pri3 add primary
key(course); -- 也可以是复合主键

*************************** 第三天 *****************************

-- 向pri1、2表插入数据
insert into my_pri1
values ('古天乐','bc20190001'),
('臭蛋','bc20190002');
insert into my_pri2
values('bc20190001','bc25890001',90),
('bc2019002','bc25890002',85),
('bc2019003','bc25890003',92);

-- 主键冲突(重复)
insert into my_pri1
values('刘涛','bc20190002'); -- 不可以;主键冲突
insert into my_pri2
values('bc20190001','bc25890001',100); -- 不可以;主键冲突

-- 删除主键
alter table my_pri3 drop primary key;

-- 自增长
create table my_auto(
id int primary key
auto_increment comment '自动增长',
name varchar(10) not null
)charset utf8;

-- 触发自增长
insert into my_auto(name)
values ('邓丽君');
insert into my_auto
values (null,'成龙');
insert into my_auto
values (default ,'吴绮莉');

-- 指定数据
insert into my_auto values (6,
'黄晓明');
insert into my_auto values (null,
'杨颖');

-- 修改表选项的值
alter table my_auto
auto_increment=4; -- 向下修改(改小) 不生效
alter table my_auto
auto_increment=10; -- 向上修改(改大) 生效

-- 查看自增长变量
show variables like
'auto_increment%';

-- 修改自增长的步长
set auto_increment_increment=5; -- 一次自增5

-- 插入记录;使用自增长
insert into my_auto values(null,
'杨紫');
insert into my_auto values(null,
'张一山');

-- 删除自增长
alter table my_auto modify id int
primary key; -- 错误;主键在理论上是单独存在的(系统会认为我们要在加一个主键)
alter table my_auto modify id int; -- 有主键的时候,千万不要在加主键

-- 创建一个唯一键
create table my_unique1(
number char (10) unique comment
'学号:唯一,允许为空',
name varchar (20) not null
)charset utf8;

create table my_unique2(
number char (10) not null comment
'学号',
name varchar (20) not null,
-- 增加唯一键
unique key(number)
)charset utf8;

create table my_unique3(
id int primary key auto_increment,
number char (10) not null,
name varchar (20) not null
)charset utf8;

-- 追加唯一键
alter table my_unique3 add unique
key(number);-- 给number增加唯一键

alter table my_unique3 add unique
key(name);-- 给name增加唯一键

-- 插入数据
insert into my_unique1
values (null, '大熊'),
('bc20190001','胖虎'),
(null,'静香');

insert into my_unique1
values ('bc20190001','哆啦A梦');

-- 删除唯一键 -----删除的是索引 index
alter table my_unique3 drop index number;

-- 自关联 自关联就是看房山区的父id是哪个,是1 北京就是父id
-- id name pid
-- 1 北京 null
-- 2 朝阳区 1
-- 3 房山区 1
-- 4 吉林省 null
-- 5 长春 4
-- 6 吉林市 4

-- 空间换时间
-- 商品表
-- id name pic
-- 商品样式表
-- id pid style pic

**************************** 第四天 *************************

-- 给班级表增加主键
alter table my_class add primary
key(name);

-- 插入数据
insert into my_class values (
'python1907','B408');
insert into my_class values (
'python1907','B407'); -- 错误;主键冲突

insert into my_class values (
'python1907','B407')
-- 冲突处理
on duplicate key update
-- 更新教室
room='B407';

insert into my_class values (
'python1903','B408');

-- 主键冲突;替换
replace into my_class values (
'python1903','B406');
replace into my_class values (
'python1910','B409');

-- 复制创建表,
create table my_copy like my_class;

-- 删除主键
alter table my_copy drop primary key;
-- 在MySQL中去掉一个表的主键需要分2中的情况;
-- 1;该列(column)不光设置为主键(primary key),
-- 还有自增长(auto_increment);
-- 句式:alter table +表名+ modify id int, drop primary key;
-- 2、如果没有设置为自增长(auto_increment),
-- 那么可以直接删除主键(primary key );
-- 句式:alter table +表名+drop primary key;

-- 蠕虫复制-------用来测试表的压力以及效率
insert into my_copy select * from my_class;
insert into my_copy select * from my_copy;

-- 更新部分B406变成A406
update my_copy set room='A408' where room='B408' limit 3;

-- 删除数据;限制记录数为5
delete from my_copy where room='B409' limit 5;

-- 给学生表增加主键
alter table my_student modify id int primary key auto_increment;

-- 清空表,重置自增长
truncate my_student;

-- 以下三句有什么区别?
delete from 表名; -- 只删除数据
truncate 表名; -- 删除数据,重置自增长
drop table 表名; -- 删除数据表

-- select 选项
select * from my_copy;
select all * from my_copy;

-- 去重
select distinct * from my_copy;

-- 向学生表插入数据
insert into my_student values(null,'bc20190001','张三','男'),
(null,'bc20190002','李四','男'),
(null,'bc20190003','王五','女'),
(null,'bc20190004','赵柳','男'),
(null,'bc20190005','六七','男');

-- 字段别名
select id,
number as 学号,
name as 姓名,
sex 性别 from my_student;

-- 多表数据源------数据源:单表数据源、多表数据源、查询语句、子查询
-- 只要返回的是个二维表那就是数据源
select * from my_student,my_class;

-- 子查询
select * from (select * from my_student) as s;

-- 增加age年龄和height
alter table my_student add age tinyint unsigned;
alter table my_student add height tinyint unsigned;

-- 增加字段的值;rand取得一个0-1之间的随机数,floor向下取整
update my_student set age=floor(
rand()20+20),height=floor(rand()20+170);

-- 找学生ID为1,3,5,的学生
select * from my_student where id=1 || id=3 || id=5; -- 逻辑判断
select * from my_student where id in(1,3,5); -- in表示在集合中

-- 找出身高在180到190之间的学生
select * from my_student where height>=180 and height<=190;
select * from my_student where height between 180 and 190;
select * from my_student where height
between 190 and 180; -- 不成立,相当于height>=190 and height<=180

select * from my_student where 1; -- 所有条件都满足;

-- 根据性别分组
select * from my_student group by sex;

-- 分组统计;身高高矮,平均年龄、总年龄
select sex,count(*),max(height),min(height),avg(age),
sum(age)from my_student group by sex;

-- 修改ID为4的记录,把年龄置为null
update my_student set age=null where id=4;

select sex,count(*),max(height),min(height),avg(age),
sum(age)from my_student group by sex;

-- 修改ID为1 的记录,把性别置为女
update my_student set sex='女' where id=1;

-- nan
-- nv

select sex,count(*),max(height),min(height),avg(age),
sum(age)from my_student group by sex desc;

-- 删除班级表原主键
alter table my_class drop primary key;

-- 给班级表增加主键
alter table my_class add id int primary key auto_increment;

-- 给学生表增加班级ID
alter table my_student add c_id int;
update my_student set c_id=ceil(rand()*3);

-- 多字段分组;先班组;后男女
select c_id,sex,count(*) from my_student group by
c_id, sex; -- 多字段排序

select c_id,sex,count(*),group _concat(name)
from my_student group by c_id, sex; -- 多字段排序

-- 统计
select c_id,count() from my_student group by c_id;
-- 回溯统计
select c_id,count(
) from my_student group by c_id with rollup;

-- 多字段分组回溯统计
select c_id,sex,count(),group _concat(name)
from my_student group byc_id, sex; -- 多字段排序
select c_id,sex,count(
),group _concat(name)
from my_student group by c_id, sex with rollup;

-- 求出所有班级人数大于等于2的学生人数
select c_id,count() from my_student
group by c_id having count(
)>=2;

select c_id,count() from my_student
where count(
)>=2 group by c_id having by c_id; -- 错误

-- having字句进行条件查询
-- 与where子句一样,是进行条件判断的
-- having能够使用字段别名
select name as 名字,number as 学号 from my_student
having 名字 like '张%';

-- 排序
select * from my_student group by c_id; -- 分组 ,为了进行统计
select * from my_student order by c_id; -- 排序

-- 多字段排序;先班级排序,后性别排序
select * from my_student order by c_id,sex desc;

-- 查询学生;前两个
select * from my_student limit 2;

select * from my_student limit 0,2; -- 记录数是重0开始编号
select * from my_student limit 2,2;
select * from my_student limit 4,2;

-- 更改ID为班级表的第一列
alter table my_class change id id int first;

-- 交叉连接
select * from my_student cross join my_class;
-- my_student cross join my_class 是数据源;

-- 内连接
select * from my_student inner join my_class on c_id=my_class.id;

select * from my_student inner join my_class on c_id=id; --错误
,因为两张表都有ID字段

-- 字段和表别名
select s.*,c.name as c_name,c.room -- 字段别名
from my_student as s inner join
my_student as c on s.c_id=c.id;

-- 把学生表ID为5的记录的c_ID设置为null
update my_student set c_id=null where id=5;

-- where 代替on
select s.*,c.name as c_name,c.room -- 字段别名
from my_student as s inner join
my_student as c where s.c_id=c.id;

-- 左连接
select s.*,c.name as c_name,c.room -- 字段别名
from my_student as s left join
my_student as c -- 左表为主表;最终记录数至少不少于左表已有的记录数
on s.c_id=c.id;

-- 右连接
select s.*,c.name as c_name,c.room -- 字段别名
from my_student as s right join
my_student as c -- 右表为主表;最终记录数至少不少于左表已有的记录数
on s.c_id=c.id;

select s.*,c.name as c_name,c.room -- 字段别名
from my_student as c right join
my_student as s -- 左表为主表;最终记录数至少不少于左表已有的记录数
on s.c_id=c.id;

-- 自然内连接
select * from my_student natural join my_class;

-- 修改班级表name字段名为c_name
alter table my_class change name
c_name varchar (20) not null;

-- 自然左外连接
select * from my_student natural
left join my_class;

-- 外连接模拟自然外连接:using
select * from my_student left
join my_class using (id);

*************************** 第五天 **************************

-- 创建外键
create table my_foreign1(
id int primary key auto_increment,
name varchar (20) not null comment
'学生姓名',
c_id int comment '班级id',
-- 增加外键
foreign key(c_id) references
my_class(id)
)charset utf8;

-- 创建表
create table my_foreign2(
id int primary key auto_increment,
name varchar (20) not null comment
'学生姓名',
c_id int comment '班级id' -- 普通字段
)charset utf8;

-- 增加外键
alter table my_foreign2 add
-- 指定外键的名字
constraint student_class_1 -- 可以指定多个外键 但是名字不能相同
-- 指定外键的字段
foreign key(c_id)
-- 引用父表主键
references my_class(id);

-- 删除外键
alter table my_foreign1 drop
foreign key my_foreign1_ibfk_1;-- my_foreign1_ibfk_1 通过外键的名字来删

-- 插入数据;外键字段在父表不存在
insert into my_foreign2 values (
null,'郭富城',4); -- 没有4号班级

insert into my_foreign2 values (
null,'项羽',1);
insert into my_foreign2 values (
null,'刘邦',2);
insert into my_foreign2 values (
null,'韩信',3);

-- 更新父表的记录
update my_class set id=4 where id=1; -- 失败;id=1记录已经被学生引用
update my_foreign2 set c_id=2 where id=4;-- 更新
update my_class set id=4 where id=3; -- 可以;没有学生引用此班级

-- mysql中添加外键约束遇到一下情况:
-- cannot add foreign key constraint
-- 出现这个问题的原因是,外键的使用:
-- 1. 外键字段不能为该表的主键;
-- 2. 外键字段参考字段必须为参考表的主键

-- 插入数据
insert into my_foreign1 values (
null,'马超','3'
);

-- 增加外键
alter table my_foreign1 add
foreign key(c_id) references
my_class(id); -- 失败;因为没有3号班了

-- 创建外键,指定模式;删除置空;更新级联
create table my_foreign3(
id int primary key auto_increment,
name varchar (20) not null,
c_id int,
-- 增加外键
foreign key (c_id)
-- 引用表
references my_class(id)
-- 指定删除模式
on delete set null
-- 指定更新模式
on update cascade
)charset utf8;

-- 插入数据
insert into my_foreign3 values (
null,'刘备',1),
(null,'曹操',1),
(null,'孙权',1),
(null,'祝贺量',2),
(null,'周瑜',2);

-- 解除My_foreign2表的外键
alter table my_foreign2 drop
foreign key student_class_1;

-- 更新父表主键
update my_class set id=3 where id=1;

-- 删除父表主键
delete from my_class where id=2;

-- 联合查询
select * from my_class
union -- 默认去重
select * from my_class;

select * from my_class
union all -- 不去重
select * from my_class;

select id,c_name,room from my_class
union all -- 不去重
select name,number,id from my_student;

-- 需求;男生升序;女生降序(年龄)
(select * from my_student
where sex='男'
order by age asc limit 9999999)
union
(select * from my_student
where sex='女'
order by age desc limit 9999999);

select * from my_student where
c_id=(
-- 标量子查询
select id from my_class where
c_name='python1903'); -- id一定只有一个值(一行一列)

insert into my_class values (1,
'python1907','B407');

-- 列子查询
select * from my_student where
c_id in(select id from my_class);

-- any,some,all
select * from my_student where
c_id=any(select id from my_class);
select * from my_student where
c_id=some(select id from my_class);
select * from my_student where
c_id=all(select id from my_class);

select * from my_student where
c_id!=any(select id from my_class); -- 所有结果(null除外)
select * from my_student where
c_id!=some(select id from my_class); -- 所有结果(null除外)
select * from my_student where
c_id!=all(select id from my_class); -- 所有2号班级(null除外)

select * from my_student where
age=(select max(age) from
my_student)
and
height=(select max(height)) from
my_student);

-- 行子查询
select * from my_student
-- (age,height)称之内为行元素
where (age,height)=(select max(
age),max(height) from my_student);

update my_student set height=188
where name='王五';

select * from my_student order by
age desc,height desc limit 1;

select * from my_student order by
height desc;

-- 表子查询
select * from my_student group by
c_id order by height desc; -- 每个班选出第一个学生再按身高排序

-- 表子查询(每班身高最高的学生)
select * from (select * from
my_student order by height desc
limit 9999999)as student group --》student自己起的名字
by c_id;

select exists (select * from
my_student);

select exists (select * from
my_student where id=100);

-- exists子查询
select * from my_student where
exists (select * from my_class
where id=1); -- 是否成立

select * from my_student where
exists (select * from my_class
where id=2); -- 是否成立

****************************** 第六天 **************************

-- 创建视图;单表 + 多表
create view my_v1 as
select * from my_student;

create view my_v2 as
select * from my_class;

create view my_v3 as
select * from my_student as s
left join my_class as c on s.c_id=c.id; -- id重复

-- 多表视图
create view my_v3 as
select s.*,c.c_name,c.room from
my_student as s
left join my_class as c
on s.c_id=c.id;

多表视图更新数据
update my_v3 set c_id=3 where id=5;

-- 但是用内连接生成的视图可以更新数据
-- 左外连接后的结果是包括左表中的全部行,与右表中没有对应的数据填充null,内连接只连接两表中等值的部分
create view my_v13 as
select s.*,c.c_name,c.room
from my_student as s
join my_class as c
on s.c_id=c.id;
-- 查看建视图语句
show create view my_v13\G
-- 查看视图所有数据
select * from my_v3;
select * from my_v13;
-- 多表视图更新数据
update my_v13 set c_id=3 where id=5;--成功

-- 查看视图创建语句
show create view my_v3\G -- \G 横向查看

-- 视图使用
select * from my_v1;
select * from my_v2;
select * from my_v3;

-- 修改视图
alter view my_v1 as
select id,name,sex,age,height,c_id
from my_student;

-- 创建视图
create view my_v4 as select * from my_student;

-- 删除视图
drop view my_v4;

-- 多表视图插入数据
insert into my_v3
values(null,'bc20190006','张三丰','男',
150,180,1,'python1907','B407');

-- 将学生表的学号字段设置成不允许为空
alter table my_student modify
number char(10) not null unique;

-- 单表视图插入数据;视图不包含所欲不允许为空的字段
insert into my_v1
values(null,'张三丰',150,'男',180,1); -- 插入失败(学号不允许为空)

-- 单表视图插入数据
insert into my_v2
values(2,'python1811','B410');

-- 多表视图删除数据
delete from my_v3 where id=1;

-- 单表视图删除数据
delete from my_v2 where id=4;

-- 多表视图更新数据
update my_v3 set c_id=3 where id=5;

-- 视图;age子弹限制更新
create view my_v4 as
select * from my_student where
age>30 with check option; -- 表示视图的数据来源都是年龄大于30岁,
是由where age>30 决定的
-- with check
-- option 决定通过视图更新的时候,不能将已经得到的数据age>30的改成<30的

-- 将视图可以查到的数据该成年龄小于30
update my_v4 set age=29 where id=3;

-- 可以修改数据;可以改;但是视图查不到
update my_v4 set age=32 where id=2;

-- 获取所有班级中最高的一个学生
create view my_v5 as
select * from my_student order by
height desc ;

select * from my_v5 group by c_id;

select * from my_student group by c_id
order by height desc;

-- 指定算法为临时表算法
create algorithm=temptable view
my_v6 as select * from my_student
order by height desc ;

select * from my_v6 group by c_id;

-- 查看MySQL的版本
select @@version;

-- 创建myisam表
create table my_myisam(
id int
) charset utf8 engine=myisam;

-- 向my_myisam表插入几条记录
insert into my_myisam values (1),(2),(3);

-- 单表的数据备份 --
-- ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
-- show variables like '%secure%';
-- 找到secure_file_priv | C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
-- 打开my文件,ctrl+f找到关键字secure,修改原路径:
-- 把原路径用#注释掉,改为:
-- secure-file-priv=""
-- 需要重启MySQL服务并重新登录认证

-- 单表的数据备份
select * into outfile
'D:/t/我的文档/19071/web2/student.txt' from my_student;

-- 指定备份处理方式
select * into outfile
'D:/t/我的文档/19071/web2/class1.txt'
-- 字段处理
fields
enclosed by '"' -- 数据使用双引号包裹
terminated by '|' -- 使用竖线分割字段数据
-- 行处理
lines
starting by 'START:'
from my_class;

delete from my_class;

-- 还原数据
load data infile
-- 文件所在路径
'D:/t/我的文档/19071/web2/class1.txt'
into table my_class -- 表名[(字段列表)]
-- 字段处理
fields
enclosed by '"' -- 数据使用双引号包裹
terminated by '|' -- 使用竖线分割字段数据
-- 行处理
lines
starting by 'START:';

-- SQL备份 不是SQL语句\q退出 -- 常用的 -- 不能换行
mysqldump -uroot -p123456 mydatabase my_student > D:/t/我的文档/19071/web2/student.sql

-- 整库备份
mysqldump -uroot -p123456 mydatabase > D:/t/我的文档/19071/web2/mydatabase.sql

-- 还原数据;mysql客户端还原
mysql -uroot -p123456 mydatabase < D:/t/我的文档/19071/web2/student.sql

-- SQL指令还原SQL备份
source D:/t/我的文档/19071/web2/student.sql;

**************************** 第七天 ***************************

-- 创建一个账户
create table my_account(
id int primary key auto_increment,
number char (16) not null unique
comment '账户',
name varchar (20) not null ,
money decimal (10,2) default 0.0
comment '账户余额'
)charset utf8;

-- 插入数据
insert into my_account values
(null,'1234567890000000','张三','1000'),
(null,'1234567890000001','李四','2000');

-- 张三转账1000元给李四
update my_account set money=money-1000 where id=1;

-- 事物安全
-- 开启事物
start transaction;
-- 事物的操作;1,李四账户减少钱
update my_account set money=money-1000
where id=2;
-- 事物操作;2,张三账户增加
update my_account set money=money+1000
where id=1;
-- 提交事物
commit;

-- 回滚点操作
-- 开启事物加钱
start transaction ;

-- 事物处理1;张三发工资了,
update my_account set money=money+10000
where id=1;

-- 设置回滚点
savepoint sp1;

-- 银行扣税
update my_account set money=money-10000*0.05 where id=2; -- 错误

-- 回滚到回滚点
rollback to sp1;

-- 继续操作 银行扣税
update my_account set money=money-10000*0.05 where id=1;

-- 查看结果
select * from my_account;

-- 提交结果
commit;

-- 显示系统变量autocommit(模糊查询)
show variables like 'autocommit';

-- 关闭事物自动提交
set autocommit=0; --off/0

-- 给李四发工资
update my_account set money=money+10000 where id=2;
commit;

-- 银行扣税
update my_account set money=money-10000*0.05 where id=2;

-- 事物的隔离性
start transaction;
-- 给张三返税,返500块钱
update my_account set money=money+500
where id=1;

    -- 另外窗口开启事物
    start transaction;
    -- 李四淘宝花了500
    update my_account set money=money-500 where id=2;
    select * from my_account;
    commit;
    select * from my_account;

-- 回到张三窗口;事物回滚
rollback;
select * from my_account; -- 两边一致

-- 锁机制
start transaction;
-- 使用非索引字段(name),行锁自动上升为表锁
update my_account set money=money+500
where name='张三';

    update my_account set money=money+1000 where id=2;

=================================================================

-- SQL演练
-- 查询类型cate_name为'超级本'的商品名称,价格
select * from goods where cate_name='超级本';

select name as 商品名称,price as 商品价格
from goods where cate_name='超级本';

-- 显示商品的种类
select distinct cate_name from goods;

select cate_name from goods group by cate_name;

select cate_name,group_concat(name)
from goods group by cate_name;

-- 求所有电脑产品的平均价格,并且保留两位小数
select round(avg(price),2) from goods;

-- 显示每种商品的平均价格
select cate_name,avg(price) from goods
group by cate_name;

-- 查询每种类型的商品中 最贵、最便宜、平均价、数量
select cate_name,max(price),min(price),avg(price),
count(*) from goods group by cate_name;

-- 查询所有价格大于平均价格的商品,并且按价格降序排序
select * from goods where price>
(select avg(price) from goods)
order by price desc;

-- 查询每种类型中最贵的电脑信息
select cate_name,max(price) from
goods group by cate_name;
select *

insert into goods values
(0,'东哥牌电脑','笔记本','老王','4999',default,default);

-- 查询每种类型中最贵的电脑信息
select * from goods
inner join
(
select
cate_name,
max(price) as max_price,
min(price) as min_price,
avg(price) as avg_price,
count(*) from goods group by cate_name
) as goods_new_info
on goods.cate_name=goods_new_info.cate_name and
goods.price=goods_new_info.max_price;

select g_new.cate_name,g.name,g.price
from (select cate_name,max(price) as
max_price from goods group by cate_name)
as g_new left
join goods as g
on g_new.cate_name=g.cate_name
and g_new.max_price = g.price order by g_new.cate_name;

-- 创建商品分类表
create table if not exists goods_cates(
id int unsigned primary key auto_increment,
name varchar(40) not null
);

-- 查询goods表中商品的种类
select cate_name from goods group by cate_name;

-- 拆表
-- 向表中插入
-- 将分组结果写入到goods_cates数据表
insert into goods_cates (name)
select cate_name from goods
group by cate_name;

-- 通过goods_cates数据表来更新goods表
update goods as g inner join goods_cates
as c on g.cate_name=c.name
set g.cate_name=c.id;

-- 插入类别
insert into goods_cates(name)
values ('路由器'),('交换机'),('网卡');

-- 插入商品
insert into goods (name,cate_name,brand_name,price)
values('LaserJet Pro P1606dn 黑白激光打印机', 12, 4,'1849');

-- 修改表结构
alter table goods
change cate_name cate_id int
unsigned not null;

delete from goods where id=23;

-- 添加外键
alter table goods
add foreign key (cate_id)
references goods_cates(id);

-- 插入商品
insert into goods (name,cate_name,brand_name,price)
values('LaserJet Pro P1606dn 黑白激光打印机', 12, 4,'1849'); -- 失败

-- 作业;拆品牌表
create table goods_brands (
id int unsigned primary key auto_increment,
name varchar(40) not null) select
brand_name as name from goods group by brand_name;

update goods as g inner join goods_brands as
b on g.brand_name=b.name set g.brand_name=b.id;

-- 创建测试表
create table test_index(title varchar(10));

-- 开启运行时间监测: 统计操作时间
set profiling=1;

-- 查找第10万条数据ha-99999
select * from test_index where title='ha-99999';

-- 查看执行的时间:
show profiles;

-- 为表title_index的title列创建索引:
create index title_index on test_index(title(10));

-- 执行查询语句:
select * from test_index where title='ha-99999';

-- 再次查看执行的时间
show profiles;

-- 查看索引
show index from test_index;
show index from goods;

-- 权限
use mysql;
show tables;
select user,host from user;
-- authentication_string是密码
select host,user,authentication_string from user;
-- 创建账户并授予所有权限
grant select on jd.* to 'laoweng'@'localhost' identified by '123456';
-- 使用老翁账户登录
mysql -ulaoweng -p123456
use jd;
select * from goods;
select * from goods_cates;
-- 没有权限;无法修改(也无法删除)
update goods_cates set name="abc" where id=20;

-- 创建一个laoli的账号,密码为12345678,可以任意电脑进行链接访问, 并且对jing_dong数据库中的所有表拥有所有权限
grant all privileges on jd.* to
"laoli"@"%" identified by "12345678";
use mysql;
select user,host from suer;

mysql -ulaoli -p12345678
show databases;
use jd;
show tables;
select * from goods; -- 查Ok
update goods set name="豪哥盘电脑" where id=22; -- 改OK

-- 修改密码
-- 使用root登录,修改mysql数据库的user表

-- 使用password()函数进行密码加密

update user set authentication_string=password('新密码') where user='用户名';
-- 例:
update user set authentication_string=password('123') where user='laoweng';
-- 注意修改完成后需要刷新权限

-- 刷新权限:
flush privileges

-- 备份
mysqldump -uroot -p123456 jd > jd.sql

-- 主从
-- 在主服务器上进行备份
mysqldump -uroot -p123456

作业:修改和删除分类
增删改品牌

-- 设置连接到master主服务器
change master to master_host='10.211.55.5', master_user='slave', master_password='slave',master_log_file='mysql-bin.000006', master_log_pos=590;

-- 创建购物车表
create table carts(
id int unsigned primary key auto_increment,
customer_id int unsigned not null
)charset utf8;

-- 创建购物项表
create table cart_detail(
id int unsigned primary key auto_increment,
cart_id int unsigned not null comment'购物车id',
good_id int unsigned not null comment '商品id',
quantity int unsigned not null comment '数量',
price decimal (10,2) not null comment '价格'
)charset utf8;

insert into carts values(0, 3);

insert into cart_detail values(0, 1, 22, 1, 4999.000);

select * from carts as c,cart_detail as d where c.customer_id=3 and d.good_id=22;

-- 给商品表增加图片字段
alter table goods add img varchar (200);

-- 给商品表的图片字段插入数据
update goods set img ="img/1.jpg" where id=1;
update goods set img ="img/2.jpg" where id=2;
update goods set img ="img/3.jpg" where id=3;
update goods set img ="img/4.jpg" where id=4;
update goods set img ="img/5.jpg" where id=5;
update goods set img ="img/6.jpg" where id=6;
update goods set img ="img/7.jpg" where id=7;
update goods set img ="img/8.jpg" where id=8;
update goods set img ="img/9.jpg" where id=9;
update goods set img ="img/10.jpg" where id=10;

-- 修改商品表的图片字段不允许为空
alter table goods modify img varchar(200) not null;

-- 查询用户编号=3的购物车信息
select g.img,g.name,d.price,d.quantity
from carts as c,cart_detail as d,goods as g
where customer_id=3 and c.id=d.cart_id and d.good_id=g.id;

-- 给用户增加邮箱字段
alter table customers add email varchar(100);

-- 修改用户表的地址电话字段允许为空
alter table customers address varchar(150) default null;
-- alter table customers address varchar(150) default null;

你可能感兴趣的:(MySQL课上知识点)