MySQL 基础知识快学-查询

打印 上一主题 下一主题

主题 1022|帖子 1022|积分 3066

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
        废话不多说,这篇文章主要先容实用且口试很容易考到基础知识,得当初学者或者口试前复习用。增编削查之查询篇。
1、查询语句结构先容

select   
  distinct    ------去重
  字段1, ------要展示的字段
  字段2,
  字段3
from  表名1   ---------表名1 as 表名2,从哪个表查询并能重新命名
where  条件          ----筛选条件
group by 汇总字段       -----分组汇总
having  汇总字段条件  ----汇总后的条件
order by 字段  desc    -----排序
limit  行数                    -----限制输出行数
一样平常的语句包罗上面的结构字段

2、常用函数

1)substr(字段1,n1,n2)  n1位置开始,截取n2个字符
例:substr('ABCDS',2)='BCDS'
2)trim(字段1)  去除左右空格
3)concat(字段1,字段2,字段3):链接字符串
4)current_date():获取当前时间
5)date_add('YYYY-MM-DD',n):开始日期加n天
6)last_day('YYYY-MM-DD'):日期所属月份的最后一天日期。
7)if
if(条件,TRUE,FALSE
如:if(1=1,‘x’,'y')='x'
8)case when
case
   when 条件1  then 值1   -----满足条件1,字段值为:值1
   when 条件2  then 值2    -----满足条件2,字段值为:值3
......
else 值N  end              ----------都不满足条件,字段值为:值N


3、运算符:

 =  <>  >=  AND  OR   IN  NOT IN
BETWEEN AND   IS NULL  IS NOT NULL
LIKE    RLIKE (正则匹配)
4、 INSERT…VALUES语句

通过这个语句为表中添加数据
INSERT VALUES 的语法格式为:
   INSERT INTO <表名> [ <列名1> [ , … <列名n>] ]
VALUES (值1) [… , (值n) ];
  
use dewi_practice

insert into Employee

values(002,'王子行','男','26')


开始insert 报错,
解决mysql插入中笔墨符报错的问题ERROR 1366 (HY000): Incorrect string value: '\xE5\xB0\x8F\xE6\x98\x8E' for column
解决办法将上面的字符集改为utf-8

5、查询小例子-汉语


SELECT score_a.`分数` from score_a;#如下表,表字段是汉语,必要加``

  
`` 用这个符号是不是可以了
delete from score_a where `分数`=81;  也用符号``。。


6、连表查询

1)union &union all

建表
insert into score_A values(1,"张三",'数学',81);
insert into score_A values(2,"李四",'数学',75);
insert into score_A values(3,"王五",'地理',50);
insert into score_A values(4,"张三",'语文',62);

insert into score_b values(1,"李四",'语文',76);
insert into score_b values(2,"李四",'地理',80);
insert into score_b values(3,"王五",'数学',61);
insert into score_b values(4,"陈留",'数学',91);

------ score_A


 --------- score_b

union  和 union all  前者过滤重复 的,后者不外滤
SELECT * FROM score_b
UNION ALL
SELECT * FROM score_a;

SELECT b.`序号`,b.`姓名`,b.`课程`,b.`分数`
FROM score_b as b
UNION ALL
SELECT a.`序号`,a.`姓名`,a.`课程`,a.`分数`
FROM score_a as a;

效果:

增加一个重复的试试:
insert into score_b values(1,"张三",'数学',81);
连表union,去除重复项
SELECT b.`序号`,b.`姓名`,b.`课程`,b.`分数`
FROM score_b as b
UNION
SELECT a.`序号`,a.`姓名`,a.`课程`,a.`分数`
FROM score_a as a;

查看效果:

表b

姓名张三是重复的但是没有去重,是完全重复才会去除
效果如下

2)left  join  on

左连接,左表全部展示,
左表中的第一行与右表的每一行依次对比,符合条件的保留下来,
左表中的第二行与右表的每一行依次对比,符合条件的保留下来,
......

右表有值的展示,(对应左表的大概多条),右表轮询后无对应的值时显示null(一条)
若a表

c 表,插入数据
insert into score_c values(2,15,'二班','女');


使用left  join 语句
select * FROM score_a as a LEFT JOIN score_c c ON
a.`序号` = c.`序号`;


如上的例子现实中一样平常不用。

但是如果从A表中剔除C表的内容(注意应该是is null ,开始写成=null)
select a.`序号`,a.`姓名`,a.`课程`,a.`分数`
FROM score_a as a
LEFT JOIN score_c c
 ON
a.`序号` = c.`序号`
 where c.`序号`is NULL;


3)inner  join  on

内连接,只是取交织存在的值
左表中的第一行与右表的每一行依次对比,符合条件的保留下来,
左表中的第二行与右表的每一行依次对比,符合条件的保留下来,
......
不符合条件的过滤。
例如

a 表

C表

select a.`序号`,a.`姓名`,a.`课程`,a.`分数`
FROM score_a as a
inner JOIN score_c c
 ON
a.`序号` = c.`序号`;


上面的语句等价于下面
select a.`序号`,a.`姓名`,a.`课程`,a.`分数`
FROM score_a as a
left JOIN score_c c
 ON
a.`序号` = c.`序号`
where c.`序号` is not null;



执行效果



4、数据汇总查询

insert INTO score_a
VALUES(5,"张三",'地理',99);  ---增加一条

SELECT * FROM score_a;
SELECT a.`课程` from score_a as a
GROUP BY a.`课程`;
----效果为按课程分组,展示课程

