一、连接查询

1)进入自己创建的zz数据库

2)创建学生表:

  1. create table students (
  2. id int unsigned not null auto_increment primary key,
  3. name varchar() default '',
  4. age tinyint unsigned default ,
  5. high decimal(,),
  6. gender enum('男', '女', '中性', '保密') default '保密',
  7. cls_id int unsigned default ,
  8. is_delete bit default
  9. );

往学生表写入数据

  1. insert into students values
  2. (,'小明',,180.00,,,),
  3. (,'小月月',,180.00,,,),
  4. (,'彭于晏',,185.00,,,),
  5. (,'刘德华',,175.00,,,),
  6. (,'黄蓉',,160.00,,,),
  7. (,'凤姐',,150.00,,,),
  8. (,'王祖贤',,170.00,,,),
  9. (,'周杰伦儿',,null,,,),
  10. (,'程坤',,181.00,,,),
  11. (,'和珅',,166.00,,,),
  12. (,'刘亦菲',,162.00,,,),
  13. (,'金星',,180.00,,,),
  14. (,'静香',,170.00,,,),
  15. (,'郭静',,167.00,,,),
  16. (,'周杰',,178.00,,,),
  17. (,'钱小豪',,178.00,,,),
  18. (,'谢霆锋',,175.00,,,);

3)创建班级表:

  1. create table classes(
  2. id int unsigned auto_increment primary key not null,
  3. name varchar() not null
  4. );

往班级表里添加数据:

  1. insert into classes values (, '云唯_01期'),(, '云唯_02期');

内关联:  --inner join(在zz数据库下)

1.查询学生对应的班级信息

select * from students as s  inner join  classes as c  on s.cls_id=c.id  order by s.cld_id ;

#将students与classes关联显示并且取别名为s和c。第三个蓝色块则是将具体的字符关联起来,并以学生表的id字段排序,如果查看相反信息则转换students和classes的位置。

2.左关联:

select * from students as s left join classes as c on c.id=s.cls_id order by s.cls_id;

#左关联既是以左边的students为基准关联classes。效果如下:

  1. +----+--------------+------+--------+--------+--------+-----------+------+--------------+
  2. | id | name | age | high | gender | cls_id | is_delete | id | name |
  3. +----+--------------+------+--------+--------+--------+-----------+------+--------------+
  4. | | 小明 | | 180.00 | | | | | 云唯_01 |
  5. | | 钱小豪 | | 178.00 | | | | | 云唯_01 |
  6. | | 周杰 | | 178.00 | | | | | 云唯_01 |
  7. | | 谢霆锋 | | 175.00 | | | | | 云唯_01 |
  8. | | 周杰伦儿 | | NULL | | | | | 云唯_01 |
  9. | | 王祖贤 | | 170.00 | | | | | 云唯_01 |
  10. | | 黄蓉 | | 160.00 | | | | | 云唯_01 |
  11. | | 彭于晏 | | 185.00 | | | | | 云唯_01 |
  12. | | 凤姐 | | 150.00 | 保密 | | | | 云唯_02 |
  13. | | 小月月 | | 180.00 | | | | | 云唯_02 |
  14. | | 程坤 | | 181.00 | | | | | 云唯_02 |
  15. | | 和珅 | | 166.00 | | | | | 云唯_02 |
  16. | | 刘德华 | | 175.00 | | | | | 云唯_02 |
  17. | | 刘亦菲 | | 162.00 | 中性 | | | NULL | NULL |
  18. | | 静香 | | 170.00 | | | | NULL | NULL |
  19. | | 金星 | | 180.00 | | | | NULL | NULL |
  20. | | 郭静 | | 167.00 | | | | NULL | NULL |
  21. +----+--------------+------+--------+--------+--------+-----------+------+--------------+

因为classes的id没有3,4,5,所以在关联的时候默认为空值显示。

3.右关联

