数据分析mysql4.21

本文详细介绍了MySQL的基本操作,包括用户登录、修改密码、配置文件、重要概念、基本SQL语句如针对库、表和记录的操作。讨论了存储引擎,特别是MyISAM、InnoDB、BlackHole和Memory。深入讲解了数据类型,如整型、浮点型、字符类型,以及严格模式。此外,还探讨了char与varchar的区别、枚举与集合类型、日期类型,并展示了创建表的完整语法和字段约束条件。强调了主键和自增特性,以及外键在表关系中的一对多、多对多和一对一关系的应用。最后,提到了级联更新和级联删除在外键约束中的作用。

昨日内容回顾

  • 用户登录

    mysql -u用户名 -p密码
    
    # 修改密码
    mysqladmin -u用户名 -p原密码 password 新密码
    
  • 忘记密码

    mysql --skip-grant-tables
    
  • 配置文件

    统一编码
    
    自带的配置文件
        my-default.ini
    自定义配置文件
        my.ini
        
    # 修改完配置之后一定要重启服务端    
    
  • 重要概念

    对应关系
    
  • 基本SQL语句

    1.针对库
         查
              1.show databases;
              2.show create database 库名;
         增
              create database 库名;
         改
              alter database 库名 charset='gbk';
         删
              drop database 库名;
    2.针对表
        如何查看当前在哪个库下
             select database();
        如何切换数据库
             use 库名;1.show tables;
              2.show create table 表名; # 针对具体表名 
              3.desc 表名;
         增
              create table 表名(字段名1 字段类型1,...);
         改
              alter table 表名 modify 字段名 字段类型(16);
         删
              drop table 表名;
    3.针对记录        
        查
        	1.select * from 表名;
            2.select * from 库名.表名;
            3.select 字段名1,字段名2... from 表名;
        增
        	insert into 表名 values(...);
            insert into 表名 values(...),(...),(...); # 插入多个
        改
        	update 表名 set 字段名=新的值 where 筛选条件;
        删
        	delete from 表名 where 筛选条件;   
    
  • 存储引擎

    show engines;
    
    # 四种需要掌握的引擎
    MyISAM、InnoDB、BlackHole、Memory
    
  • 数据类型之整型

    tinyint
    smallint
    int
    bigint
    能够存储的数字范围不同  并且默认情况下都是自带符号的
    
  • 数据类型之浮点型

    float(255,30)
    double(255,30)
    decimal(65,30)
    精确度不一致
         float < double < decimal
    补充知识
       针对数字很多时候都会出现不精确的情况
       所以有时候看似需要用数字存储的数据内部可能存的都是字符串
    
  • 数据类型之字符类型

    char(4)
    varchar(4)
    
  • 严格模式

    show variables like '%mode%'
    
    set globai sql_mode = '...'
    

今日内容概要

  • char与varchar对比

  • 枚举与集合类型

  • 日期类型

  • 创建表的完整语法

  • 字段的约束条件

    在字段类型的基础之上添加额外的限制
    
  • 查询关键字

今日内容详细

char与varchar对比

char(4)
    不超过4个字符 还是存四个字符(空格填充)
varchar(4)
    不超过4个字符 有几个存几个
    
char
     优点:整存整取 不会出现数据错乱 速度快
     缺点:浪费存储空间
varchar
     优点:节省存储空间
     缺点:存取数据的速度较于char偏慢
"""
char(5)
    jasonegon kevintony tom jack
char(5)    
    11bytes+jason1bytes+egon1bytes+kevin1bytes+tony
"""
# 到底使用char还是varchar?
    其实二者都有应用场景
    一般情况下推荐使用varchar
    但是具体结合实际需求(产品经理 架构师...)

枚举与集合类型

枚举
    多选一
create table user1(
    id int,
    name varchar(16),
    gender enum('male','female','others')
);
# 列举可以写入的数据   不在范围之内直接报错(严格模式)


集合
    多选多(包括多选一)
create table user2(
    id int,
    name varchar(16),
    hobby set('read','study','run','ball')
);    

