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)
网友评论