a. 计算出每个课程的总分并显示出课程和总分(以分数汇总显示出来)
SELECT a.`课程`,sum(a.`分数`)as "分数汇总" 
from score_a as a
GROUP BY a.`课程`;

效果如下:

b.筛选出平均分大于70的课程

第一个错误的:记着group by 搭配的是having
SELECT a.`课程`,avg(a.`分数`)as "平均分" 
from score_a as a
GROUP BY a.`课程`
where avg(a.`分数`) > 70;

SELECT a.`课程`,avg(a.`分数`)as "平均分" 
from score_a as a
GROUP BY a.`课程`
HAVING avg(a.`分数`) >= 70;//注意要用avg(a.`分数`)而非"平均分"

5、排序原理及应用

order by :默认升序,如果降序desc

SELECT a.`课程`,avg(a.`分数`)as "平均分" 
from score_a as a
GROUP BY a.`课程`
ORDER BY avg(a.`分数`);
a.实现每个课程的平均分升序排列


降序:
SELECT a.`课程`,avg(a.`分数`)as "平均分" 
from score_a as a
GROUP BY a.`课程`
ORDER BY avg(a.`分数`) DESC;

b.将结果表中的姓名按升序排序,且相同姓名的课程按分数从高到低排序


SELECT * 
from score_a as a
ORDER BY a.`姓名`,a.`分数`DESC;//先按姓名,再按分数


c.在结果中,获取同一学生分数最高的课程,并按姓名,课程,分数举行输出

SELECT * FROM score_a;
SELECT a.`姓名`, a.`课程`,max(a.`分数`) as `分数`
from score_a as a
group by a.`姓名`;


还可以使用分组排序
以字段1分组,字段2排序,并且有序号可以作为字段
row_number() over(partition by 字段1 order by 字段2)
avg(字段2) over(PARTITION by 字段1)  ---以字段1分组,计算字段的平均值,最大值,等

例子:
select cust_id,sex,income,prov,age,
       avg(age) over(PARTITION by prov) as avg_age
from cust1;
如下:增加一列为分组排序,按名字分组,默认升序排序,
注意MySQL8.0以上才有
SELECT  score_a.`序号`,score_a.`姓名`,score_a.`课程`,score_a.`分数`,
row_number()over(PARTITION by score_a.`姓名` ORDER BY score_a.`分数`) as `分组排序`
from score_a ;

卸载原来的重新安装,
重新试试

SELECT  score_a.`序号`,score_a.`姓名`,score_a.`课程`,score_a.`分数`,
row_number()over(PARTITION by score_a.`姓名` ORDER BY score_a.`分数` desc ) as `分组排序`
from score_a ;

效果:

然后:在结果中,获取同一学生分数最高的课程,并按姓名,课程,分数举行输出

SELECT T1.`姓名`,T1.`课程`,T1.`分数`
FROM
(SELECT  score_a.`序号`,score_a.`姓名`,score_a.`课程`,score_a.`分数`,
row_number()over(PARTITION by score_a.`姓名` ORDER BY score_a.`分数` desc) as `分组排序`
from score_a) as T1
where T1.`分组排序`=1;

-----思路,先分组排序,然后取1号,一号为最大的。


6、综合练习

案例1

表名:
INSERT INTO sales VALUES(1,'2017',60);
INSERT INTO sales VALUES(1,'2018',50);
INSERT INTO sales VALUES(1,'2019',80);
INSERT INTO sales VALUES(2,'2017',90);
INSERT INTO sales VALUES(2,'2018',100);
INSERT INTO sales VALUES(2,'2019',120);
INSERT INTO sales VALUES(3,'2017',60);
INSERT INTO sales VALUES(3,'2018',70);
INSERT INTO sales VALUES(3,'2019',80);


把他改成表sales_b

INSERT INTO sales_b VALUES(1,60,50,80,63.33);
INSERT INTO sales_b VALUES(2,90,100,120,103.33);
INSERT INTO sales_b VALUES(3,60,70,80,70);

思路:先看看如何转换已往
         


 select
a.DEP_ID,          
a.YEAR,
a.SALES AS SALE,
a.SALES AS SALE_2017,
a.SALES AS SALE_2018,
a.SALES AS SALE_2019,
a.SALES AS AVG_SALES
FROM sales a;    -----语句这样,增加字段

接着变

select a.DEP_ID,
a.YEAR,
a.SALES AS SALE,
CASE WHEN a.YEAR='2017' THEN a.SALES ELSE 0 END AS SALE_2017,
CASE WHEN a.YEAR='2018' THEN a.SALES ELSE 0 END AS SALE_2018,
CASE WHEN a.YEAR='2019' THEN a.SALES ELSE 0 END AS SALE_2019,
a.SALES AS AVG_SALES
FROM sales a;



接着变,取出最大值作为每一年度的销售值,按季度分群,求平均值

select a.DEP_ID,
max(CASE WHEN a.YEAR='2017' THEN a.SALES ELSE 0 END) AS SALE_2017,
max(CASE WHEN a.YEAR='2018' THEN a.SALES ELSE 0 END) AS SALE_2018,
max(CASE WHEN a.YEAR='2019' THEN a.SALES ELSE 0 END) AS SALE_2019,
avg(a.SALES) AS AVG_SALES
FROM sales a
GROUP BY a.DEP_ID;
注意:聚合函数必要和group by 一起使用

以上是最常用的一些基本知识,背面有时机不停深入举一些范例例子分析。谢谢!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

吴旭华

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表