与左关联规则一致,上述命令的left 改为right后id指挥显示1和2,而不是显示3,4,5,因为以右边的classes为基准.

4.自关联

source test.sql                              #将终端下的文件复制到数据库下

以下是关联表:

  1. MariaDB [zz]> select * from areas;
  2. +-----+-----------+------+
  3. | aid | name | pid |
  4. +-----+-----------+------+
  5. | | 北京市 | NULL |
  6. | | 天津市 | NULL |
  7. | | 河北省 | NULL |
  8. | | 山西省 | NULL |
  9. | | 海淀区 | |
  10. | | 滨海区 | |
  11. | | 沧州市 | |
  12. | | 大同市 | |
  13. | | 朝阳区 | |
  14. | | 武清区 | |
  15. | | 石家庄 | |
  16. | | 太原市 | |
  17. | | 西二旗 | |
  18. | | 大港 | |
  19. | | 任丘市 | |
  20. | | 清徐 | |
  21. | | 中关村 | |
  22. | | 汉沽 | |
  23. | | 河间市 | |
  24. | | 阳曲 | |

1)查找北京市下的区

MariaDB [zz]> select * from areas as p inner join areas as c on p.aid=c.pid where p.name='北京市' ;

  1. | aid | name | pid | aid | name | pid | #自关联并列显示
  2. +-----+-----------+------+-----+-----------+------+
  3. | | 北京市 | NULL | | 海淀区 | |
  4. | | 北京市 | NULL | | 朝阳区 | |

2)查找所有省市关联的区域,并且制作视图

  1. create view v_v as select p.*,c.aid as id ,c.name as n,c.pid as i from areas as p inner join areas as c where p.aid = c.pid

##蓝色块区域为查看p表下的所有字段以及将c表的name、aid、pid都改成别名显示(因为c表和b表的字段冲突,p、c表也是areas表的别名)

视图**

  • 对于复杂的查询,在多个地方被使用,如果需求发生了改变,需要更改sql语句,则需要在多个地方进行修改,维护起来非常麻烦

create  view 视图名 as select语句;     #创建视图

show tables;                 #查看视图

drop  view 视图名;     #删除视图

# 视图与表同级,所以最好用带‘v’来区分。

 数据库的备份与恢复

  1. #备份某一个数据库
  2. mysqldump -uroot -proot --databases 数据库名 > testdb.sql
  3. #备份所有数据库
  4. mysqldump -uroot -proot --all-databases > all_databases.sql
  5. #备份数据库下的表
  6. mysqldump -uroot -proot 数据库名 表名 > students.sql
  7. #还原数据(sql命令行下)
  8. source testdb.sql(文件名)

事务***

为什么要有事务

   事务具有ACID特性:原子性(A,atomicity)、一致性(C,consistency)、隔离性(I,isolation)、持久性(D,durabulity)。

  • 事务广泛的运用于订单系统、银行系统等多种场景
  • 例如:A用户和B用户是银行的储户,现在A要给B转账500元,那么需要做以下几件事:
      1. 检查A的账户余额>500元;
      2. A 账户中扣除500元;
      3. B 账户中增加500元;
  • 上述3个步骤的操作必须打包在一个事物中,任何一个步骤失败,则必须回滚所有步骤
  • 可以用start transaction或者begin语句开始一个事物,然后要么使用commit提交将修改的数据持久保存,要么使用rollback撤销所有修改,事物sql的样本如下:
    • start transation ;            #开始事务
  1. select balance from checking where customer_id=1024232;
  2. update checking(表名)set  balance=balance-200.00 where customer_id=1024232;
  3. update savings set balance=balance+200.00 where customer_id=1024232;
    1. commit;                   #提交事务
  • 原子性:事务内的所有操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
  • 一致性:数据库总是从一个一致性的状态转换到另一个一致性的状态(在前面的例子当中,一致性确保了,即使在执行第三、四条语句之间系统崩溃,支票账户也不会损失200美元,因为事物最终没有被提交,所以事物中所做的修改也不会保存到数据库中)
  • 隔离性:一个事物所做的修改在最终提交之前,对其他事物是不可见的(在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时有另外一个账户汇总程序开始运行,则其看到的支票账户的余额并没有被减去200美元。)
  • 持久性:事务完成后,该事务内涉及的数据必须持久性的写入磁盘保证其持久性。当然,这是从事务的角度来考虑的的持久性,从操作系统故障或硬件故障来说,这是不一定的。

