按條件統計
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='小麗';
內聯接能夠實現就不要用 子查詢, 子查詢效率 會低很多.