日期类型

datetime      年月日时分秒
date          年月日
time          时分秒
year           年


create table user3(
    id int,
    name varchar(16),
    reg_time datetime,
    birthday date,
    study_time time,
    stime year
);
# 我们在录入时间数据的时候 其实都是直接借助于获取时间的模块
# 只做模拟演示  自己写时间
insert into user3 values(1,'jason','2000-11-11 11:11:11',
'1995-01-21','12:30:00','2020');   

创建表的完整语法

create table 表名(
    字段名1 字段类型(宽度 约束条件),
    字段名2 字段类型(宽度 约束条件),
    字段名3 字段类型(宽度 约束条件)
);
1.字段名和字段类型是必须的 宽度和约束条件是可选的
2.约束条件可以有多个!!!
3.最后一个字段结尾不要加逗号

约束条件

1.unsigned           无符号
create table t1(id tinyint);
create table t2(id tinyint unsigned);
insert into t1 values(255);
insert into t2 values(255);

2.zerofill         0填充
create table t3(id tinyint zerofill);
insert into t3 values(1);

3.not null        非空
create table t4(name varchar(16) not null);
insert t4 values();    # 报错  必须给个值

4.default    默认值
create table t5(
    name varchar(16),
    gender varchar(16) default 'male'
);
"""
在插入数据的时候也可以指定字段  不指定默认就是按照顺序依次传值
insert into t5(name) values(值)
"""

###########################复杂################
5.unique          唯一
# 单列唯一
create table t6(
    id int,
    name varchar(16) unique
);
insert into t6(id,name) values(1,'jason'),(2,'jason');
# 多列唯一(联合唯一)
create table t7(
    id int,
    host varchar(16),
    port int,
    unique (host,port)
);
insert into t7 values(1,'127.0.0.1',8080),(2,'127.0.0.2',8080),
(3,'127.0.0.1',8080);

***********************
6.primary key      主键
***********************
    特点:1.主键在约束条件上相当于是not null + unique(非空且唯一)
    # 单列主键
    create table t8(
        id int primary key    # id int not null unique
    );
    # 多列主键(联合主键) 本质还是一个主键 并且这种情况使用较少
    create table t9(
        ip char(16),
        port int,
        primary key(ip,port)
    );
    2.由于5.6及之后的版本存储引擎都是InnoDB
    该引擎规定了所有的表都必须有且只有一个主键
    '''1.没有设置主键也没有其他约束条件'''
        InnoDB为了能够创建出表  会自动采取内部隐藏的字段作为主键
        隐藏意味我们无法使用到该主键  是没有意义的!!!
    '''2.没有设置主键但是有其他约束条件'''
        InnoDB会自上而下的将一个非空且唯一的字段升级为主键使用
        create table t12(
            id int,
            name char(16),
            age int not null unique,
            addr char(16) not null unique
        );
        字段将age升级为主键
        总结:以后我们在创建表的时候一定要自己指定主键
        并且主键一般都是序号 用来唯一标识数据
        所以主键一般情况下都是设置给表中的第一个id字段
            uid sid pid cid只要是用来标识数据唯一性即可
            
7.auto_increment      自增
    是专门用来给主键使用的 目的就是让主键能够自己增加不需要人为数数
    create table t13(
        id int primary key auto_increment,
        name char(16)
    );
    insert into t13(name) values('jason'),('kevin'),('tony');
    
"""
以后创建表的时候固定写序号字段
    create table t1(
    id int primary key auto_increment,
    ....
    );
在写入数据的时候也不需要考虑主键字段了
"""    

主键的特点

自增不会因为删除数据而重置
     delete from
如果真的想删除数据并重置主键
     truncate

外键(重点)

外键也属于约束条件 但是功能是用来建立表与表之间的关系
属于特殊的约束条件

# 前戏
创建一张公司里面的员工表
id   name    age     dep_name       dep_desc

