zoukankan      html  css  js  c++  java
  • MySQL外键和高级查询(连接查询、联合查询、子查询、去重查询)

    https://www.cnblogs.com/KevinGeorge/p/9150268.html

    什么是外键,很简单保持数据一致性的一个约束键。如果你有两张表,第一张是学生表,第二张表是一个成绩表,我们来看看保持数据一致性,其实在Django等框架的模型中中也能做关联获取对象。
    第一张表 成绩表
    
    
    第二张表 学生表
    
    
    保持数据一致性
    我们来看看,当键不一致的时候,数据是插不进去的哦,保证了数据一致性。
    
    mysql> insert into student(sid,name) values("A0004","Tom");
    ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`school`.`student`, CONSTRAINT `student_ibfk_1` FOREIGN KEY (`sid`) REFERENCES `score` (`sid`))
    mysql> insert into student(sid,name) values("A0001","Tom");
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into student(sid,name) values("A0002","Bill");
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into student(sid,name) values("A0003","Jill");
    Query OK, 1 row affected (0.00 sec)
    
    
    高级查询
    还是用上面两张表做例子
    连接查询
    内连接
    没有on条件的时候就是笛卡尔积,有条件的时候按照条件执行,条件关键字on,使用where也可以,但是效率会低很多;
    
    select * from student join score on student.sid=score.sid;
    
    
    外链接
    与内连接相似,但是条件不匹配的项会保留,不匹配字段填写NULL,左和右指得的是以谁为主表
    我们做个测试,为了体现不匹配的样子,先向score插入一条数据
    
    insert into score(sid,value) values("A0004",90);
    内连接的状态的
    
    
    左连接
    左表为主
    
    select * from score left join student on student.sid=score.sid;
    
    
    右连接
    右表为主
    
    select * from student right join score on student.sid=score.sid;
    
    
    交叉连接
    循环去每一条数据进行匹配,结果是笛卡尔积
    
    select * from student cross join score;
    #或者
    select * from student,score;
    
    
    自然连接
    略
    
    联合查询
    将多次查询(多条select语句), 在记录上进行拼接(字段不会增加),就是这么简单,但是注意,字段数量要一致,字段数量要一致,字段数量要一致,重要的事情说三遍。一般用于相同结构的多表查询。
    
    select id,name from student union select * from score;
    
    
    子查询
    一般的from where exists后面都是子查询
    重点是from 后面可以接select语句、where后面也可以跟select语句,举几个例子
    
    select * from (select sid from score) as a;
    select * from score where sid in (select sid from student);
    
    
    
    exists可以理解为一个函数,里面是一个条件,如果存在就是返回1,否则是0,exists放在where后面
    
    
    去重查询
    SELECT DISTINCT column1,column2,... FROM table-name;
    

      

  • 相关阅读:
    Oracle学习(四)--sql及sql分类讲解
    Oracle学习(三)--数据类型及常用sql语句
    Oracle学习(二)--启动与关闭
    Tomcat学习笔记--启动成功访问报404错误
    有关Transaction not successfully started问题解决办法
    百度富文本编辑器UEditor1.3上传图片附件等
    hibernate+junit测试实体类生成数据库表
    js登录与注册验证
    SVN安装配置与使用
    [LeetCode] #38 Combination Sum
  • 原文地址:https://www.cnblogs.com/cblx/p/15693486.html
Copyright © 2011-2022 走看看