zoukankan      html  css  js  c++  java
  • MySQL的连接查询

    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;
  • 相关阅读:
    vue实现图片预览旋转/放大缩小/上下切换等功能
    VMware安装遇到的问题
    webstrom弹出Server's certificate is not trusted 解决方法
    this.setData is not a function;at pages/index/index onLoad function;at api request success callback function TypeError: this.setData is not a function
    小程序结构目录
    第一个微信小程序
    用C#开发ActiveX控件给VB使用
    处理WIN7,winxp下安装vb6,出现config.nt 无法运行16位DOS程序故障的方法
    VISUALSVN: UNABLE TO CONNECT TO A REPOSITORY AT URL 无法连接主机的解决办法
    程序全屏开机运行,不允许操作电脑桌面,适用工控机触摸屏
  • 原文地址:https://www.cnblogs.com/renxiuxing/p/10090418.html
Copyright © 2011-2022 走看看