一,前言
數據分析基本的代碼能力是對SQL的使用,下面對業務中實際用到的語法和函數進行學習及總結。
二,常用關鍵字與函數
SQL的書寫規范:語句中出現的所有表名、字段名全部小寫,系統保留字、內置函數名、SQL保留字大寫(SQL本身不區分大小寫,大寫可能是為了增加可讀性?)
SQL注釋:
MySQL——1,單行注釋使用“#”或者“-- ”(第二種方法后有一個空格)2,多行注釋使用“/* */”
Oracle——1,單行注釋使用“--”2,多行注釋使用使用“/* */”
SQL關鍵字與函數:
AS——別名關鍵字,用來給之前的關系取一個更直觀或者“中文”的名字來表示
DISTINCT——去重關鍵字
能夠作用於單列或者多列
COUNT——函數返回指定條件的行的數目
當COUNT與DISTINCT結合使用時:表示對這一列不重復的行進行計數
GROUP BY——分組函數
GROUP BY結合一些聚合函數對一個或多個列的結果集合進行分組
LIKE——該操作符用於在WHERE子句中,搜索列中的指定模式
LIKE配合“通配符”能夠完成匹配指定的字符
通配符——“%”代替0個或多個字符;“_”替代一個字符
例子:“A%”表示以A開頭的所有字符,“%AA%”表示包含“AA”的所有字符
JOIN——用來把兩個或多個表根據某些相同字段,結合起來
JOIN有多種不同的利用,例如“LEFT JOIN”、“INNER JOIN”等
例如“INNER JOIN”,是最常用的JOIN方式,用來獲取不同表滿足條件的部分,即獲得交集
其他JOIN:
LEFT JOIN:即使右表中沒有,也從左表中返回所有行
RIGHT JOIN:即使左表中沒有,也從右表返回所有行
FULL JOIN:只要其中一個表存在匹配,則返回行
CASE WHEN——用於分類統計
--簡單CASE函數
CASE sex
WHEN '1' THEN '男'
WHEN '0' THEN '女'
ELSE '其他' END
--CASE搜索函數
CASE WHEN sex = '1' THEN '男'
WHEN sex = '0' THEN '女'
ELSE '其他' END
這里,END后可以直接加別名,不用AS
OVER()——開窗函數,同聚合函數一樣,也基於組對行進行某種函數操作,不同的是聚合函數每組返回一行,而開窗函數返回的多個行。常見用法:
ROW_NUMBER() OVER(PARTITION BY column_name ORDER BY column_name)
來組成分析函數,完成復雜報表的統計需求。(后續還需要再開一篇專門學習各種分析函數,進一步對復雜的統計表達方法進行學習)
最后,值得注意的是,SQL的語法順序和執行順序是不同的。
SQL的語法順序:
SELECT——FROM——WHERE——GROUP BY——HAVING——UNION——ORDER BY
執行順序:
FROM——WHERE——GROUP BY——HAVING——SELECT——DISTINCT——UNION——ORDER BY
DQL語言(查詢)

1.基礎查詢 1).select 查詢列表 from 表名 2).別名: 方式一: select 字段 別名 方式二: select 字段 AS 別名 3).+: 在sql中只能用於加法運算 4).常見方法 desc 表名 : 查詢表結構 show tables from 庫名 : 查看指定庫下所有表 show tables : 查看當前庫下所有表 show databases : 查看當前連接下的所有庫 is null:是否為空 distinct:去重 ifnull(列名,值1):如果列名的值為null,則用值1進行其他運算 concat(字段,字段....):拼接 escape:轉移字符 between A and B : 在A和B的區間 in :在...里面 2.條件查詢 1).select 查詢列表 from 表名 where 條件 2).條件形式 關系: > < >= <= = <> 邏輯:and or not 模糊:like/not like 注: 一般和通配符搭配使用: "__e_%" _:任意單個字符 %:任意0個或多個字符 between A and B / not between A and B in / not in is null/is not null 3.排序查詢 select 查詢列表 from 表名 where 條件 order by 排序列表(asc|desc) 4.單行函數 常見的單行函數 1).字符函數 length:獲取字節個數 substr:截取子串 concat:拼接字符串 trim:去前后空格或指定字符 trim(substr from str):去除指定字符 lower:轉換成小寫 upper:轉換成大寫 lpad:左填充 rpad:右填充 instr:獲取子串第一次出現的索引 replace:替換字符串 2).數學函數 abs:絕對值 round:四舍五入 floor:向下取整 ceil:向上取整 rand:隨機數 mod:取余 truncate:截取 3).日期函數 now():獲取當前日期+時間 curdate():獲取日期 curtime():獲取時間 date_format():將日期轉換成指定個數的字符 year/month/day:獲取指定部分 str_to_date:將字符串解析成指定格式的日期 4).流程控制函數 if: 語法 if(條件,表達式1,表達式2) 如果條件成立,返回表達式1,否則返回表達式2 case: 方式一: 類似於多重if case when 條件1 then 表達式1 when 條件2 then 表達式2..... else 表達式n end 方式二:類似於switch case case 表達式或字段 when 值1 then 表達式1 when 值2 then 表達式2.... else 表達式n end 5.分組查詢 select 分組函數,分組后的字段 from 表名 where 篩選條件 group by 分組的字段 having 分組后篩選 order by 排序列表 asc|desc 6.連接查詢 1).SQL92語法:只有內連接 1.等值連接 select 查詢列表 from 表1 別名1 ,表2 別名2 where 別名1.關鍵列 = 別名2.關鍵列 and 篩選條件 group by 分組 having 分組后的篩選 order by 排序 asc|desc 2.非等值連接 select 查詢列表 from 表1 別名1 ,表2 別名2 where 別名1.關鍵列 > 別名2.關鍵列 and 篩選條件 //非等值條件 group by 分組 having 分組后的篩選 order by 排序 asc|desc 3.自連接 select 查詢列表 from 表 別名1 ,表 別名2 where 別名1.關鍵列 > 別名2.關鍵列 and 篩選條件 //表為同一張表 group by 分組 having 分組后的篩選 order by 排序 asc|desc 2).SQL99語法 內連接: 1.等值連接 select 查詢列表 from 表1 別名1 [inner] join 表2 別名2 on 等值連接條件 where 篩選條件 group by 分組 having 分組后的篩選 order by 排序 asc|desc 2.非等值連接 select 查詢列表 from 表1 別名1 [inner] join 表2 別名2 on 非等值連接條件 where 篩選條件 group by 分組 having 分組后的篩選 order by 排序 asc|desc 3.自連接 select 查詢列表 from 表 別名1 [inner] join 表 別名2 on 連接條件 where 篩選條件 //表為同一張表 group by 分組 having 分組后的篩選 order by 排序 asc|desc 外連接: 1.左外連接 select 查詢列表 from 主表 別名 left [outer] join 從表 別名 on 連接條件 where 篩選條件 group by 分組 having 分組后的篩選 order by 排序 2.右外連接 select 查詢列表 from 從表 別名 right[outer] join 從表 別名 on 連接條件 where 篩選條件 group by 分組 having 分組后的篩選 order by 排序 3.全外連接(mysql不支持全外連接)full[outer] join (left join union right join代替) select 查詢列表 from 表1 別名 full[outer] join 表2 別名 on 連接條件 where 篩選條件 group by 分組 having 分組后的篩選 order by 排序 7.子查詢 1).select后面 2).from后面 3).where或having后面 4).exists后面 8.分頁查詢 select 分組函數,分組后的字段 from 表名 where 篩選條件 group by 分組的字段 having 分組后篩選 order by 排序列表 asc|desc limit 起始條目索引,條目數 9.分組函數 方法: avg:平均值 sum:求和 max:最大值 min:最小值 count:統計個數
DML語言(操縱)

vinsert/update/delete 1.插入單行 方式一:insert into 表名(列名....) values/value(值....) 方式二:insert into 表名 set 字段名=值,字段名=值.....; 2.插入多行 方式一:insert into 表名(列名....) values(值...),(值...)....; 方式二:insert into 表名(列名....) select 值1,值2....union [all] ..... select 值1,值2... 注: 如果不使用all關鍵字,默認去重。如果使用all關鍵字,可以包含重復項 3.修改語句 update 表名 set 字段名 = 新值....where 條件 4.刪除語句 1).delete 刪除表數據,刪除后可以回滾數據 單表的刪除: delete from 表名 where 條件 多表的刪除: delete 表的別名 .... from 表1 別名,表2 別名.... where 連接條件 and 篩選條件 2).truncate truncate table 表名;刪除表數據,直接刪除不能回滾數據
DDL語言(定義)

create/alter/drop 1.庫的管理 創建:create database [if not exists] 庫名 刪除:drop database [if exists] 庫名 2.表的管理 創建:create table [if not exists] 表名( 字段名 字段類型 [列級約束], ........ [表級約束]) 注:表級約束語法 constraint 約束名 foreign key (主表字段名)references 表名(字段名) 修改: 1).修改表名:alter table 表名 rename to 新表名 2).添加新列:alter table 表名 add column 列名 類型 約束 3).刪除舊列:alter table 表名 drop column 舊列名 4).修改列名:alter table 表名 change column 舊列名 新列名 新類型 約束 5).修改列的類型或約束 情況1.修改非空,默認兩大約束或修改類型 alter table 表名 modify column 列名 新類型 新約束 情況2.添加主鍵,外鍵,唯一 alter table 表名 add primary key (主鍵列名); alter table 表名 add unique (唯一鍵列名); alter table 主表 add constraint 約束名 foreign key (主表已經存在的列名) references 附表(附表已經存在的字段名); 情況3.刪除主鍵,外鍵,唯一 alter table 表名 drop primary key; alter table 表名 drop index 唯一鍵的列名; alter table 表名 drop foreign key; 3.表的刪除 drop table [if exists] 表名 4.表的復制 1.只復制表的結構: create table 表名 like 舊表
DCL語言(事務控制)

commit:提交 rollback:回滾 示例: Connection con = null; Preparedstatement st = null; try { com = JDBCUtils.getConnection(); con.setAutoCommit(false); //關閉自動提交事務 st = con.prepareStatement("sql語句"); // st.setXX(占位符,值); //參考JDBC的使用 st.executeUpdate(); ..... int i=1/0; //模擬異常 st.setXX(占位符,值); con.commit(); //結束事務,提交事務 } catch (Exception e) { con.rollback(); //回滾事務 }finally { JDBCUtils.close(con); //釋放資源 }