美文网首页
MySQL课上知识点

MySQL课上知识点

作者: BJ000 | 来源:发表于2020-02-27 15:02 被阅读0次

    -- 连接认证
    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课上知识点

          本文链接:https://www.haomeiwen.com/subject/fohqchtx.html