精华内容
下载资源
问答
  • mysql高级查询语句

    2020-06-02 15:48:57
    mysql高级查询 1.分组查询 分组查询是指使用group by字句对查询信息进行分组。 格式: SELECT 字段1,字段2… FROM 表名 GROUP BY分组字段 HAVING 分组条件; 分组操作中的having子语句,是用于在分组后对数据进行...

    mysql高级查询

    1.分组查询
    分组查询是指使用group by字句对查询信息进行分组。
    格式:

    SELECT 字段1,字段2FROM 表名 GROUP BY分组字段 HAVING 分组条件;
    

    分组操作中的having子语句,是用于在分组后对数据进行过滤的,作用类似于where条件。
    having与where的区别:
    having是在分组后对数据进行过滤.
    where是在分组前对数据进行过滤
    having后面可以使用聚合函数(统计函数)
    where后面不可以使聚合函数。
    在这里插入图片描述
    2.多表操作
    实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系,接下来我们将在单表的基础上,一起学习多表方面的知识。

    3.外键约束
    键特点:
    从表外键的值是对主表主键的引用。
    从表外键类型,必须与主表主键类型一致。

    声明外键约束

    语法:
    alter table 从表 add [constraint 外键名称] foreign key 从表名(从表外键字段名) references 主表
    名(主表的主键);
    [外键名称]用于删除外键约束的,一般建议“_fk”结尾
    alter table 从表 drop foreign key 外键名称
    

    使用外键目的:
    保证数据完整性

    4.一对多和多对多关系
    在这里插入图片描述
    在这里插入图片描述
    5.多表查询
    交叉连接查询(基本不会使用-得到的是两个表的乘积) [了解]
    语法: select * from A,B;
    在这里插入图片描述
    内连接查询(使用的关键字 inner join – inner可以省略)
    隐式内连接: select * from A,B where 条件;
    显示内连接: select * from A inner join B on 条件;

    外连接查询(使用的关键字 outer join – outer可以省略)
    左外连接:left outer join
    select * from A left outer join B on 条件;
    右外连接:right outer join
    select * from A right outer join B on 条件;

    注意:左外连接,左表中的记录都会显示,不管有没有对应的右表内容。

    隐式内连接:会保证左右两边的记录对象的id相同才会显示。

    6.子查询
    一条select语句结果作为另一条select语法一部分(查询条件,查询结果,表等)。 语法: select …查询字段 … from … 表… where … 查询条件

    #3 子查询, 查询“化妆品”分类上架商品详情
    #隐式内连接
    SELECT p.*
    FROM products p , category c
    WHERE p.cid=c.cid AND c.cname = '化妆品';
    #子查询
    ##作为查询条件
    SELECT *
    FROM products p
    WHERE p.cid =
    (
    SELECT c.cid FROM category c
    WHERE c.cname='化妆品'
    );
    ##作为另一张表
    SELECT *
    FROM products p ,
    (SELECT * FROM category WHERE cname='化妆品') c
    WHERE p.cid = c.cid;
    
    展开全文
  • MySQL高级查询语句

    2020-12-28 09:27:24
    MySQL提供了实现各种功能的函数 常用的函数分类: 数学函数、聚合函数、字符串函数、日期时间函数 5.1数学函数 abs(x) :返回x的绝对值 rand() :返回0到1的随机数 mod(x,y) : 返回x除以y以后的余数 power(x,y) :...

    1.按关键字排序

    • 使用ORDER BY语句来实现排序
    • 排序可针对一个或多个字段
    • ASC:升序,默认排序方式
    • DESC:降序

    ORDER BY的语法结构

    select column1,column2,... from table_name order by column1,column2,... asc|desc;
    #示例
    select id,name from test where id<100 order by id asc	#升序
    select id,name,score from test where score>90 order by score,id desc	#降序,若score值一样时,参考id来排序
    

    2.对结果进行分组

    • 使用GROUP BY语句来实现分组
    • 通常结合聚会函数一起使用
    • 可以按一个或多个字段对结果进行分组

    GROUP BY的语法结构

    select column_name,aggregate_function(column_name) from table_name where column_name operator value GROUP BY column_name;
    #示例
    select count(name),score from test where id<100 group by score;
    

    3.限制结果条目

    • 只返回SELECT查询结果的第一行或前几行
    • 使用LIMIT语句限制条目
    • LIMIT语法结构
    select column1,column2,... from table_name LIMIT [offset,]number;
    #[offset,]:位置偏移量,从0开始。number:返回记录行的最大数目
    #示例
    select * from test limit 3;		#查看test表前三条记录
    select * from test limit 2,3;	#查看test表从第三条开始的三条记录
    

    4.设置别名

    • 使用AS语句设置别名,关键字AS可省略
    • 设置别名时,保证不能与库中其他表或字段名称冲突

    别名的语法结构

    select column_name AS alias_name from table_name;	#设置列的别名
    select column_name(s) from table_name AS alias_name;	#设置表的别名
    #原字段或表名再库内并不会被改变
    #示例
    select name as n from test;		#name别名为n
    select count(*) as num from test;	#字段的别名,num即为test表的行数计算
    select t.id,t.name,t.score from test as t	#test表别名为t
    

    特殊用法,AS作为连接语句

    ##复制表内容
    create table aa as select * from test;		#将test表的内容复制到新建的aa表内
    

    5.通配符

    • 用于替换字符串中的部分字符
    • 通常配合LIKE一起使用,并协同WHERE完成查询
    • 常用通配符
      %表示零个,一个或多个
      _表示单个字符
    ##使用两个通配符分别查询tom和dom的信息
    通配符%
    select id,name,score from test where name like '%m';
    通配符_
    select id,name,score from test where name like '_om';
    结合使用
    select id,name,score from test where name like '_o%';
    

    6.子查询

    • 也称作内查询或者嵌套查询
    • 先于主查询被执行,其结果将作为外层主查询的条件
    • 在增删改查中都可以使用子查询
    • 支持多层嵌套
    • IN语句是用来判断某个值是否在给定的结果集中
    #示例
    select id,name,score from test where name in(select name form test where score>60);
    
    delete from test where id in(select id from test where score<60);
    
    insert into aa select * from test where id in(select id from test);
    

    7.NULL值

    • 表示缺失的值
    • 与数字0或者空白(spaces)是不同的
    • 使用IS NULL或IS NOT NULL进行判断
    • NULL值和空值的区别
      空值长度为0,不占空间;NULL值的长度为NULL,占用空间
      IS NULL无法判断空值
      空值使用"=“或者”<>"来处理
      COUNT() 计算时,NULL会忽略,空值会加入计算
    #示例
    #查询缺考人数
    select * from test where score is null;
    #查询考试人数
    select * from test where score is not null;
    

    8.正则表达式

    • 根据指定的匹配模式匹配记录中符合要求的特殊字符
    • 使用REGEXP关键字指定匹配模式
    • 常用匹配模式
      ^匹配开始字符
      $匹配结束字符
      . 匹配任意单个字符
      *匹配任意个前面的字符
      +匹配前面字符至少1次
      p1|p2匹配p1或p2
      […] 匹配字符集中的任意一个字符
      [^…]匹配不在中括号内的任何字符
      {n}匹配前面的字符串n次
      {n,m}匹配前面的字符串至少n次,至多m次

    9.运算符

    用于对记录中的字段值进行运算
    分类:算数运算符、逻辑运算符、比较运算符、位运算符

    9.1算数运算符

    MySQL支持的算术运算符
    +:加法、-:减法、*:乘法、/:除法、%:取余数

    select 1+1,2-1,2*3,6/2,3%2;
    +-----+-----+-----+--------+------+
    | 1+1 | 2-1 | 2*3 | 6/2    | 3%2  |
    +-----+-----+-----+--------+------+
    |   2 |   1 |   6 |    3   |    1 |
    +-----+-----+-----+--------+------+
    1 row in set (0.00 sec)
    

    9.2逻辑运算符

    逻辑运算符又称布尔运算符,通常用来判断表达式的真假,如果为真返回1,否则返回0,真假也可以用TRUE和FALSE表示,MySQL中支持的逻辑运算符有四种
    NOT或!:逻辑非
    AND或&&:逻辑与
    OR或||:逻辑或
    XOR:逻辑异或

    select name,score from test where score=!0	#查看成绩不为0的
    select id,name,score from test where score>90 && id<10	#查看成绩大于90且学号前十个人
    

    9.3比较运算符

    字符串的比较默认不区分大小写
    常用比较运算符
    = 等于
    > 大于
    < 小于
    >= 大于等于
    <= 小于等于
    !=或<> 不等于
    IN 在集合中
    LIKE 通配符匹配
    IS NULL 判断一个值是否为NULL
    IS NOT NULL 判断一个值是否不为NULL
    BETWEEN AND 两者之间
    GREATEST 两个或多个参数时返回最大值
    LEAST 两个或多个参数时返回最小值

    9.4位运算符

    位运算符实际上是对二进制数进行计算的运算符,MySQL内位运算符会先将操作数变成二进制格式,然后进行位运算,最后在将计算结果从二进制变回到十进制格式,方便用户查看
    MySQL支持6种位运算符
    & 按位与
    | 按位或
    ~ 按位取反
    ^ 按位异或
    << 按位左移
    >> 按位右移

    10.表连接

    10.1内连接

    • 两张或多张表中同时符合某种条件的数据记录组合
    • FROM子句中使用INNER JOIN关键字连接多张表,并使用ON设置连接条件
    • 是系统默认的表连接方式,可以省略INNER关键字
    • 多表支持连续使用INNER JOIN,建议不超过三个表

    语法结构

    select column_name(s) from table1 inner join table2 on table1.column_name=table2.column_name;
    
    #示例
    select id,name,score from test inner join aa on test.id=aa.id;
    

    10.2外连接

    外连接分为左连接和右连接

    10.2.1左连接

    • 也被称为左外连接
    • 在FROM子句中使用LEFT JOIN关键字来表示
    • 匹配左表中所有行及右表中符合条件的行
    select * from test left join aa on test.score=aa.score;
    

    10.2.2右连接

    • 也被称为右外连接
    • 在FROM子句中使用RIGHT JOIN关键字来表示
    • 匹配右表中所有行及左表中符合条件的行
    select * from test right join aa on test.id=aa.id;
    

    10.3视图(虚拟表)

    create view add as select test.name,aa.addr from test inner join aa where test.name=aa.name;
    select * from add;		#此时会有一个名为add的虚拟表,不占用数据库空间,类似链接了命令的快捷方式
    

    11.函数

    MySQL提供了实现各种功能的函数
    常用的函数分类:
    数学函数、聚合函数、字符串函数、日期时间函数

    11.1数学函数

    abs(x) :返回x的绝对值
    rand() :返回0到1的随机数
    mod(x,y) : 返回x除以y以后的余数
    power(x,y) :返回x的y次方
    round(x) :返回离x最近的整数
    sqrt(x) :返回x的平方根
    truncate(x,y) :返回数字x截断为y位小数的值
    ceil(x) :返回大于或等于x的最小整数
    floor(x) :返回小于或等于x的最大整数
    greatest(x1,x2…) :返回集合中最大的值
    least(x1,x2…) : 返回集合中最小的值

    11.2聚合函数

    avg() :返回指定列的平均值
    count() :返回指定列中非NULL值的个数
    min() :返回指定列的最小值
    max() :返回指定列的最大值
    sum() :返回指定列的所有值之和

    11.3字符串函数

    length(x) :返回字符串x的长度
    trim() :返回去除指定格式的值
    concat(x,y) :将提供的参数x和y拼接成一个字符串
    upper(x) :将字符串x的所有字母变成大写字母
    lower(x) :将字符串x的所有字母变成小写字母
    left(x,y) :返回字符串x的前y个字符
    right(x,y) :返回字符串x的后y个字符
    repeat(x,y) :将字符串x重复y次
    space(x) :返回x个空格
    replace(x,y,z) :将字符串z替代字符串x中的字符串y
    strcmp(x,y) :比较x和y,返回的值可以为-1,0,1
    substring(x,y,z) :获取从字符串x中的第y个位置开始长度位z的字符串
    reverse(x) :将字符串x反转

    11.4日期时间函数

    curdate() :返回当前时间的年月日
    curtime() :返回当前时间的时分秒
    now() :返回当前时间的日期和时间
    month(x) :返回日期x中的月份值
    week(x) :返回日期x是年度第几个星期
    hour(x) :返回x中的小时值
    minute(x) :返回x中的分钟值
    second(x) :返回x中的秒钟值
    dayofweek(x) :返回x是星期几,1是星期日,2是星期一
    dayofmonth(x) :计算日期x是本月的第几天
    dayofyear(x) :计算日期x是本年的第几天

    展开全文
  • Mysql高级查询语句

    2019-10-28 01:05:02
    Exists子查询 Exists的特点 1.在执行create或drop语句前,可以使用exists语句来判断数据库对象是否存在,返回值是true或false drop table if exists student; 意思是如果存在表student则删除!否则不删除! ...

    Exists子查询

    Exists的特点

    
    1.在执行create或drop语句前,可以使用exists语句来判断数据库对象是否存在,返回值是true或false
    
    

    drop table if exists student; 意思是如果存在表student则删除!否则不删除!

    Create table if not exists student; 意思是如果不存在表student则创建,否则不创建!

    
     2.exists还可以作为where条件的子查询
    
         Select  ..... from  表名  where  exists (子查询);
    
    意思是:
    如果子查询有结果,则返回值为true,继续执行外层的查询语句;
    
    如果子查询没有结果,则返回值是false,外层的查询语句不会执行。
    
    

    -- 检查“高等数学-1” 课程最近一次考试成绩

    -- 如果有 80分以上的成绩,显示分数排在前5名的学员学号和分数

    -- 不使用exists

    -- 01.查询“高等数学-1” 课程 对应的编号

    
    SELECT subjectNo FROM `subject` WHERE SubjectName='高等数学-1'
    
    

    -- 02.查询最近的考试成绩

    
    SELECT MAX(ExamDate)
    FROM result 
    WHERE SubjectNo=(SELECT subjectNo
                      FROM   subject
                      WHERE SubjectName='高等数学-1')
    
    

    -- 03. 在02的基础上 加条件 成绩大于80

    
    SELECT * FROM result
    WHERE ExamDate=(SELECT MAX(ExamDate) 
                     FROM result
                     WHERE SubjectNo=(SELECT subjectNo FROM `subject`
                                       WHERE SubjectName='高等数学-1'))
    AND StudentResult>80
    
    

    -- 04.优化

    
    SELECT studentNo,StudentResult FROM result
    WHERE ExamDate=(SELECT MAX(ExamDate) 
                     FROM result
                    WHERE SubjectNo=(SELECT subjectNo FROM `subject`
                                      WHERE SubjectName='高等数学-1'))
    AND StudentResult>80
    ORDER BY StudentResult DESC
    LIMIT 0,5
    
    

    -- 使用exists

    -- 检查“高等数学-1” 课程最近一次考试成绩

    -- 如果有 80分以上的成绩,显示分数排在前5名的学员学号和分数

    -- 01.查询“高等数学-1” 课程 对应的编号

    
    SELECT subjectNo FROM `subject` WHERE SubjectName='高等数学-1'
    
    

    -- 02.查询最近的考试成绩

    
    SELECT MAX(ExamDate) 
    FROM result
    WHERE SubjectNo=(SELECT subjectNo FROM `subject`
                      WHERE SubjectName='高等数学-1')
    
    

    -- 03.查询学号和成绩

    
    SELECT StudentNo,StudentResult FROM result
    WHERE  EXISTS(SELECT * FROM result
                   WHERE subjectNo=(SELECT subjectNo FROM `subject`
                                     WHERE SubjectName='高等数学-1')
                    AND ExamDate=(SELECT MAX(ExamDate) FROM result
                                   WHERE SubjectNo=(SELECT subjectNo FROM `subject`
                                                     WHERE SubjectName='高等数学-1'))
                    AND StudentResult>80)
    
    AND subjectNo=(SELECT subjectNo FROM `subject`
                    WHERE SubjectName='高等数学-1')
    
    AND ExamDate=(SELECT MAX(ExamDate) FROM result
                   WHERE SubjectNo=(SELECT subjectNo FROM `subject`
                                     WHERE SubjectName='高等数学-1'))
    
    ORDER BY StudentResult DESC
    LIMIT 0,5
    
    

    Not Exists子查询

    -- 检查“高等数学-1”课程最近一次考试成绩

    -- 如果全部未通过考试(60分及格),认为本次考试偏难,计算的该次考试平均分加5分

    -- 01.查询“高等数学-1” 课程 对应的编号

    
    SELECT subjectNo FROM `subject` WHERE SubjectName='高等数学-1'
    
    

    -- 02.查询最近的考试成绩

    
    SELECT MAX(ExamDate) 
    FROM result 
    WHERE SubjectNo=(SELECT subjectNo 
                      FROM `subject`
                      WHERE SubjectName='高等数学-1')
    
    

    -- 03.查询成绩大于60的 反着来

    
    SELECT StudentResult 
    FROM result 
    WHERE StudentResult>60
    AND SubjectNo=(SELECT subjectNo 
                     FROM `subject`
                     WHERE SubjectName='高等数学-1')
    
    AND ExamDate=(SELECT MAX(ExamDate) 
                    FROM result
                   WHERE SubjectNo=(SELECT subjectNo 
                                      FROM `subject`
                                     WHERE SubjectName='高等数学-1'))
    
    

    -- 04. 如果全部未通过考试,考试平均分加5分

    SELECT AVG(StudentResult)+5  
    FROM result
    WHERE NOT EXISTS(SELECT StudentResult 
                       FROM result
                      WHERE StudentResult>60
                        AND SubjectNo=(SELECT subjectNo 
                                         FROM `subject`
                                        WHERE SubjectName='高等数学-1')
    
                        AND ExamDate=(SELECT MAX(ExamDate) 
                                        FROM result
                                       WHERE SubjectNo=(SELECT subjectNo
                                                          FROM `subject`
                                                         WHERE SubjectName='高等数学-1')))
    
    AND SubjectNo=(SELECT subjectNo 
                     FROM `subject`
                    WHERE SubjectName='高等数学-1')
    
    AND ExamDate=(SELECT MAX(ExamDate) 
                    FROM result
                   WHERE SubjectNo=(SELECT subjectNo 
                                      FROM `subject`
                                     WHERE SubjectName='高等数学-1'))
    
    

    -- 如果有 年级名称是大二 的学生,就 查询出 年级名称是大一的 所有学生信息

    -- 01.先查询出 对应的年级编号

    
    SELECT GradeId FROM grade  WHERE GradeName='大一'
    
    SELECT GradeId FROM grade  WHERE GradeName='大二'
    
    

    -- 02.在学生表中是否存在 年级名称是大二 的学生

    
    SELECT * 
    FROM  student  
    WHERE gradeID=(SELECT GradeId 
                      FROM grade  
                     WHERE GradeName='大二')
    
    

    -- 03.如果有查询出 年级名称是大一的 所有学生信息

    
    SELECT * 
    FROM student
    WHERE  EXISTS(SELECT *
                    FROM  student  
                   WHERE  gradeID=(SELECT GradeId 
                                     FROM grade  
                                    WHERE GradeName='大二'))
    
    AND GradeId=(SELECT GradeId 
                   FROM grade  
                  WHERE GradeName='大一')
    
    

    Exists与IN , Not Exists与Not IN 的区别

    image

    1. IN和Not IN 做的是一个区间的判断,查询数据是否在区间内

        Exists 和 Not Exists 都是根据查询语句返回 true 或者 false !
    

    2. 例子:

    
    select  a.* 
    from  A  a
    where  a.id  
    in(select id from B)
    
    

    如果:
    A表中有1000条数据
    B表中有1000条数据

    分析步骤:

      01\. select id from B 会查询出B表中的所有id,然后缓存起来,共1000条(因为使用in 会先执行子查询)
    
      02.然后分别拿A表中的每一个id和B表中的1000个id进行比较,也就是比较了 1000*1000次
    
      03.这样效率是非常慢的
    
      04.如果B表中只有100或者10条数据(只是举例说明数据量小),那么就会比较1000*10
    
         这样相对来说效率会高点!
    

    结论:

    子查询中涉及的表(B)数据量小于 主查询中涉及的表(A)数据量 时,使用In来查询!可以提高效率

    In 查询做的是 外表和内表的hash连接

    hash连接就是 以 外层查询的表作为hash table ,内层查询的表在hash table中查询数据!

    很显然,如果内层查询的数量大 ,查询效率就慢,查询数据量小,效率就高!

    1. 例子:
    select  a.*
    from  A  a
    where exists (select id 
                    from B b
                   where a.id=b.id)
    

    如果:
    A表中有1000条数据
    B表中有1000条数据

    分析步骤:

      1. 使用了exists(会以外层查询为驱动)上面的sql语句只会执行1000次(因为A表中有多少条数据,就会执行几次)
    
      2. exists查询不需要数据的结果集,只需要返回true或者false
    

    结论:

    子查询中涉及的表(B)数据量大于 主查询中涉及的表(A)数据量时,使用exists来查询!可以提高效率

    Exists查询做的是loop循环

    1. 如果子查询中涉及的表(B)数据量 和 主查询中涉及的表(A)数据量 差不多时,建议使用IN来查询!

      因为In查询是在内存中的查询,exists需要查询数据库,所以内存中的查询肯定比查询数据库性能高!

    05.not exists 在任何时候都比not in 效率高!

    因为not in 那么内外表都进行[全表扫描],没有用到索引!而not  exists的子查询仍然可以用到索引!
    

    any,

    some,all的使用

    
    SELECT * 
    FROM student
    WHERE studentname
    IN(SELECT studentName FROM student)
    
    

    -- 使用any(只要是在区间就行) 替换in

    
    SELECT * 
    FROM student
    WHERE studentname=ANY(SELECT studentName FROM student)
    
    

    -- all 满足子查询中编号最大的

    
    SELECT * 
    FROM student 
    WHERE studentNo>ALL(SELECT studentNo 
                          FROM student  
                         WHERE studentNo IN(1014,1001,1002))
    
    

    -- any 满足子查询中编号最小的

    
    SELECT * 
    FROM student 
    WHERE studentNo>ANY(SELECT studentNo
                          FROM student 
                         WHERE studentNo IN(1014,1001,1002))
    
    

    -- 和 any 效果一致

    
    SELECT * FROM student WHERE studentNo>SOME
    
    

    分组查询

    -- 分组 group by

    -- 01. 查询 每门课程的名称 以及平均分

    -- 并且按照平均分降序排列

    
    SELECT  subjectName,AVG(StudentResult)
    FROM  `result` r,`subject` s
    WHERE r.`SubjectNo`=s.`SubjectNo`
    GROUP BY subjectName
    ORDER BY AVG(StudentResult) DESC
    
    

    -- 02.在上述案例中增加 条件 having

    -- 平均分>73的 显示

    
    SELECT  subjectName,AVG(StudentResult)
    FROM  `result` r,`subject` s
    WHERE  r.`SubjectNo`=s.`SubjectNo`
    GROUP BY subjectName
    HAVING AVG(StudentResult)>73
    ORDER BY AVG(StudentResult) DESC
    
    

    -- 03.统计每个年级的男女人数 多列进行分组

    SELECT   gradeid '年级编号',COUNT(sex) '性别人数',sex '性别'
    FROM student
    WHERE sex IS NOT NULL 
    AND gradeid IS NOT NULL
    GROUP BY gradeid,sex
    
    

    -- 04. 找出每个课程成绩的前三名

    SELECT *
    FROM result r1
    WHERE (SELECT COUNT(1) 
             FROM result r2
            WHERE r1.subjectNo=r2.`SubjectNo`
              AND r1.studentresult<r2.studentresult)<3
    ORDER BY subjectNo,studentResult DESC
    
    

    多表连接查询

    比如之前写的小例子,查询学生的成绩,我们获取的是学生编号和成绩!

    但是如果获取了学生姓名和成绩岂不是更好? 但是学生姓名和成绩不在一张表中!

    这时候就需要我们的连接查询!

      常用的连接查询方式:
    
    1. 内连接

    2. 外连接

    内连接

    内连接是典型的最常用的连接查询! 特点就是两个表中存在主外健关系时,通常使用!查询两张表中共同的数据!内连接的实现方式有两种:

    1. 在where条件中指定连接条件,比如 查询学生姓名以及对应的年级名称
    
    Select  studentName,gradeName
    From student,grade
    Where student.gradeId=grade.gradeId
    
    

    2.在form 子句中增加 inner join 表 on 关系,比如查询学生姓名,科目名称以及考试成绩

    SELECT  studentName,subjectName,studentresult
    FROM student s
    INNER JOIN result r ON s.studentNo=r.studentNo
    INNER JOIN  `subject` su ON  su.subjectNo=r.subjectNo
    
    

    注意点:

    001.inner可以省略

    002.inner join 用来连接两个表

    003.on用来设置条件

    004. s r su是用的别名

    外连接

    外连接查询是至少返回一个表中的所有记录,根据匹配条件有选择地返回另一张表的数据!外连接有主表和从表的概念!以主表为准匹配从表的数据,符合连接条件的数据直接返回到结果集中,不符合的数据将被赋予null之后再返回到结果集中!外连接查询又分为:

    1.左外连接 Left outer join

    以左表为主表,从表(右边的表)中如果没有匹配的数据返回null

    例子1: 查询学生的姓名,考试科目以及成绩!

    
    SELECT  studentName,subjectNo,studentResult
    FROM  student s
    LEFT JOIN  result r  ON r.`studentNo`=s.`studentNo`
    
    

    例子2:查询所有科目对应的学生成绩

    SELECT  subjectName,s.subjectNo,studentResult 
    FROM `subject`  s 
    LEFT JOIN result r  ON s.`SubjectNo`=r.`SubjectNo`
    
    

    2.右外连接 right outer join

    以右表为主表,从表(左边的表)中如果没有匹配的数据返回null
    例子:查询年级名称和学生名称 两个结果是否一致?

    SELECT gradeName,studentName 
    FROM grade
    RIGHT JOIN student ON grade.`GradeID`=student.`GradeId`
    
    SELECT gradeName,studentName FROM grade
    INNER JOIN student ON grade.`GradeID`=student.`GradeId`
    
    

    大千世界,求同存异;相遇是缘,相识是份,相知便是“猿粪”(缘分)

    展开全文
  • MySql高级查询语句

    2017-02-27 12:34:16
    高级查询: 一:多表连接 1.select Info.Code,Info.Name,Nation.Name from Info,Nation where Info.Nation = Nation.Code 查几张表就就输出几张表,查那个条件就输出那个条件 列的查询 select * from Info,Nation...
    高级查询:
    一:多表连接
    1.select Info.Code,Info.Name,Nation.Name from Info,Nation where Info.Nation = Nation.Code 查几张表就就输出几张表,查那个条件就输出那个条件 列的查询
    select * from Info,Nation 全部输出4x4
    2.join连接
    select * from Info join Nation on Info.Nation = Nation.Code 筛选输出数据
    二:多表联合
    select * from Info where Code='p001'union select * from Info where Nation='n001' union 联合 行的查询
    三:子查询(无关子查询)
    select * from Info where Nation = (select Code from Nation where Name='汉族') 两个查询 一个查询的结果当做另一个查询的条件 查一个 =
    select * from Info where Nation in (select Code from Nation where Name='汉族' or Name='苗族')
    in(在里面)not in (在不里面)任意一个都可以 作为两个查询结果的链接 查两个in
    四:子查询(相关子查询)
    select * from Car a where a.Oil <(select avg(Oil) from Car b where b.Brand = a.Brand)
    把外子查询定义一个a 里面的表定义成b 外层表看数据 里层求数据的平均值(每一个数据都走一遍)
    展开全文
  • Mysql高级查询语句练习

    千次阅读 2017-08-14 15:46:14
    Mysql高级查询语句练习 DROP TABLE IF EXISTS `tblcourse`; CREATE TABLE `tblcourse` ( `CourseId` varchar(3) NOT NULL COMMENT '课程编号', `CourseName` varchar(20) NOT NULL COMMENT '课程名称', `...
  • MySQL高级查询语句一、MySQL进阶查询1.1、按关键字排序——order by1.2、对结果进行分组——group by1.2.1、单个分组1.2.2、分组结合order by使用1.3、限制结果条目二、MySQL数据库函数三、MySQL存储过程 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,285
精华内容 914
关键字:

mysql高级查询语句

mysql 订阅