mysql语句的一些例子

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表的两个字段中了,当然复制过去时数据类型一定是一致的

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值