事务命令

  • 要求:表的引擎类型必须是innodb类型才可以使用事务,这是mysql表的默认引擎
  • 查看表的创建语句,可以看到engine=innodb
    • 要求:表的引擎类型必须是innodb类型才可以使用事务,这是mysql表的默认引擎
    • 查看表的创建语句,可以看到engine=innodb
    1. show create table students;
    • 修改数据的命令会触发事务,包括insert、update、delete

    • 开启事务,命令如下:

      • begin
      • 开启事务后执行修改命令,变更会维护到本地缓存中,而不维护到物理表中
    • 提交事务,命令如下

      • 将缓存中的数据变更维护到物理表中
    1. rollback
    • 回滚事务,命令如下:

      • 放弃缓存中变更的数据

         
         
         
  1. 实例
  2. --在创建事务之前将表创建好,不能begin后在创建
  3. MariaDB [test]> create table xixi (id int primary key auto_increment,num int unsigned);
  4. MariaDB [test]> insert into xixi values (,),(,),(,);
  5.  
  6. --事务开始
  7. MariaDB [test]> begin;
  8. MariaDB [test]> select * from xixi;
  9. +----+------+
  10. | id | num |
  11. +----+------+
  12. | | |
  13. | | |
  14. | | |
  15. +----+------+
  16. MariaDB [test]> update xixi set num=num- where id=;
  17. MariaDB [test]> update xixi set num=num+ where id=;
  18. MariaDB [test]> select * from xixi;
  19. +----+------+
  20. | id | num |
  21. +----+------+
  22. | | |
  23. | | |
  24. | | |
  25. +----+------+
  26.  
  27. --回滚事务
  28. MariaDB [test]> rollback;
  29.  
  30. MariaDB [test]> select * from xixi;
  31. +----+------+
  32. | id | num |
  33. +----+------+
  34. | | |
  35. | | |
  36. | | |
  37. +----+------+
  38.  
  39. --提交事务
  40. MariaDB [test]> commit;
  41. MariaDB [test]> select * from xixi;
  42. +----+------+
  43. | id | num |
  44. +----+------+
  45. | | |
  46. | | |
  47. | | |

 索引**

  • 思考:在图书馆中是如何找到一本书的?
  • 一般的应用系统对比数据库的读写比例在10:1左右,而且插入操作和更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重
  • 当数据库中数据量很大时,查找数据会变得很慢
  • 优化方案:索引

1)查看索引:

方式一:建表时创建索引

  1. create table create_index(
  2. id int primary key,
  3. name varchar() unique,
  4. age int,
  5. key (age) #在字段上设置索引
  6. );

方式二:对于已经存在的表,添加索引

  1. 如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致
  2. 字段类型如果不是字符串,可以不填写长度部分
  3.  
  4. create index 索引名称 on 表名(字段名称(长度))
  5. 例:
  6. create index age_index on create_index(age) #在create_index表上的age字段创建索引
    show create table create_index #查看此表是否添加上索引。
  • 删除索引:
  1. drop index 索引名称 on 表名; #删除成功则KEY `age_index` (`age`)消失

