mysql 面试查询语句累计
1,排序
假设需要查询:Select * from Table_1 where Table_1.Key in('C','A','B')
想要得到的查询结果排序为:
Row1:。。C 。。
Row2:。。A 。。
Row3:。。B 。。
也就是按照In中的顺序来排列,能否在SQL中实现?
Select * from Table_1 where Table_1.Key in('C','A','B') order by case Table_1.Key when 'C' then 1 when 'A' then 2 when 'B' then 3 end
2,分组
有如下数据
国家(country) | 性别(sex) | 人口(population) |
中国 | 1 | 340 |
中国 | 2 | 260 |
美国 | 1 | 45 |
美国 | 2 | 55 |
加拿大 | 1 | 51 |
加拿大 | 2 | 49 |
英国 | 1 | 40 |
英国 | 2 | 60 |
按照国家和性别进行分组,得出结果如下
国家 | 男 | 女 |
中国 | 340 | 260 |
美国 | 45 | 55 |
加拿大 | 51 | 49 |
英国 | 40 | 60 |
select country, sum ( case when sex = '1' then population else 0 end) as 'boy',
sum ( case when sex = '2' then population else 0 end) as 'girl'
from table_name group by country
3,批量插入2表数据,并且使数据关联起来
--1 创建主表 IF OBJECT_ID('Main') IS NOT NULL BEGIN DROP TABLE Main END GO CREATE TABLE Main( mainId INT PRIMARY KEY IDENTITY(1,1), mainName NVARCHAR(20) ) GO --2 创建子表 IF OBJECT_ID('Sub') IS NOT NULL BEGIN DROP TABLE Sub END GO CREATE TABLE Sub( subId INT PRIMARY KEY IDENTITY(1,1), mainId INT NOT NULL, subName NVARCHAR(20) ) GO --3 创建插入数据的存储过程 IF OBJECT_ID('proc_InsertMainAndSub') IS NOT NULL BEGIN DROP PROCEDURE proc_InsertMainAndSub END GO CREATE PROC proc_InsertMainAndSub AS BEGIN BEGIN TRAN tran1 BEGIN TRY DECLARE @mainId INT INSERT INTO Main VALUES ('main1') SELECT @mainId = @@identity INSERT INTO Sub VALUES (@mainId, 'sub1') INSERT INTO Sub VALUES (@mainId, 'sub2') INSERT INTO Sub VALUES (@mainId, 'sub3') COMMIT TRAN tran1 END TRY BEGIN CATCH ROLLBACK TRAN tran1 END CATCH END GO --执行存储过程 EXEC proc_InsertMainAndSub --查看数据 SELECT * FROM Main m SELECT * FROM Sub s --删除测试 DROP TABLE Main DROP TABLE Sub DROP PROCEDURE proc_InsertMainAndSub
--having
![](https://images2015.cnblogs.com/blog/623913/201705/623913-20170511194421926-50653100.png)
select
id,
count
(*)
as
counts
from
test
group
by
id;
select
id,
count
(*)
as
counts
from
test
group
by
id
having
count
(*)>1;
注:
having是分组(group by)后的筛选条件,分组后的数据组内再筛选,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。
where则是在分组前筛选