缺陷:
    1.表含义不明确(可以忽略)
    2.数据存在重复浪费存储空间(可以忽略)
    3.数据修改极其繁琐 不便于扩展(不能忽略)
    
    措施:
        将员工表一分为二
            员工表
               id name age 
            部门表  
               id dep_name dep_desc
                
    外键字段(关系字段)的由来
    部门编号   对应的就是部门表里面的主键字段

表关系

1.一对多关系
2.多对多关系
3.一对一关系
4.没有关系
"""一定要学会表关系的判断!!!"""
# 表关系判断 遵循"换位思考"原则即可

员工表与部门表为例
    1.先站在员工表
        问:一个员工能否对应多个部门
           结论:不可以
    2.再站在部门表
        问:一个部门能否对应多个员工
           结论:可以
    总结:一个可以一个不可以 那么这种关系就是"一对多"
    
create table emp(
    id int primary key auto_increment,
    name char(16),
    gender enum('male','female') not null default 'male',
    dep_id int,
    foreign key(dep_id) references dep(id)
);
create table dep(
    id int primary key auto_increment,
    dep_name char(10),
    dep_comment char(60)
);
# 基于换位思考得出员工表与部门表是一对多的外键关系
"""
针对一对多的外键关系
    关系字段建在多的一方(员工表就是多)
"""

外键约束

1.在创建表的时候需要先创建被关联表
    简单理解:先创建没有外键字段的表再创建有外键字段的表
2.在第一次录入数据的时候需要先录入被关联表之后再录入关联表
    简单理解:先录入没有外键字段的表再录入有外键字段的表
3.涉及到编辑和删除操作
    修改数据
        # 修改部门编号   不行
        # 删除部门数据   不行
"""针对关系字段的修改与删除如何解决"""
级联更新  级联删除
create table dep1(
    id int primary key auto_increment,
    dep_name char(10),
    dep_comment char(60)
);
create table emp1(
    id int primary key auto_increment,
    name char(16),
    gender enum('male','female') not null default 'male',
    dep_id int,
    foreign key(dep_id) references dep1(id)
    on update cascade
    on delete cascade   # 这三句为一句 没有逗号
);   

多对多关系

以图书表与作者表为例
1.先站在图书表的角度
	问:一本书能否对应多个作者
        结论:可以
2.再站在作者表的角度
	问:一名作者能否对应多本书
        结论:可以
结论:两边都可以 那么表关系就是"多对多"

# SQL实现(先写基础的字段 之后再添加外键字段)
create table book(
    id int primary key auto_increment,
    title varchar(32),
    price float(8,2)
);
create table author(
    id int primary key auto_increment,
    name varchar(32),
    age int
);
"""针对多对多关系
    外键字段不能直接建在关系表中
        需要再额外创建一张专门用来存储关系的第三张表
"""
create table book2author(
    id int primary key auto_increment,
    book_id int,
    author_id int,
    foreign key(author_id) references author(id)
    on update cascade
    on delete cascade,
    foreign key(book_id) references book(id)
    on update cascade
    on delete cascade
);

一对一关系

以用户表与用户详情表为例
	1.先站在用户表角度
    	问:一个用户能否对应多个用户详情
            结论:不可以
    2.再站在用户详情表
    	问:一个用户详情能否对应多个用户
            结论:不可以
总结:两个都不可以 那么表关系就是"一对一关系"(没有关系的话直接就能看出来)

"""针对一对一表关系
   外键字段建在任何一方都可以,推荐建在查询频率较高的表中
"""
create table user(
    id int primary key auto_increment,
    addr varchar(32),
    age int,
    user_detail_id int unique,
    foreign key(user_detail_id) references user_detail(id)
    on update cascade
    on delete cascade
);
create table user_detail(
    id int primary key auto_increment,
    addr varchar(32),
    phone bigint
);

作业

1.整理今日内容
    约束条件
2.背诵表关系判断口诀并完成下列表关系判断
     学生表与课程表
     老师表与班级表
     成绩表与学生表
    # 要求 文字写出整个判断过程以及SQL语句 并在MySQL中录入截图为证
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值