• MariaDB第二章:基本增删改查


    MariaDB 数据类型

    MariaDB数据类型可以分为数字,日期和时间以及字符串值。

    使用数据类型的原则:够用就行, 尽量使用范围小的,而不用大的

    • 常用的数据类型
    1. 整数:int, bit
    2. 小数:decimal                                     #decimal(5,2)
    3. 字符串:varchar, char                         
    4. 日期时间:date, time, datetime
    5. 枚举类型(enum)
    • 约束
    1. 主键primary key:物理上存储的顺序  #不能为空,不能重复,可连外键,支持索引,一般自增
    2. 非空not null:此字段不能为空
    3. 唯一unique:此字段不允许重复
    4. 默认default:当不填写此值时会使用默认值,如果填写则已填写为准
    5. 外键foreign key:对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并抛出异常

     

    引擎 InnoDB与MyISAM

    InnoDB:支持事务,支持高并发,安全    #为MariaDB默认引擎

    MyISAM:压缩数据,读取性好,速度快

    对表命令

    创建表

    create table zzzz(
        id int primary key not null auto_increment,
        name varchar(20),
        age int 
    );

    删除表

    drop table name;      #慎用

    改表名

    alter table name rename newname;

    查表

    --查看所有表
    show tables;
    
    --查看表结构
    desc 表名;
    
    --查看表创建
    show create table 表名;

    对字段命令

    添加字段

    alter table 表名 add 字段名 字段类型;

    删除字段

    alter table 表名 drop 字段名;

    改字段

    alter table 表名 modify 字段名 修改后的类型;
    #只能改数据类型
    
    alter table 表名 change 字段名 改后的字段名 改后的类型;
    #字段名字与类型都可以改

    对表中内容

    插入信息

    --全部插入
    insert into 表名 values (字段  字符类型);
    
    --部分插入 insert into 表名(字段1,字段2,...) values(字段 字符类型);

    删除

    #物理删除
    delete from 表名 where 条件(id=1);
    
    #逻辑删除(用一条字段来表示,这条信息是否还可用)
    alter table 表名 add is_delete bit default 0;
    update 表名 set is delete=1 where (条件);

    修改

    update 表名 set 字段1=新值1,字段2=新值2,...where 条件;

    查询

    --查询基本使用(条件,排序,聚合函数,分组,分页)
    
    
    --创建学生表
    create table students (
        id int unsigned not null auto_increment primary key,
        name varchar(20) default '',
        age tinyint unsigned default 0,
        high decimal(5,2),
        gender enum('', '', '中性', '保密') default '保密',
        cls_id int unsigned default 0,
        is_delete bit default 0
    );
    
    
    --创建班级表
    create table classes(
        id int unsigned auto_increment primary key not null,
        name varchar(20) not null
    );
    
    --往students表里插入数据
    insert into students values
    (0,'小明',18,180.00,1,1,0),
    (0,'小月月',19,180.00,1,2,0),
    (0,'彭于晏',28,185.00,1,1,0),
    (0,'刘德华',58,175.00,1,2,0),
    (0,'黄蓉',108,160.00,2,1,0),
    (0,'凤姐',44,150.00,4,2,1),
    (0,'王祖贤',52,170.00,2,1,1),
    (0,'周杰伦儿',34,null,1,1,0),
    (0,'程坤',44,181.00,1,2,0),
    (0,'和珅',55,166.00,1,2,0),
    (0,'刘亦菲',29,162.00,2,3,0),
    (0,'金星',45,180.00,3,4,0),
    (0,'静香',18,170.00,2,4,0),
    (0,'郭靖',22,167.00,1,5,0),
    (0,'周杰',33,178.00,1,1,0),
    (0,'钱小豪',56,178.00,1,1,0),
    (0,'谢霆锋',38,175.00,1,1,0),
    (0,'陈冠希',38,175.00,1,1,0);
    
    --查询
    -- 查询所有列
        --select * from 表名
        select * from students;
        
        --一定条件查询(where)
        select * from where id=5;
        
        
        -- 查询指定列
        select id,name from students;
        
        
        -- 使用as给字段起别名
        select id,name as '姓名', age, high, gender from students;
        
        -- 通过表名字段查询
        select students.name from students;
        
        -- 给表起别名查询
        select s.id,s.name,s.age from students as s;
        
        --消除重复行
        -- distinct
        select distinct age from students;
    
    
        
        --条件查询
            --比较运算符
            -- 查询年纪大于18岁的信息
            select * from students where age > 18;
            
            --18岁到28岁之间(and)
            select * from students where age >= 18 and age =< 28;
            select * from students where age between 18 and 28
            --在18岁以上或者身高180以上的人(or)
            select * from students where age > 18 or high > 180;
    
            
    
        -- 模糊查询
            -- like
            -- % 替代1个或者多个甚至是没有
            -- 查询姓名中有‘小’的所有名字
            select * from students where name like '%小%';
            
            -- 查询两个字人的名字
            select * from students where name like '__';
            
            -- 查询至少有2个字的名字
            select * from students where name like '%__%';
    
            
        
        --范围查询
            -- in (1,3,8)表示在一个非连续的范围内
            -- 查询 年纪为18和34的人
            select * from students where age in (18, 34);
         
            
            --查询 年龄在17岁到34岁之间的信息
            select * from students where age between 17 and 34;
            
            
            --查询 年纪不在18到34岁的信息
            select * from students where age not between 17 and 34;
        
        -- 空判断
            -- 判断is null
            -- 查询身高为空的信息
            select * from students where high is null;
            
            -- 判断非空is not null
            select * from students where high is not null;
    
        -- 排序    
            -- order by 字段
            -- asc从小到大排列,即升序    默认即asc
            -- desc从大到小排序,即降序
            
            -- 查询年纪在18到34岁之间的男性,按照年纪从小到大
            select * from students where gender=1 and age between 18 and 34 order by age;
            
            
            -- 查询年纪在18到34岁之间的女性,身高从高到矮
            select * from students where gender=2 and age between 18 and 34 order by high desc;
            
            -- order by 多字段
            -- 查询年纪在18到34岁的女性,身高从高到矮排序,如果身高相同的情况下按照年纪从小到大排序
                select * from students where age between 18 and 34 and gender=2 order by high desc;
            
            -- 查询年纪在18到34岁的男性,身高从高到矮排序,如果身高相同的情况下按照年纪从小到大排序,如果年龄也相等那么按照id从小到大排序;
                select * from students where age between 18 and 34 and gender=1 order by high desc, age, id desc;
            
            
    
            
    
            
    --聚合函数
        -- 总数
        -- count 
        -- 查询男性有多少人
        select count(*) from students where gender=1;
        
        
        -- 最大值
        -- max
        -- 查询最大的年纪
        select max(age) from students;
        
        
        -- 查询女性的最高 身高
        select max(high) from students where gender=2;
        
        -- 最小值
        -- min
        select min(high) from students;
        
        -- 求和
        -- sum
        -- 计算所有人的年龄总和
        select sum(age) from students;
        
        -- 平均值
        -- avg
        -- 计算平均年纪
        -- 计算平均年纪 sum(age)/count(*)
        select sum(age)/count(*) from students;
        select avg(age),2 from students;
        -- 保留2位小数
        select round(avg(age),2) from students;
        
    -- 分组
        -- group by
        -- 按照性别分组,查询所有的性别
        select gender from students group by gender;
        
        
        -- 计算每组性别的人数
        select gender, count(*) from students group by gender;
    
        
        -- 查询男性组中的姓名 group_concat
        select gender,group_concat(name) from students where gender=1 group by gender; 
        
        -- having
        -- 查询每个性别平均年纪超过30岁的性别,以及姓名 having avg(age) > 30
        select gender, group_concat(name) from students group by gender having avg(age) > 30;
        
        
        -- 查询每种性别中的人数多于4个的组的信息
        select gender,group_concat(name) from students group by gender having count(*)>4;
    -- 分页
        -- 显示5页
        select * from students limit 5;
    
        -- 分页显示,每页显示2条数据
        select * from students limit 0, 2;
    
        -- 按照身高从高到矮排序,查找出所有女性,并且分页显示,每页显示2条数据
        select * from students where gender=2 order by high desc limit 0,2;

     关联查询

    g--创建学生表
    create table students (
    id int unsigned not null auto_increment primary key,
    name varchar(20) default '',
    age tinyint unsigned default 0,
    high decimal(5,2),
    gender enum('', '', '中性', '保密') default '保密',
    cls_id int unsigned default 0,
    is_delete bit default 0
    );
    
     
    
    --创建班级表
    create table classes(
    id int unsigned auto_increment primary key not null,
    name varchar(20) not null
    );
    
    --往students表里插入数据
    insert into students values
    (0,'小明',18,180.00,2,1,0),
    (0,'小月月',19,180.00,2,2,0),
    (0,'彭于晏',28,185.00,1,1,0),
    (0,'刘德华',58,175.00,1,2,0),
    (0,'黄蓉',108,160.00,2,1,0),
    (0,'凤姐',44,150.00,4,2,1),
    (0,'王祖贤',52,170.00,2,1,1),
    (0,'周杰伦儿',34,null,1,1,0),
    (0,'程坤',44,181.00,1,2,0),
    (0,'和珅',55,166.00,2,2,0),
    (0,'刘亦菲',29,162.00,3,3,0),
    (0,'金星',45,180.00,2,4,0),
    (0,'静香',18,170.00,1,4,0),
    (0,'郭静',22,167.00,2,5,0),
    (0,'周杰',33,178.00,1,1,0),
    (0,'钱小豪',56,178.00,1,1,0),
    (0,'谢霆锋',38,175.00,1,1,0);
    
    
    --向classes表里插入数据
    insert into classes values (0, '云唯_01期'),(0, '云唯_02期');
    
     
    
     
    
    -- 连接查询(内关联)
    -- inner join ... on
    -- 两个表连接查询
    select * from students inner join classes
    -- 查询能够对应班级的学生以及班级信息
    select * from students inner join classes on students.cls_id=classes.id;
    -- 按照要求显示姓名,班级
    select students.*, classes.name from students inner join classes on students.cls_id=classes.id;
    
    -- 给数据表起名字
    select s.name, c.name from students as s inner join classes as c on s.cls_id=c.id;
    
    -- 查询 有能够对应班级的学生以及班级信息,显示学生的所有信息,只显示班级名称
    select students.*, classes.name from students inner join classes on students.cls_id=classes.id;
    
    -- 在以上查询中将班级姓名显示在第一列
    select classes.name,students.* from students inner join classes on students.cls_id=classes.id;
    
    -- 查询有能够对应班级的学生以及班级信息,按照班级进行排序
    select classes.id, students.* from students inner join classes on students.cls_id=classes.id order by classes.id;
    
    -- 当是同一个班级的时候,按照学生的id从小到大
    select classes.id, students.* from students inner join classes on students.cls_id=classes.id order by classes.id, students.id;
    
    --连接查询(左关联,右关联)
    --左关联,以左边表为基准,条件对应不上的显示null
    select * from students left join classes on students.cls_id=classes.id; 
    
    --右关联,以后边为基准,条件对应不上的显示null
    select * from classes left join students on students.cls_id=classes.id; 
    
    
    
    -- 自关联    #只有当表结构相同时,才可以使用自关联
    create table areas(
    aid int primary key auto_increment,
    name varchar(20),
    pid int
    );
    -- 查询出河北省所有市
    select * from areas as province inner join areas as city on province.aid=city.pid having name='河北省';
    
    select province.name,city.name from areas as province inner join areas as city on province.aid=city.pid having province.name='河北省';
    
    -- 子查询
    -- 标量子查询
    -- 查询出北京市所有区的信息
    select * from areas where pid=(select aid from areas where name='北京市');
    
    
    select * from areas where pid in (select aid from areas where name='北京市');
  • 相关阅读:
    (转)五大常用算法之二:动态规划算法
    (转)五大常用算法之一:分治算法
    dict
    usaco2
    usaco3
    usaco4
    usaco1
    并查集
    洛谷P1428小鱼比可爱
    洛谷P1967货车运输
  • 原文地址:https://www.cnblogs.com/zhou2019/p/10626399.html
Copyright © 2020-2023  润新知