• MariaDB——相关概念与sql语句




    数据库变量

     
    数据库的两个目录
      数据存放目录:/var/lib/mysql/     配置文件目录:/etc/my.cnf.d/

    查看数据库的变量
      show global variables like '%pro%';
      show session variables like '%pro%';
      set session profiling=1;
      show session variables like '%pro%';
      --session变量只在会话层生效,退出会话再进入数据库那么配置就会失效。
      --global变量在全局生效,但是重启数据库之后会失效,要想永久生效需要将参数设定写入到配置文件之中。
      --将想要设置的变量值写到配置文件的[server]之下即可,这里需要注意的是:并不是所有的变量写到配置文件里都能生效。
      show global variables like '%buffer_pool%';
      set @@global.profiling=1;
      set global profiling=0;
      --不接global默认修改session,修改全局变量需要加上global。
     
      --状态变量
      用来保存mysqld运行中的统计数据的变量,状态变量没有办法修改。
      show global status;
      show session status;
      show table status like 'students';  #查看表的状态
     

    关联查询

     
    表的自关联
      create table areas(
        aid int primary key auto_increment,
        name varchar(22),
        pid int
      );
      show tables;
      source areas.sql;  #将sql语句要插入的内容写到文件中,放到连接数据库时所在的工作目录之中,执行source即可。
                    #确保已经切换到该表所在的库。

      --自关联查询使用inner join
        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 provine.name='河北省';
        select * from areas as p inner join areas as c on p.aid=c.pid;
        select * from areas as p inner join areas as c on p.aid=c.pid having p.name='北京市';
     
      --子查询
        select aid form areas where name='北京市';
        select * from areas where pid=1;
      合并:
        select * from areas where pid=(select aid from areas where name='北京市');
        #可以联合多个inner join,嵌套多层。不过结构可能需要慎重考虑。
     
    表的关联查询
      #windows路由跟踪tracert www.baidu.com
      select * from students;
      select * from classes;
      select * from students inner join classes on students.cls_id=classes.id;
      select students.name,classes.name from students inner join classes on students.cls_id=classes.id;
      select classes.name as class,students.name from students inner join classes on students.cls_id=classes.id order by class;
      --左右关联查询
      select * from classes left join students on calsses.id=students.cls_id;   #以classes为基准
      select * from students left join classes on classes.id=students.cls_id;   #以students为基准,没有班级的学生班级为空
      --left join 和 right join 相当于调换位置。
      select * from students right join classes on classes.id=students.cls_id;
      --关联查询只是查询,并没有真正将两张表真正关联起来。
      --外键:真正将两张表关联起来。
      select * from classes inner join students on students.cls_id=classes.id;        #使用where也可以,但有时会报错。
      select classes.name,students.name from classes inner join students on students.cls_id=classes.id;
      select calsses.name,students.name from classes inner join students on students.cls_id=classes.id order by classes.name;
      select classes.name,students.name from classes right join students on classes.id=students.cla_id order by classes.name;
      --以students为基准 classes没有的为null
      select c.name,s.name from classes as c right join students as s on c.id=s.cls_id order by c.name;
      --多个inner join,如果c.id=b.id=a.id 写成:c.id=b.id and b.id=a.id
     

    视图


    --定义试图建议使用v_开头,为了将视图和表做出区分。
      create view 视图名称 as select语句;
    --查看视图
      show tables;       #会将所有的视图也列出来
      show table status like 'v_test';
    --删除视图
      drop view 视图名称;
      drop view v_test;
    --视图的用处就是查询,简化sql语句。视图只能用于查询,不能用于增删改查。
      select classes.name,students.name from students inner join classes on students.cls_id=classes.id;
    --创建视图
      create view v_info as select c.name as c_name,s.name as s_name from students as s inner join calsses as c on s.cls_id=c.id;
    --如果两个colume都是name那么会报重复的错误,所以起一个别名。
      select * from v_info;
    --视图只能查询,无法实现增删改查。
     

    事物


    事物具有ACID特性:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durabulity)。
    要求:表的引擎类型必须是innodb类型才可以使用事物,这是mysql表的默认引擎。
    开启事物:begin 或者 start transaction;
    关闭事物(提交或者回滚):commit或者rollback
    如果你是通过第三方来操作数据库,比如pymysql,那么是默认开启事物的,操作结束之后一定记得commit。
    开启事物之后使用delete删除,rollback可以回滚。但是使用truncate删除后rollback是恢复不了的。
    也只有在事物里面才能回滚。如果没有开启事物或者已经commit了,那么就不能rollback了.
      show variables like '%commit%';
      --默认是开启autocommit,执行一条sql语句自动commit。
    数据库的变量影响着数据库的性能,数据库的调优也是对变量的设置。
    如果将变量autocommit设置为0,那么你的操作需要commit才能生效。
    可以使用set:全局变量、session变量,也可以写入配置文件:
    [server]
    autocommit=0
    然后重启数据库才能生效。
    使用配置文件更改这种变量是永久型的,使用set是临时型的,global——是重启数据库失效,session——退出当前会话失效。
     
     

    索引

     
    对于索引而言只是用于大量的查询,如果涉及大量的增删改可能事与愿违.
    主键默认有索引的作用,索引可以加快查询的速度,但也不是越多越好,如果数据库涉及大量的增删改的话,修改数据的同时也要对对应的索引
    进行修改,因此会大量降低数据库的性能。
     
    --创建索引
     方式一、在创建表的时候创建索引
        create table index(
          id int primary key,
          name varchar(22),
          age int,
          key (age)
        );
     方式二、在已经存在的表上创建索引
        create index 索引名称 on 表名(字段名)
        create index age_index on index(age);
    --查看索引
       show index from 表名;
    --删除索引
       drop index 索引名称 on 表名;
     
    --索引能降低查询的时间,加快查询的速度
    --可以使用时间测试来检测
       set profiling=1;  #打开sql语句的执行时间
       show profiles;   #查看sql执行时间
      create table test_table (id int primary key auto_increment,name varchar(20),title varchar(20));
      desc test_table;
    --循环插入数据之后设置参数
      set profiling=1
      select * from test_table where 'name=name-88888';
      show profiles;
      create index name_index on test_table(name);
      select * from test_table where 'name=name-88888';
      show profiles;
    --会发现查询的时间大大缩短了,查询的性能更优。
     
     

    外键foreign key

     
    外键:如果一个实体的某个字段指向了另一个实体的主键,就称之为外键。
    --添加外键
      alter table students add constraint fk_students foreign key (gid) references grade(gid) on delete cascade;
    --查看外键
      show create table 表名;
      alter table students drop foreign key 外键名称;
      select * from classes;
      select * from students;
      alter table students add constraint fk foreign key (cls_id) references classes(id);
    --建立起了外键这个时候要插入cls_id那么可能需要注意不能超过主表的id,否则会报错。
    --如果class(id)只有1和2,插入数据的时候students(cls_id)写3会报错。
      delete from classes where id=1;   #外键约束,无法删除
    --先删除子表再删除父表
      delete from students where cls_id=1;
      select * from students;
      delete from classes where id=1;   #发现可以删除
    --级联删除
      alter table students drop foreign key fk;
      alter table students add constraint fk foreign key (cls_id) references classes(id) on delete cascade;
      delete from classes where id=2;   #删除成功,级联删除
      selete * from students;
      selete * from classes;
     

     
     
     
  • 相关阅读:
    设计模式读书笔记-----适配器模式
    设计模式读书笔记-----命令模式
    一种另类的解决URL中文乱码问题--对中文进行加密、解密处理
    设计模式读书笔记-----单例模式
    Mysql的一些小知识点
    2-逻辑题二
    1-逻辑题一
    12-1054. 求平均值
    11-1048.数字加密
    10-string类的length()返回值一起的问题
  • 原文地址:https://www.cnblogs.com/getbird/p/11730912.html
Copyright © 2020-2023  润新知