按条件统计
SELECT user_id , SUM( IF( order_info.status = 'dead', 1, 0) )
FROM order_info
GROUP BY user_id;
group_concat( user_id )拼接id
select group_concat( user_id ) as userIds from user_distribution where parent_share_code = d.parent_share_code and apply_type='added'
sql语句分类(操作数据库的语句):
DDL:操作数据库和表;【创建(create)、删除(drop)、修改:(alter)、查(select)数据库或者表】
DCL:管理数据库权限;grant if…
DML:操作表中的数据;【增(insert)、删(delete)、改(update)】
DQL:查询表中的数据;select
where和having的区别:
a)where,having都可以进行筛选,where是分组前筛选,having是分组后筛选,
b)where不可以跟聚合函数, having是可以跟聚合函数的.
查询语句总结:
书写顺序: Select...from...where...group by ...having...order by....
解析顺序: from...where...group by ...having...select...order by....
and和or, and的优先级高一些.
max/min, sum,count,avg -- 多行函数--聚合函数:聚合函数一般与分组的 group by 一起使用. 用于实现分组后的筛选.按....统计.....
group by having 聚合函数
order by用来排序, 升序 asc / 降序 desc
Java数据类型对应 MySQL的类型:
byte/short/int/long tinyint /smallint /int /bigint
float float
double double
boolean bit
char/String char和varchar类型
char和varchar的区别:
* char代表是固定长度的字符或字符串,不足用空格补全。
* varchar代表的是可变长度的字符串。
Date date/time/datetime/timestamp
datetime和timestamp区别
* datetime就是既有日期又有时间的日期类型,如果没有向这个字段中存值,数据库使用null存入到数据库中
* timestamp也是既有日期又有时间的日期类型,如果没有向这个字段中存值,数据库使用当前的系统时间存入到数据库中。
File BLOB/TEXT
创建表之约束及建表:(规范数据的完整性)
单表的约束分类:
主键约束:primary key 一个表中的主键只有一个,自增也只有一个。
唯一性约束:unique
非空约束:not null
delete from 表名 和truncate table 表名 两种方式的区别:
delete from 表名:是DML语句,一条一条的删除数据,事务可以作用在DML语句上。
truncate table 表名:是DDL语句,先删除表,再创建一个跟之前表一样结构的新表,事务不能作用在DDL语句上。
between.. and..
mysql使用between and处理时间区间不包括右边界。
如:把and后的日期加上一天:
select * from user where create_time between ‘2018-12-6’ and DATE_ADD(‘2018-12-8’, INTERVAL 1 DAY ) ;
把and的日期字符串拼接成 ‘2018-12-8 23:59:59’:
2). mysql日期加减法: DATE_ADD(‘2017-12-30’, interval 1 DAY ) — 加法
DATE_SUB(‘2017-12-31’, interval 1 DAY ) — 减法
if null函数:将null值转化为“”或0
select sum(if null(eng,0)+chinese+math) from exam;
where子句不能使用聚合函数,如果现在使用带有聚合函数的条件过滤或者分组后过滤,使用having关键字
select … from 表名 where 条件 group by 字段名 hanving 条件 order by asc/desc;
5. 多表查询:
b)内联接查询:至少有 n-1 个连接条件.
select * from a, b where a.id=b.aid;
select * from a join b on a.id=b.aid;
c)外联接查询:左外, 右外
左外显示左边表的全部以及满足条件的部分
右外显示右边表的全部以及满足条件的部分
查询所有的部门中员工的个数.
select dept.name 部门名称,count(emp.id) 员工个数 from dept left join emp on dept.id=emp.dept_id group by dept.id;
d)子查询:
sql语句的嵌套
in, exists, any , all
需求:查询 小丽是 属于哪个部门的.
select name from dept where id=(select dept_id from emp where name='小丽');
select d.name from dept d,emp e where d.id=e.dept_id and e.name='小丽';
内联接能够实现就不要用 子查询, 子查询效率 会低很多.