美文网首页
day04(select)

day04(select)

作者: 五月_w | 来源:发表于2019-06-19 15:36 被阅读0次

    1、select

    1.1、 作用

    获取mysql中的数据行 
    

    1.2、单独使用select

    1.2.1、select @@xxxx; 获取参数信息

    select @@datadir;
    select @@basedir;
    select @@server_id;
    select @@socket;
    select @@port;
    show variables like 'innodb%';
    

    1.2.2、select 函数();

    select now();
    select user();
    select database();
    select version();
    

    1.3、SQL92标准的使用语法

    1.3.1、select 语法执行顺序(单表)

    select开始----->from子句------>where子句----->group by子句------->select后执行条件------->having子句-------->order by------>limit
    

    1.3.2、from

    ---例子:查询city表中的所有数据
    use world;
    select * from city;   -----------适合表数据行较少,生产中使用较少。
    select * from world.city;    -----------推荐使用绝对路径
    
    ----例子:查询name和population的所有值
    select name,population from world.city;
    

    1.3.3、单表查询练习环境:world数据库下表介绍

    show tables from world;
    desc city;
    id:自增的无关列,数据行的需要
    name:城市名字
    countrycode:城市所在的国家代号,CHN,USA,JPN。。。。。
    district:中国是省的意思,美国是州的意思
    population:城市的人口数量
    
    
    熟悉业务:
    刚入职时,DBA的任务
    1.   通过公司架构图,搞清楚数据库的物理架构
    逻辑结构:
                 (1)生产库的信息(容易达到)
                 (2)库下表的信息(非常复杂)
                        1.开发和业务人员搞好关系
                        2.搞到ER图(PD)
                        3.啥都没有怎么办?
                              (1)找到建表语句,如果有注释,读懂注释。如果没有注释,只能根据列名翻译
                               (2)找到表中部分数据,分析数据特点,达到了解功能的目录
      
    

    1.3.4、where 过滤想要的数据出来

    例子:
    1、----where配合   等值查询
                查询城市表中国的城市信息
                select * from world.city where countrycode='CHN';
                查询城市表美国的城市信息
                select * from world.city where countrycode='USA';
    
    
    2、 ----where配合  不等值
                查询城市表中人口小于100的城市
                select * from world.city where population<100;
                查询城市表中人口大于10000000的城市
                select * from world.city where population>10000000;
    
    
    3、 ----where配合   模糊
                查询城市表中国家代号是C开头的城市
                select * from world.city where countrycode like 'C%';
               注意:like语句在mysql中不要出现%在前面的情况,效率很低,不走索引
    
    
    
    4、----where配合   逻辑连接符(and  or)
             查询城市表中人口在10000在20000之间的城市
             select * from world.city where population>10000 and population<20000;
             select * from world.city where population between 10000 and 20000;
             查询城市表中美国或者中国的城市信息
             select * from world.city where countrycode='CHN' or countrycode='USA';
             select * from world.city where countrycode in ('CHN','USA');
     
    
    5、union和union all的区别
    有重复的数据时,union会显示出来,union all 比Union性能高
    select * from world.city where countrycode='CHN';
    union ALL
    select * from world.city where countrycode='USA';
    

    1.3.5、group by 配合聚合函数应用

    聚合函数
    avg()
    
    count()
    --统计每个国家的城市数量
    select countrycode,count(name) from world.city group by countrycode;
    
    sum()   总和
    ---统计每个国家的总人口
    select countrycode,sum(population) from world.city group by countrycode;
    ---统计中国每个省的总人口数
    select district,sum(population) from world.city where countrycode='CHN' group by district;
    
    max()
    
    min()
    
    grop_concat()
    ---统计并显示每个国家的省的列表
    select countrycode,group_concat(district) from world.city group by countrycode;
    ---统计中国每个省的城市列表
    select district,group_concat(name) from world.city  where countrycode='CHN' group by district;
    
    

    1.3.6、having

    ---统计中国每个省总人口数大于10000000的省的信息
    select district,sum(population) 
    from world.city 
    where countrycode='CHN' 
    group by district
    having sum(population)>10000000;
    说明:having后的条件是不走索引的,可以进行优化手段处理。
    
    

    1.3.7、order by 排序

    ---统计中国每个省的总人口数,从大到小排序
    select district,sum(population) 
    from world.city 
    where countrycode='CHN' 
    group by district
    order by sum(population) desc;
    
    
    ---统计中国每个省的总人口数,从小到大排序
    select district,sum(population) 
    from world.city 
    where countrycode='CHN' 
    group by district
    order by sum(population) ;
    
    ---查询中国所有的城市,并以人口降序输出
    select * from world.city where countrycode='CHN' order by population desc;
    
    

    1.3.8、limit 显示几名行

    ---查询中国所有的城市,并以人口降序输出,只显示前10名
    select * 
    from world.city 
    where countrycode='CHN' 
    order by population desc
    limit 10;
    ---查询中国所有的城市,并以人口降序输出,只显示6-8名
    select * 
    from world.city 
    where countrycode='CHN' 
    order by population desc
    limit 10;
    
    
    说明:limit x,y 跳过x行,显示y行
              
    
    

    1.4、多表连接查询

    1.4.1、介绍测试4张表的关系

    image.png

    1.4.2、什么时候用?

    需要查询的数据是来自多张表时。
    

    1.4.3、怎么去多表连接查询?

    传统的连接,基于where条件
        1.  找表与表之间的关系列
         2. 排列查询条件
    
    自连接
    
    
    内连接*****
    A         B
    A.x      B.y
    1.  找两表之间的关系列
    2.  将两表放在join左右
    3.  将关联条件放在on后面
    4.  将所有的查询条件进行罗列
    
    -------查询oldguo老师和他教的课程名称
    SELECT teacher.tname,course.cname
    FROM teacher
    JOIN course
    ON teacher.tno=course.tno
    where teacher.tname='oldguo';
    -----统计一下每门课程总成绩
    SELECT course.cname,sum(score.score)
    FROM course
    JOIN score 
    ON course.cno=score.cno
    group by course.cno;
    
    
    
    外连接****
    
    
    特殊报错:统计一下每个课程总成绩以及课程号
    mysql> SELECT 
        -> course.cno,course.cname,sum(score.score) 
        -> FROM course 
        -> JOIN score  
        -> ON course.cno=score.cno 
        -> group by course.cname;
    ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'oldboy.course.cno' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
    说明:1、在select后面出现的列不是分组条件,并且没有在函数中出现
               2、如果group by后面是唯一条件列或者主键列,不会报出错误,如下:
       
    
    mysql> SELECT 
        -> course.cno,course.cname,sum(score.score) 
        -> FROM course 
        -> JOIN score  
        -> ON course.cno=score.cno 
        -> group by course.cno;
    +------+--------+------------------+
    | cno  | cname  | sum(score.score) |
    +------+--------+------------------+
    | 1001 | linux  |              484 |
    | 1002 | python |              210 |
    | 1003 | mysql  |              614 |
    +------+--------+------------------+
    3 rows in set (0.00 sec)
    
    
    

    相关文章

      网友评论

          本文标题:day04(select)

          本文链接:https://www.haomeiwen.com/subject/rgctqctx.html