mariadb(四)连接查询,视图,事物,索引,外键的更多相关文章

  1. MariaDB 连接查询,视图,事物,索引,外键

    1.连接查询 --创建学生表 create table students ( id int unsigned not null auto_increment primary key, name var ...

  2. mariadb 视图 事务 索引 外键

    视图 对于复杂的查询,在多个地方被使用,如果需求发生了改变,需要更改sql语句,则需要在多个地方进行修改,维护起来非常麻烦   假如因为某种需求,需要将user拆房表usera和表userb,该两张表 ...

  3. mysql(视图 事务 索引 外键)

    视图   视图本质就是对查询的封装   创建视图(定义视图 起名以v_开头) create view v_students as select classes.name as c_name ,stud ...

  4. mysql字段约束-索引-外键---3

    本节所讲内容: 字段修饰符 清空表记录 索引 外键 视图 一:字段修饰符 (约束) 1:null和not null修饰符   我们通过这个例子来看看 mysql> create table wo ...

  5. MySQL 视图 事务 索引 外连接

    视图 1.定义 select 语句的结果集,是一张虚拟的表2.创建视图语句create view 视图名 as select语句3.查看视图show views;4.使用视图select * from ...

  6. 总结: MySQL(基础,字段约束,索引,外键,存储过程,事务)操作语法

    1. 显示数据库列表 show databases; # 查看当前所有数据库 show databases \G   #以行的方式显示 2. 在命令行中,执行sql语句 mysql -e 'show ...

  7. 2-16 MySQL字段约束-索引-外键

    一:字段修饰符 1:null和not null修饰符 我们通过这个例子来看看 mysql> create table worker(id int not null,name varchar(8) ...

  8. day38:MySQL数据库之约束&索引&外键&存储引擎

    目录 part1:数据类型 part2:约束 part3:主键索引 PRI &唯一索引 UNI &普通索引 MUL part4:外键:foreign key part5:在外键中设置联 ...

  9. mysql的事物,外键,与常用引擎

    ### part1 时间类型 date YYYY-MM-DD 年月日 (出现日期) time HH:MM:SS 时分秒 (竞赛时间) year YYYY 年份值 (红酒年份 82年矿泉水) datet ...

随机推荐

  1. [Python3] 006 列表的常用方法

    目录 一个篱笆三个桩,list 有--好多个桩 1. 列表的小伙伴们 (1) 召唤小伙伴 (2) 我给"他们"分了个组 2. 小伙伴们的"才艺展示" (1) & ...

  2. 从SVN下检出项目内容【步骤】

    1.新创建一个新的工作环境,然后new--->other--->SVN 2.点击Next,然后进行检出项目的操作,如下图所示: 3.再点击Next,进行输入指定的url地址,从指定的url ...

  3. [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)

    [BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...

  4. 攻防世界--ReverseMe-120

    测试文件:https://adworld.xctf.org.cn/media/task/attachments/a5c0e8322d9645468befabddfe0cb51d.exe 1.准备 获取 ...

  5. canvas画随机的四位验证码

    效果图如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  6. 微信公众号获取微信token

    微信在公众号和小程序的开发都有开放文档一般看文档开发就行,很简单这里写一个小demo获取微信token,之后根据自己的业务获取信息处理即可 package com.demo.ccx; import o ...

  7. ASE Alpha Sprint - backend scrum 3

    本次scrum于2019.11.7再sky garden进行,持续10分钟. 参与人: Zhikai Chen, Jia Ning, Hao Wang 请假: Xin Kang, Lihao Ran, ...

  8. Linux性能优化从入门到实战:14 文件系统篇:Linux 文件系统基础

      磁盘为系统提供了最基本的持久化存储.   文件系统则在磁盘的基础上,提供了一个用来管理文件的树状结构. 文件系统:索引节点和目录项   文件系统是对存储设备上的文件,进行组织管理的机制.组织方式不 ...

  9. linux里面以指定用户运行命令

    一.chroot方式 [root@localhost ~]# chroot --userspec "nginx:nginx" "/" sh -c "w ...

  10. ARM平台常用性能测试方法

    测试磁盘读写速度: 通过安装hdparm,可以测试EMMC的读写速度: dolphin@localhost:~$ sudo apt-get install hdparm dolphin@localho ...