1.inner join就是在去除关联完后出现的null值情况,本身就是一个交集的存在。
select st.* from student st
inner join score sc on sc.s_id = st.s_id
inner join course c on c.c_id=sc.c_id and c.c_id="01"
where st.s_id in (
select st2.s_id from student st2
inner join score sc2 on sc2.s_id = st2.s_id
inner join course c2 on c2.c_id=sc2.c_id and c2.c_id="02"
)
所以不需要使用下面的case条件语句了,因为这样是先查询出并集,在去除为null的情况,很明显直接使用inner join直接解决null
select ss.* from
student ss left join score sc on ss.s_id = sc.s_id and sc.c_id = '01'
left join score sc2 on sc2.s_id = ss.s_id and sc2.c_id = '02'
where
(case when sc.s_id is null then 0 else sc.s_id end) != 0
and
(case when sc2.s_id is null then 0 else sc.s_id end) != 0
2.查询百分比(各部分占比)情况
基本语句是
select s.score/100 from student s
需要变化成
select y.work_efficiency , y.total ,
concat(
cast(
100 * y.total / (select sum(y1.total) from ylxm_maintain as y1)
as decimal(12,2)
),
'%'
)
from ylxm_maintain as y GROUP BY y.total , y.work_efficiency
重点在于select查询对象中的百分比,使用了cast(param as decimal(12,2))规范成需求的格式数字以及concat(a , b)拼接字符
也可以使用round方法来精确小数点
select round( column_name,decimals(12,2) ) from table_name
3. -- where还能做加减法,当然实际情况是要写成age >= 20 + 10的,因为操作数据的运算要在符号右边
select * from teacher where age - 10 >= 20
这个可以在特定的表中使用一行数据的不同列进行差值运算
4. 创建表、修改表的列
-- 建表语句
create table emp(
emp_id int auto_increment,
emp_name char(20) not null default '',
birth datetime not null,
phone char(20) not null,
addr varchar(200) not null,
dept_id int not null default 0,
index idx_emp_name(emp_name),
index idx_emp_name_birth(emp_name,birth),
primary key(emp_id), --emp_id字段为主键
foreign key(dept_id) references dept(dept_id)
) engine=innoDB default charset=utf8;
-- 添加一列,指定在sex列的后面
ALTER TABLE student
ADD COLUMN teacher_id int(2) DEFAULT '0' COMMENT '老师名字' AFTER sex;
-- 修改列的属性长度 这里的tb_article为表名,NAME为字段名,50为修改后的长度
ALTER TABLE tb_article MODIFY COLUMN NAME VARCHAR(50);
-- 简单的见表语句
create table test2(
id int(10) not null auto_increment comment 'id不可重复,唯一标识,不能为空',
name varchar(50) comment '名称',
amount int(20) comment '数量',
PRIMARY KEY (id)
) ENGINE=INNODB , auto_increment = 1 , DEFAULT CHARSET=utf8
5.case when s.sex = 1 then 1 else 0 end 的 case语句用法
-- 查询每个类型的班级的学生数量、男女生数量
select
c.id , c.name as 'cname' , count(s.class_id) as '学生总数' ,
sum(case when s.sex = 1 then 1 else 0 end) as '男生数量' ,
sum(case when s.sex = 2 then 1 else 0 end) as '女生数量'
from
class c left join student s on c.id = s.class_id
GROUP BY
s.class_id
使用这个case语句使得如果s.sex为1的话返回一个1不然就返回一个0,再使用sum就可以实现统计出s.sex为1的数量,同理可得s.sex=2的数量。
6.插入数据
-- 复制A表数据到B表中去
insert into test2(name,amount) (select type_string , amount_int from test)
-- 上面是将test表中的两个字段全部复制到test2表的两个字段中了,当然复制过去时数据类型一定是一致的