小记 1. 多表关联不显示重复列
使用:USING();
一般我们做关联查询的时候,都是select * from table1 inner join table2 on table1.XX=table2.XX,这样查询出的结果在展现的时候是有相同字段的,如果不想要的话,那么我们可以拿using(XX)取代 table1.XX=table2.XX
,一样可以达到关联效果ヾ(◍°∇°◍)ノ゙
并且不需要给表起别名哦!
- 多表关联:用USING(相同列名) ,会去除相同列名并形成新的视图,所以筛选的时候不需要用
表名.列名的方式
SELECT * FROM Student
INNER JOIN SC USING(SID)
INNER JOIN Course USING(CID)
结果:
- 加判断的using()语句!
查询学数学、语文的学生之差
SELECT MAX(Sname),SUM(score) FROM Student
INNER JOIN SC USING(SID)
INNER JOIN Course USING(CID)
WHERE Ssex="男" AND Cname IN("数学","语文") GROUP BY SID
小记 2. top 和 limit 的使用方法
按行数做筛选查询
-
MySQL写法 : limit
table中的数据,从第10行开始顺位展现,一共展现两条!展现第11和第12行
:
select * from table limit 10,2; -
SQLserver:top
table中的数据只展现10行
select top 10 * from table;
- SqlServer中如果要实现第10到12行这样中间行,这里需要用个嵌套;
select top 12* from table where id not in(select top 10 id from table )
意思就是:
① 先查询出top 10(前10行的id)
② 然后查询出前12行
③ 12行中排除id不等于前10行查询的出i
那么就剩下11和12行的数据了!
小记 3. insert into select
- 简介 : 把查出的数据,一一对应的插入到一张表中!可批量插入
- 格式: insert into table1 select * from table 2
可以需要插什么字段,就把*改成需要的字段,与table1的列一一对应就OK了
如下:
单个数据的插入方式:
insert into student (id,name,age,...) value(new(id),"张三",15,...)
可以大批量插入方式:
insert into table1(id,name,age) select new(id),字段名,字段名 from table2 inner join table3
注意:
① 自己要熟悉table1中的字段,知道自己要插什么数据,数据是什么类型的
② 在select * from 中间的*
,改成从table2和table3中查询出
想要的数据的列名,要与想插入的表中字段一一对应,自增的列我们用new(id)
代替
实际SQL如下:
select 后面的字段与上面的一一对应的,@XXXX是我引用了上面的变量,主要看一下格式!
小记 4. UNION 的使用(并集)
SELECT id FROM student
UNION
SELECT Stu_id FROM score;
小记 5. case when .. then
- 如下图进行操作演示!
-
① 表中的sex使用数字展现的,查询的时候希望用中文展现
SELECT sid,sname,sage,(
CASE ssex WHEN "1" THEN "男"
WHEN "2" THEN "女"
ELSE "人妖" END) 性别
FROM Student
- 执行效果视图
-
② 将sum与case结合使用,可以实现分段统计。
如果现在希望将上表中各种性别的人数进行统计,sql语句如下:两种方法
SELECT
SUM(CASE Ssex WHEN 1 THEN 1 ELSE 0 END)男性,
SUM(CASE Ssex WHEN 2 THEN 1 ELSE 0 END)女性,
SUM(CASE WHEN Ssex<>1 AND Ssex THEN 1 ELSE 0 END)性别为空
FROM Student;
------------------------------------------------------------------
SELECT
COUNT(CASE WHEN Ssex=1 THEN 1 END)男性,
COUNT(CASE WHEN Ssex=2 THEN 1 END)女,
COUNT(CASE WHEN Ssex <>1 AND Ssex<>2 THEN 1 END)性别为空
FROM users u;
SUM(CASE Ssex WHEN 1 THEN 1 ELSE 0 END)男性,
- CASE Ssex : 确定了要改别的哪列,CASE 列名
- WHEN 1: 确定要统计的某个字段值 ,WHEN 字段值
- THEN 1: 把WHEN确认的字段值都给改成数字1 ,THEN 1
- ELSE 0:不是WHEN 选中的字段值,都给改成数字0
- END : 这个CASE结束
- sum :把这个值对应1进行相加,统计出值在当前表中有几个
- sum() 男性: 给这sum算出来的结果,起个别名
COUNT(CASE WHEN Ssex=1 THEN 1 END)男性,
- CASE WHEN Ssex=1 :把Ssex=1 的所有的值给筛选出来
- THEN 1 :筛选的值给存到THEN 1中,相当于另一列中,然后才能count
- END : 这个CASE结束
- count() 男性: 统计Ssex=1 的数据有多少条记录,用COUNT(),然后取个别名展现
- 区域性筛选
SELECT id,
(
CASE
WHEN id > 10
THEN "及格"
ELSE "不及格"
END
) FROM t_merchant_info ;
网友评论