1、用一條SQL 語句 查詢出`chengji`表,每門課都大於80 分的學生姓名。
name kecheng fenshu
張三 語文 81
張三 數學 75
李四 語文 76
李四 數學 90
王五 語文 81
王五 數學 100
王五 英語 90
sql:select distinct name from chengji where name not in (select name from chengji where fenshu<=80 );
sql:select name from chengji group by name having min(fenshu)>80
思路:篩選出小於等於80的分數的名字,過濾掉小於等於80的分數的名字,再對名字進行去重
對名字進行分組,再判斷大於80的分數
注:分組前,條件使用where;分組后,條件使用having;having后通常跟聚合函數
2、學生表 如下:
自動編號 學號 姓名 課程編號 課程名稱 分數
1 2005001 張三 0001 數學 69
2 2005002 李四 0001 數學 89
3 2005001 張三 0001 數學 69
1)查詢出重復的數據,且id為最大或者最小的
sql:select max(id) id,name,kecheng,fenshu from chengji group by fenshu,kecheng,name having count(name)>1
sql:select min(id) id,name,kecheng,fenshu fromchengji group by fenshu,kecheng,name having count(name)>1
2)刪除除了自動編號不同, 其他都相同的學生冗余信息。
sql:
3、一個叫 team 的表,里面只有一個字段name, 一共有4 條紀錄,分別是a,b,c,d, 對應四個球對,現在四個球對進行比賽,用一條sql 語句顯示所有可能的比賽組合.
思路:先把team分成兩個表;兩表組合;去掉重復的組合
sql:select a.name,b.name from team a,team b where a.name<b.name;
4、
問題:
1)查詢張三的2019年生產產品的銷售量(使用left join 關鍵字)
sql:
select
*
from sales
left join deal on sales.S=deal.S
left join production on deal.P=production.P
where Sname='張三' and Pdate like '2019%';
2)查詢生產日期2020年的一季度各產品的總銷量
sql:
select
t2.P,t2.Pname, SUM(Voulume),t2.Pdate
from deal t1
left join production t2 on t1.P=t2.P
where t2.Pdate like '2020%'
GROUP BY t2.P;
3)查詢銷售量最高的產品的銷量(使用group by關鍵字)
sql:
select
a.P,a.Pname,max(a.sum1)
from
(
select
t1.P,t1.Pname,sum(Voulume) as sum1
from
production t1
left join deal t2 on t1.P=t2.P
group by t1.P
) a;
5、表名:test_tb_grade
圖1
圖2
將圖1轉換為圖2
sql:
SELECT id,user_name ,
MAX(CASE course WHEN '數學' THEN score ELSE 0 END ) 數學,
MAX(CASE course WHEN '語文' THEN score ELSE 0 END ) 語文,
MAX(CASE course WHEN '英語' THEN score ELSE 0 END ) 英語
FROM test_tb_grade
GROUP BY USER_NAME;
6、表名:ta
圖1
圖2
對圖1表查成圖2的結果
sql:select date_format(datas,'%Y-%m-%d') '日期' from ta
7、查詢出近一周/一月/一年的數據
select * from ta where DATEDIFF(now(),datas)<=7;
select * from ta where DATEDIFF(now(),datas)<=30;
select * from ta where DATEDIFF(now(),datas)<=365;
8、請寫出一個SQL來查詢分數前五5的所有人?