美文网首页
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