renxiuxing

MySQL的连接查询

  • 建表

    1.一对一关系

    2.一对多、多对一关系

    3.多对多关系(需要建立一张关联表,进行二者的关联)

    4.例:订单管理,用户下订单,一个用户可以下一个或多个订单,一个订单可能包含一个或多个商品。

  • 例:以下 sql 语句都依据此数据库

      /*
      Navicat MySQL Data Transfer
    
      Source Server         : localhost_3306
      Source Server Version : 50528
      Source Host           : localhost:3306
      Source Database       : moretable
    
      Target Server Type    : MYSQL
      Target Server Version : 50528
      File Encoding         : 65001
    
      Date: 2018-12-09 10:54:25
      */
    
      SET FOREIGN_KEY_CHECKS=0;
    
      -- ----------------------------
      -- Table structure for cla
      -- ----------------------------
      DROP TABLE IF EXISTS `cla`;
      CREATE TABLE `cla` (
        `classid` int(11) NOT NULL,
        `classname` varchar(255) DEFAULT NULL,
        `classtime` int(11) DEFAULT NULL,
        PRIMARY KEY (`classid`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
      -- ----------------------------
      -- Records of cla
      -- ----------------------------
      INSERT INTO `cla` VALUES (\'1\', \'数学\', \'10\');
      INSERT INTO `cla` VALUES (\'2\', \'语文\', \'18\');
      INSERT INTO `cla` VALUES (\'3\', \'音乐\', \'12\');
      INSERT INTO `cla` VALUES (\'4\', \'美术\', \'18\');
      INSERT INTO `cla` VALUES (\'5\', \'体育\', \'15\');
      INSERT INTO `cla` VALUES (\'6\', \'计算机\', \'32\');
      INSERT INTO `cla` VALUES (\'7\', \'英语\', \'36\');
      INSERT INTO `cla` VALUES (\'8\', \'Java\', \'20\');
      INSERT INTO `cla` VALUES (\'9\', \'数据库\', \'40\');
      INSERT INTO `cla` VALUES (\'10\', \'建筑\', \'20\');
    
      -- ----------------------------
      -- Table structure for stu
      -- ----------------------------
      DROP TABLE IF EXISTS `stu`;
      CREATE TABLE `stu` (
       `stuid` int(11) NOT NULL,
       `stuname` varchar(255) DEFAULT NULL,
       `stuage` varchar(255) DEFAULT NULL,
       `stusex` varchar(255) DEFAULT NULL,
       PRIMARY KEY (`stuid`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
      -- ----------------------------
      -- Records of stu
      -- ----------------------------
      INSERT INTO `stu` VALUES (\'1\', \'小明\', \'20\', \'男\');
      INSERT INTO `stu` VALUES (\'2\', \'小华\', \'21\', \'男\');
      INSERT INTO `stu` VALUES (\'3\', \'小红\', \'19\', \'男\');
      INSERT INTO `stu` VALUES (\'4\', \'小美\', \'19\', \'女\');
      INSERT INTO `stu` VALUES (\'5\', \'小爱\', \'20\', \'女\');
      INSERT INTO `stu` VALUES (\'6\', \'小风\', \'19\', \'男\');
      INSERT INTO `stu` VALUES (\'7\', \'小太\', \'22\', \'女\');
      INSERT INTO `stu` VALUES (\'8\', \'小齐\', \'25\', \'男\');
      INSERT INTO `stu` VALUES (\'9\', \'小镇\', \'24\', \'女\');
      INSERT INTO `stu` VALUES (\'10\', \'小星\', \'23\', \'女\');
      INSERT INTO `stu` VALUES (\'11\', \'小刚\', \'25\', \'男\');
      INSERT INTO `stu` VALUES (\'12\', \'小哈\', \'22\', \'女\');
      INSERT INTO `stu` VALUES (\'13\', \'文华\', \'26\', \'男\');
      INSERT INTO `stu` VALUES (\'14\', \'小易\', \'22\', \'女\');
      INSERT INTO `stu` VALUES (\'15\', \'小改\', \'22\', \'女\');
      INSERT INTO `stu` VALUES (\'16\', \'小星\', \'23\', \'男\');
      INSERT INTO `stu` VALUES (\'17\', \'小文\', \'15\', \'未知\');
      INSERT INTO `stu` VALUES (\'18\', \'小文\', \'20\', \'女\');
    
      -- ----------------------------
      -- Table structure for stu_cla
      -- ----------------------------
      DROP TABLE IF EXISTS `stu_cla`;
      CREATE TABLE `stu_cla` (
        `id` int(11) NOT NULL,
        `stuid` int(11) DEFAULT NULL,
       `claid` int(11) DEFAULT NULL,
       PRIMARY KEY (`id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
      -- ----------------------------
      -- Records of stu_cla
      -- ----------------------------
      INSERT INTO `stu_cla` VALUES (\'1\', \'1\', \'1\');
      INSERT INTO `stu_cla` VALUES (\'2\', \'2\', \'4\');
      INSERT INTO `stu_cla` VALUES (\'3\', \'3\', \'3\');
      INSERT INTO `stu_cla` VALUES (\'4\', \'4\', \'4\');
      INSERT INTO `stu_cla` VALUES (\'5\', \'5\', \'2\');
      INSERT INTO `stu_cla` VALUES (\'6\', \'6\', \'6\');
      INSERT INTO `stu_cla` VALUES (\'7\', \'7\', \'9\');
      INSERT INTO `stu_cla` VALUES (\'8\', \'8\', \'6\');
      INSERT INTO `stu_cla` VALUES (\'9\', \'10\', \'8\');
      INSERT INTO `stu_cla` VALUES (\'10\', \'16\', \'9\');
    
  • sql 中什么时候用内连接查询,什么时候用外连接查询?

    需要查找两张表同时存在的数据,使用 内连接 ;需要查找两张表中一张表存在,另一张表不存在的时候使用左外链接右外链接


    例:内连接的查询结果都是满足连接条件的元组。
    但有时我们也希望输出那些不满足连接条件的元组信息。
    比如,我们想知道每个学生的选课情况,包括已经选课的学生(这部分学生的学号在学生表中有,在选课表中也有,是满足连接条件的),也包括没有选课的学生(这部分学生的学号在学生表中有,但在选课表中没有,不满足连接条件),这时就需要使用外连接。外连接是只限制一张表中的数据必须满足连接条件,而另一张表中的数据可以不满足连接条件的连接方式。

  • 内连接

      #查询已经选过课的学生的选课情况
      SELECT
      s.stuid,s.stuname,s.stuage,sc.claid
      FROM
      stu_cla AS sc 
      INNER JOIN
      stu AS s
      ON
      sc.stuid = s.stuid
    
    
      #查询已经选过课的学生以及所选择课程的信息
      SELECT
      s.stuid,s.stuname,s.stuage,c.classname,c.classtime
      FROM
      stu_cla AS sc 
      INNER JOIN
      stu AS s
      ON
      sc.stuid = s.stuid
      INNER JOIN
      cla AS c
      ON
      sc.claid = c.classid
    
  • 左连接

      #查询所有学生的选课情况
      select 
      s.stuid,s.stuname,s.stuage,s.stusex,sc.claid
      FROM
      stu as s
      LEFT JOIN
      stu_cla AS sc
      ON
      sc.stuid = s.stuid
    
      
      #查询所有学生选课情况及课程信息
      select 
      s.stuid,s.stuname,s.stuage,s.stusex,c.classname,c.classtime
      FROM
      stu as s
      LEFT JOIN
      stu_cla AS sc
      ON
      sc.stuid = s.stuid
      LEFT JOIN
      cla AS c
      ON
      sc.claid = c.classid
      
    
      
      #查询 stuid=1 的学生选课情况
      select 
      s.stuid,s.stuname,s.stuage,s.stusex,c.classname,c.classtime
      FROM
      stu as s
      LEFT JOIN
      stu_cla AS sc
      ON
      sc.stuid = s.stuid
      LEFT JOIN
      cla AS c
      ON
      sc.claid = c.classid
      WHERE
      s.stuid = 1
    
  • 模糊查询

      SELECT * FROM stu WHERE stuname LIKE \'%三%\' 
    
  • concat 函数(连接字符串)

      select concat (stuid, stuname, stuage) as info from stu;
    
      #在mybatis中的应用,用来拼接模糊查询字符串
      select * from stu where stuname like concat(\'%\',#{stuname},\'%\')
    
  • 分组查询

      #按性别分组查年龄最大值
      select stuname,max(stuage),stusex from stu group by stusex;  
    
  • 去重查询
    1.distinct必须放在最开头

    2.distinct只能使用需要去重的字段进行操作。也就是说我sidtinct了name,age两个字段,我后面想根据id进行排序,是不可以的,因为只能name,age两个字段进行操作.

    3.distinct去重多个字段时,含义是:几个字段 同时重复 时才会被 过滤。

      #查询名字不相同的学生;
      select distinct stuname from stu;
      #查询名字和年龄同时不同的学生
      select distinct stuname,stusex from stu;
    
  • count 函数

    Count(1)和Count( * )实际上的意思是,评估Count()中的表达式是否为NULL,如果为NULL则不计数,而非NULL则会计数。比如我们看代码1所示,在Count中指定NULL(优化器不允许显式指定NULL,因此需要赋值给变量才能指定)。
    因此当你指定Count( * ) 或者Count(1)或者无论 Count(‘anything’) 时结果都会一样,因为这些值都不为NULL。

      select count(1) from stu;
      select count(*) from stu;
      select count(\'hgjkyh\') from stu;
      #起别名 (as)
      select count(\'hgjkyh\') as 总数 from stu;
    
    
      #分组计数
      select stusex as 性别,count(1)as 总数  from stu GROUP BY stusex;

分类:

技术点:

相关文章: