一.數據庫基礎(mysql)
1.windows命令行連接服務器
- mysql -h&ip -p&port -u&用戶名 -p
- -h (host) 連接的ip localhost
- -p (port) 端口號 3306
- -u (username) 用戶名 root
- -p (password) 密碼 123456
- 如果在本地登錄,直接寫mysql -uroot -p
2.數據庫的執行原理
- 數據服務器提供服務,客戶端連接到數據庫服務器。向服務器發送sql語句,服務器執行SQL,返回結果。
3.字段類型
- 整型
-
整型
占用字節
范圍
范圍
tinyint
1
-27~27-1
-128~127
smallint
2
-215~215-1
-32768~32767
mediumint
3
-223~223-1
-8388608~8388607
int
4
-231~231-1
-2147483648~2147483647
bigint
8
-263~263-1
-
-
顯示寬度:最小的顯示位數,比如int(11),最少用11位數字顯示值。
-
顯示的時候不夠11位以0填充
-
顯示寬度必須結合zerofill才起作用
-
- 無符號數(unsigned)
-
無符號數就是沒有負數,無符號數的正數的范圍是有符號數正數范圍的2倍
-
create table t4(
id tinyint(255)unsigned
);
-
-
unsigned的在sql中的使用方法:
-
tinyint unsigned
mediumint unsigned
int unsigned;
- 浮點數
浮點數 |
占用字節 |
范圍 |
float(單精度) |
4 |
-3.4E+38~3.4E+38 |
double(雙精度) |
8 |
-1.8E+308~1.8E+308 |
-
- 浮點數的聲明:float(M,D),double(M,D)
M:總位數 D:小數位數 M-D:整數位數
例如:float(9,3) 一共9位數,小數3位,整數6位.
double(9,3) 一共9位數,小數3位,整數6位.
-
- 精度問題:float 只有 6~7位可信數
double 有 14~15位可信數據
- 定點型-保存小數
- 主要用於存儲金額
-
decimal(M,D) 存D位小數,M-D位整數,總共M位
-
M的最大值是65,D的最大值是30,默認是(10,0)
4.字符型
- 字符集:字符到二進制的編碼的集合,叫字符集
-
latin1 使用1個字節表示字符,gbk使用2個字節表示字符,utf8使用3個字節表示字符,如果有6個字節,在gbk中可以存3個漢字,utf8可以存兩個漢字
- mysql支持 40種字符集,查詢語法:show charset;
- 客戶端設置字符集是為了告訴服務器,我要用哪個字符集來跟服務器溝通,設置字符集:set names utf8;
-
- 定長和變長字符串
- 定長char(L):有多少空間就占用少空間,不會回收剩余的空間。L的最大長度是255字符,utf8中一個字符相當於3個字節,gbk中一個字符相當於2個字節
- 變長varchar(L):如果空間沒用完,剩余的空間,mysql會回收。L:最多字符數,理論最大長度是65535字節,但事實上達不到
-
一般我們不能確定插入的值的長度,要用varchar
- text型-保存長文本
數據類型 |
描述 |
char(L) |
定長字符 |
varchar(L) |
可變長度字符 |
tinytext |
大段文本(大塊數據) 28-1=255個字符 |
text |
大段文本(大塊數據) 216-1=65535個字符 |
mediumtext |
224-1 |
longtext |
232-1 |
- 枚舉enum-相當於單選
- 語法:enum(選項)
-
- 意義:只能選擇指定的值的一個
- 優點可以控制插入的數據;節省保存數據的空間;可以提高查詢的速度。
- 集合set-相當於多選
- 語法:set('值1','值2',,,)
- 創建表
-
- 插入數據
- 日期時間
數據類型 |
描述 |
datetime |
日期時間 占8個字節 0001-01-01 00:00:01 ~ 9999-12-31 23:59:59 |
date |
日期 |
time |
時間 |
year |
年份,占用1個字節 |
timestamp |
時間戳,占用4個字節 最大值1970-01-01 00:00:01 ~ 2038-01-19 11:14:07 |
5.列屬性
6.運算符
- 運算符
- 算數運算符:+ - * / % 取余/取模
- 關系運算符:> ≥ < ≤ !=
- 邏輯運算符
-
&& 與 and 兩個條件都滿足
-
|| 或 or 兩個條件滿足一個
-
! 非 not 取反
-
- 小括號()
小括號內優先級最高
- 別名as
可以對表名,字段名使用as來取別名,可以解決重名問題。取別名as可省略
7.索引
二.基礎語句(sql)
1.語法
select 選項 from 表名 [where 條件] [group by 字段名] [having 條件] [order by 字段] [limit 參數];
2.字段列表
from子句;distinct;聚合函數-做一些統計
聚合函數 |
描述 |
sum() |
求和 |
avg() |
求平均值 |
max() |
最大值 |
min() |
最小值 |
count() |
記錄數 |
3.where條件
- 關系和邏輯運算:對值進行過濾,符合條件的就查詢出來。所有的關系運算,都可以使用到where條件里面。
- 空和非空:is null和is not null
- 在和不在:in和not in
- in 在......范圍內:where 字段 in('值1','值2')
- not in 不在......范圍內:where 字段 not in('值1','值2')
- between和not between
- 在什么范圍 -- 數值型,日期時間
- 語法: ....where 字段 between 值1 and 值2. 在什么范圍之內
-
語法: ....where 字段 not between 值1 and 值2. 不在什么范圍之內
- 通配符
- 下划線(_):匹配一個字符
- 百分號(%):匹配多個字符(包括沒有字符)
- 模糊查詢(like)
- ......where 字段 like '值'; 值一般使用通配符
- group by 分組: ......[where 條件] group by 字段
- select sex,group_concat(name) name from stu group by sex;通過分組顯示男的所有成員的姓名和女的所有成員的姓名,使用group_concat()函數將同一組的值連接起來
-
having條件:對查詢結果進行篩選
- where:查找的范圍是當前表中的字段
- having:查找的范圍是select后面的選項(即查詢結果)作為條件查找
- asc:升序,默認,從小到大,可省略不寫
- desc:降序,從大到小
- limit限制:...... limit 起始位置,個數; 如果開始位置為0,可以省略
- select * from stu order by age desc limit 3;首先降序
- limit m,n:從m開始向后取n條數據
- 從表中查詢的結果都是從0開始排序
4.數據庫操作
- 創建數據庫:creat database [if not exists] '數據庫名' charset=字符編碼;
- 數據庫名是關鍵字或特殊符號需要,一般不需要反引號
- if not exists,創建了一個已經存在的數據庫,此命令不報錯且不覆蓋
- 查看數據庫:show database;
- 數據的本質是文件夾
- 查看創建數據庫的sql語句:show creat database 數據庫名;
- 數據庫修改-修改字符集:alter database 數據庫名 charset-字符集;
- 刪除數據庫:drop database [if exists] '數據庫名';
- if exists刪除之前判斷一下,存在就刪除
5.表的操作
- 數據庫的選擇:use '數據庫名';
- 創建表:creat table 表名(字段列表) [values('','',,,)]
- creat table ceshi(id int);
- 表也是以文件的形式保存的
- 查看所有表:show tables;
- 查看創建表的sql語句:show creat table 表名[\G];
- 加上\G則不需要分號
- 查看表結構:desc 表名;
- desc即describe
- 修改表名:alter table 原表名 rename to 新表名;
- 修改表的字符集:alter table 表名 charset=新字符集;
- 修改字段屬性:alter table 表名 modify 字段名 新數據類型;
- 修改字段名稱和屬性:alter table 表名 change 原字段 新字段 新屬性;
- 表引擎修改:alter table 表名 engine=新引擎;
- mysql引擎分為:MyISAM:查詢的速度比較快; InnoDB:新的引擎,主要維護數據的安全。
- 刪除表:drop table [if exists] 表名;
- 刪除多個表:drop table 表1,表2,,,;
- 添加表字段:alter table 表名 add 字段名 數據類型;
- 刪除字段:alter table 表名 drop 字段;
- 修改字段:alter table 表名 change 字段名 新字段名 新數據類型;
6.數據操作
- 創建一個表:
creat table ceshi(
id int,
name varchar(20),
hobby varchar(10),
addr char(10)
);
- 插入1-n條數據:
insert into 表名(字段列表) values(字段列表1),(字段列表2),,,
-
- 值和字段一定一樣,他倆一致則再添加可以省略字段
- insert into ceshi(id,name,hobby,addr) values(1,'玉環','吃荔枝','唐朝');
- 查看表數據:select * from 表名 [where 條件];
- 漢字亂碼要給顯示框設置字符集:set names utf8;
- 更新數據:update 表名 set 字段1=值1,字段2=值2,,, where 條件;
- 刪除數據:delete from 表名 where 條件;
- 注意添加where條件,沒有條件則全表刪除
- 給字段(或者表)起別名:select id as '新id',name as '新名字,hobby as '新愛好',addr as '新地址' from ceshi;
- 去除重復的數據:select distinct name,hobby from ceshi;
7.子查詢
- 在一個select語句中,嵌入了另外一個select語句,那么被嵌入的select語句稱之為子查詢語句
- select * from stu where math>(select avg(math) from stu);
- ......where 字段=some || any || all(子查詢);
- some:一些,any:任何,all:所有
- some和any等同於in,not in可以寫成!=all
- ......where exists || not exists
- exists:存在,not exists:不存在
- ......where 字段=some || any || all(子查詢);
8.連表查詢
- 連接的作用:當查詢結果的列表來源於多張表時,需要將多張表連接一個大的數據集,再選擇合適的列返回
- 內連接查詢:查詢的結果為兩個表重疊部分匹配到的數據
- 左連接查詢:查詢的結果為兩個表匹配到的數據加左表特有的數據,對於右表中不存在的數據使用null填充
- 右鏈接查詢:查詢的結果為兩個表匹配到的數據加右表特有的數據,對於左表中不存在的數據使用null填充
- 內連接:select 選項 from 表1 inner join 表2 on 表1.相同字段=表2.相同字段;
- 左連接:select 選項 from 表1 left join 表2 on 表1.相同字段=表2.相同字段;
- 左表數據全部取出,右表只要符合條件的,沒有的用null
- 右連接:select 選項 from 表1 right join 表2 on 表1.相同字段=表2.相同字段;
- 右表數據全部取出,左表只要符合條件的數據,沒有的用null
- 兩張表中的字段名是一樣的可以簡寫成using形式
- select * from student right join scores using(studentno);
- 笛卡爾積:多表中數據排列組合,結果是字段連接,行數相乘,通過where條件,可以篩選出我們需要的數據
- select * from table1,table2 where 連接條件
9.事務
10.視圖view
11.函數
- select 函數名() from ...;
- 聚合函數:
- sum(expr): 求和
-
- avg(expr): 求平均數
- max(expr) 求最大值
- min(expr) 獲取最小
- 數值處理:rand()隨機數
- 隨機排序:select * from 表名 order by rand(); 隨機數:select rand()...
- 四舍五入round():select round()
- 字符處理:
- 左邊截取:left('字段',長度)
- 右邊截取:right('字段',長度)
- 查看字節長度:select length('字段') '字節長度';
- 查看字符長度:select char_length('字段') '字符長度';
- 字段拼接:select group_concat(字段) from 表名;
- 加密函數
- select md5(密碼);
- select password(密碼);
12.外鍵
二.工作中遇到的較復雜語句(postgresql)
1.with
- sql語句
WITH type as (select DISTINCT on(kbid) * from rptsvc_leak_event ORDER BY kbid,event_time desc) SELECT leak_type,count(*) FROM type GROUP BY leak_type
- 解釋
- 括號中的語句:select DISTINCT on(kbid) * from rptsvc_leak_event ORDER BY kbid,event_time desc,按照event_time降序、且對kbid去重后,返回所有內容。注意:order by之后一定要加kbid,不然報錯。
-
- with后用as 將括號中的sql語句賦值給type,即type是一個新表。
- 這整個with語句可以替換成:
SELECT leak_type,count(*) FROM (select DISTINCT on(kbid) * from rptsvc_leak_event ORDER BY kbid,event_time desc) as type GROUP BY leak_type,
同樣也要注意加as,不然語句不正確
2.row_number() over
- sql語句
select *, row_number() over(partition by gid,mid,kbid ORDER BY event_time desc ) from rptsvc_leak_event
- 解釋
- row_number() over(partition by gid,mid,kbid ORDER BY event_time desc ):先按照kib,gid,mid分組、且按照event_time降序排序,再為返回的內容每條給一個序號,每組的序號都是從1開始。
3.jsonb
- sql語句
select victim_ip from alarms where victim_ip @>'["203.208.41.46"]'::jsonb;
- 解釋
- 當某個字段是jsonb類型時,要查詢包含某內容的所有字段。