postgresql、mysql自己整理txt的一些小知識(持續更新)

自己隨便整理了一些數據庫git之類的一些小知識,持續更新中

原文件是記錄在txt中,可能有些不大好看

which python	#liunx
數據庫系統
	OLTP
		主要是業務操作數據庫,工作簡單只需要簡單的事務能力就行,用戶數量爲上千個,庫的大小也只有100MB-GB,但是時間要求很高,具有實時性
	
	OLAP
		主要是用於分析決策的數據倉庫,要求有複雜的查詢能力,用戶數量可以是上百萬個

數據語言:
	DML(Data Manipulation Language)語句
		DML使用範圍:
			是指對數據庫中 表 記錄的操作,主要包括表記錄的插入(insert)、更新(update)、刪除(delete)和查詢(select),是開發人員日常使用最頻繁的操作。

	DDL(Data Definition Language)數據定義語言:
		DDL適用範圍:
			對數據庫中的某些對象(例,database,table)進行管理,如Create,Alter和Drop

	DQL 數據庫查詢語句:
		DQL使用範圍:
			對數據庫進行查詢的操作,基本結構是select子句, from子句,where子句組成的查詢塊

	DCL 數據控制語言:
		DCL使用範圍:
			用來授予或者回收訪問數據庫的某種特權,並控制數據庫操縱事務發生的事件及效果,對數據庫實行監視等。如:
				GRANT					授權
				ROLLBACK [WORK] TO [SAVEPOINT]		回退到某一點
				COMMIT [WORK]				提交
					數據庫提交的三種類型:
						顯式提交			
							COMMIT
						隱式提交			
							用SQL命令間接完成的提交
							ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,
							DROP,EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME
						自動提交
							可以設置AUTOCOMMIT ON
其他  二進制用法
	1<<i 是將1左移i位,即第i位爲1,其餘位爲0;
	n&(1<<i)是將左移i位的1與n進行按位與,即爲保留n的第i位,其餘位置零


mysql
	一些注意點:
		定義變量只能在存儲過程中纔可以使用!!! 也就是只能在begin...end中纔可以使用,也成爲存儲過程變量。聲明變量是,先是變量,再是類型:
		例如:
		declare var_1,address varchar;
			declare var_3 varchar;
			declare var_2 int default 0;
			set var_1 = 'jay',var_2 = 3;
		也可以直接在外面賦值:set @var=1;  作用域是整個會話,也稱爲用戶變量
	
	基本操作
		IF NOT EXISTS
		如果沒有就創建這張表

	存儲過程
		錯誤捕獲
	
	函數:
		round()
			如果傳入一個參數,就把傳入的參數四捨五入,保留至整數			例如:round(1.4)		return	1
			如果傳入兩個參數,第一個參數是你要處理的參數,第二個參數是保留第幾位數	例如:round(91.335,-1)	return	90
	
		rand()
			隨機數,0<rand()<1
	
	查詢緩存:
	    查詢緩存可以看作是sql文本和查詢結果的映射。適合有大量相同查詢的應用,不適合有大量數據更新的應用。

		可以通過這條命令來查看緩存相關參數:
			SHOW VARIABLES LIKE '%query_cache%';
			其中有個字段  query_cache_type  ,這個字段有012這三個類型,0是不使用查詢緩存,1是始終使用查詢緩存,2是按需使用查詢緩存
				如果是1但又不想使用緩存,就使用:SELECT SQL_NO_CACHE * FROM my_table WHERE condition;
				如果是2,但要使用緩存,就要使用sql_cache開關參數:SELECT SQL_CACHE * FROM my_table WHERE condition;

			至於還有query_cache_size這個字段,默認狀態下是0,表示查詢緩存預留的內存爲0,也就無法使用查詢緩存。於是我們需要設置query_cache_size的值:
				SET GLOBAL query_cache_size = 134217728;
				注意這個size值不能太小,如你要是設置爲4000,那麼你可以用: show warnings 來查看到下面的結果:
					level	code	message
					warning	1292	truncated incorrect query_cache_size value '4000'
					warning	1282	query cache failed to set size 3072,new query cache size is 0
		緩存條件:
			如果第二次查詢的sql和第一次查詢的sql完全相同(一個標點都沒錯的那種),且開啓了查詢緩存,那麼第二次查詢就直接從查詢緩存中取結果
				可以通過這個命令查看緩存命中的次數(是一個累加值):
					SHOW STATUS LIKE 'Qcache_hits';
					而且即使是完全相同的sql,如果使用不用的字符集、不同的協議等也會被認爲是不同的查詢而分別進行緩存。
		緩存數據失效時機:
			當表的結構或者數據發生改變時,查詢緩存中的數據不再有效。比如insert、update、delete、truncate、alter table、drop table或者drop database
			會導致緩存數據失效。所以查詢緩存適合有大量相同查詢的應用,不適合有大量數據更新的應用。
		清理緩存:
			1FLUSH QUERY CACHE; // 清理查詢緩存內存碎片。
			2RESET QUERY CACHE; // 從查詢緩存中移出所有查詢。
			3FLUSH TABLES; //關閉所有打開的表,同時該操作將會清空查詢緩存中的內容。

	索引:	鏈接:https://www.2cto.com/database/201805/743736.html
		alter table 'table_name' add index 'index_name' (column list);

		通過‘show index from table_name’來查看該表的索引信息
		基本信息
		Table: sc_users		#表名
 		Non_unique: 0		#該索引能不能包括重複值,可以則爲1,不能爲0
   		Key_name: phone		#索引的名稱
		Seq_in_index: 1		#索引中的序列號,從1開始
		Column_name: phone	#列名稱
   		Collation: A		#有值‘A’(升序)  或者NULL (無分類)
 		Cardinality: 3		#索引中唯一值數目的估計值,通過運行ANALYZE TABLE或者myisamchk-a
    		Sub_part: NULL		#如果是部分列被編入索引,值就是被編入索引的字符的數目;如果整列被編入索引,就爲NULL值
      		Packed: NULL		#指關鍵字如何被壓縮,如果沒有被壓縮就是NULL
        		Null:			#如果含有NULL值,就是YES;如果沒有NULL值,就爲NO
  		Index_type: BTREE		#用過的索引方法(BTREE、FULLTEXT、HASH、RTREE)
     		Comment:		#Index_comment評註
	

	分區:
		show variables like "%part%";
			使用這個來查看數據庫是否支持分區

	修復:鏈接:	https://www.iteye.com/blog/dinglin-1791922
		analyze table (table_name)
			用於修復索引的預估索引值	(如果設置了binlog,會把值保存到binlog中)(也可以通過analyze local table 來取消保存到binlog)
			(大部分索引不生效可能就是這個原因,可以通過查看索引中的Cardinality字段來查看估計值)
	
		checksum table (table_name)	
			數據校驗值,可以校驗數據是否一致

		optimize table (table_name)	對MYISALM和InnoDB類型的表都有效
			整理數據庫碎片,保證數據庫效率,建議定時運行該字段
			(和analyze table一樣,默認會把值保存到binlog中,可以在optimize 和 table中添加一個local來取消保存)
		
		check table (table_name)  鏈接:http://www.360doc.com/content/13/0617/14/9437165_293479800.shtml
			數據庫經常可能遇到錯誤,譬如數據寫入磁盤時發生錯誤,或是索引沒有同步更新,或是數據庫未關閉MySQL就停止了。
			遇到這些情況,數據就可能發生錯誤:
			Incorrect key file for table: ' '. Try to repair it.
			此時,我們可以使用Check Table語句來檢查表及其對應的索引。
			
			check table sc_users;
			返回:
				+---------------------+-------+----------+----------+
				| Table              	 | Op     | Msg_type | Msg_text |
				+---------------------+-------+----------+----------+
				| flask_test.sc_users	 | check | status       | OK          |
				+---------------------+-------+----------+----------+	
			
				像我這個是代表正確的
			當他檢查出錯誤之後,會把表標記爲“corrupted”,並不能使用,直到修復爲止,
			當你的表被標記爲“corrupted”之後,check table是不會找出表中的問題,在種情況下,他會把表標記爲 良好

			每當你運行之後,mysql會保存最近一次檢查時間,每次運行check table都會存儲這些信息:
				執行
				SELECT    TABLE_NAME, CHECK_TIME
				FROM      INFORMATION_SCHEMA.TABLES
				WHERE     TABLE_NAME = 'PLAYERS'	/*PLAYERS是表名*/
				AND       TABLE_SCHEMA = 'TENNIS';  	/*TENNIS是數據庫名*/

				結果是

				TABLE_NAME   CHECK_TIME
*				----------   -------------------
				PLAYERS     	NULL		(我也不知道爲什麼,示例中是有值的 2006-08-21 16:44:25Check Table還可以指定其它選項: 	例如:check table quick;
				UPGRADE:用來測試在更早版本的MySQL中建立的表是否與當前版本兼容。
				QUICK:速度最快的選項,在檢查各列的數據時,不會檢查鏈接(link)的正確與否,如果沒有遇到什麼問題,可以使用這個選項。
				FAST:只檢查表是否正常關閉,如果在系統掉電之後沒有遇到嚴重問題,可以使用這個選項。
				CHANGED:只檢查上次檢查時間之後更新的數據。
				MEDIUM:默認的選項,會檢查索引文件和數據文件之間的鏈接正確性。
				EXTENDED:最慢的選項,會進行全面的檢查。
			
		repair table
			用於修復表,只對MYISAM和ARCHIVE類型的表有效。
			這條語句同樣也可以指定選項:
				QUICK:最快的選項,只修復索引樹。
				EXTENDED:最慢的選項,需要逐行重建索引。
				USE_FRM:只有當MYI文件丟失時才使用這個選項,全面重建整個索引。
			與analyze table一樣,也可以通過 repair local table 來取消寫入binlog
	
	記錄日誌:
		binlog:	鏈接:https://www.cnblogs.com/dadonggg/p/8617826.html
		主要的作用時用於數據庫的主從複製即數據的增量恢復
			    是一個二進制格式的文件,用於記錄用戶對數據庫更新的sql語句信息,例如更改數據庫表和更改內容的sql語句都會記錄到binlog中,但是查詢不會記錄;
			默認情況下binlog日誌是一個二進制格式的,不能使用查看文本工具的命令(比如,cat,vi等)查看,而使用mysqlbinlog解析查看
			    當數據寫入到數據庫時,還會同時把更新的sql語句寫入到對應的binlog文件中。使用mysqldump備份時,只是對一段時間的數據進行全備,
			但是如果備份後突然發現數據庫服務器故障,這個時候就可以用到binlog的日誌了
	
	數據庫分區:	鏈接:http://blog.51yip.com/mysql/1013.html
		pass(要看postgresql,暫時沒時間看mysql,有時間再補)
		優點:
			1,分區可以分在多個磁盤,存儲更大一點
			2,根據查找條件,也就是where後面的條件,查找只查找相應的分區不用全部查找了
			3,進行大數據搜索時可以進行並行處理。
			4,跨多個磁盤來分散數據查詢,來獲得更大的查詢吞吐量

sql注入必會的知識:
	https://www.cnblogs.com/KevinGeorge/p/8446874.html

postgresql	    鏈接:https://www.ximalaya.com/keji/17008073/148467863 是postgresql簡介目錄
	whoosh_index這個方法來初始化全文索引,爲了保持數據庫和全文檢索引擎的同步,在數據庫中刪除所有已經存在的數據,然後重新開始。
    切記:除了json字段中必須要用 " " 雙引號之外,一般最好都要用 ' ' 單引號!!

	一些注意點:
		where裏頭的條件列只能使用表別名.<真實列>	
		缺省  就是  默認的意思,例:缺省位置 --> 默認位置

	進入:
		windows:
			windows可以設置環境變量:
				PGHOST = localhost
				PGPORT = 5432
				PGUSER = postgres
			之後就可以直接通過命令行:
				psql
				進入postgresql了

		linux:
			先連接上用戶postgres
			su - postgres
			psql -U postgres
			進入postgresql

			如果時要遠程連接還需要配置:
				vi /var/lib/pgsql/12/data/postgresql.conf
					在59行取消註釋,更改爲 listen_addresses = '*'395行,添加:	log_line_prefix = '%t %u %d'

	導入一個數據庫數據:
		psql -U username databasename < C:\Users\wuhaogongsi\Desktop\test_git/data.sql 
			用戶名          數據庫名

	查看基礎信息:(數據太多查詢結果出現 -- More -- 時,按q、g是退出,p、s是行數,空格時快速查看28行數據)
		select typname,typlen from pg_type where typname ~ '^timestamp';
			查看 pg_type表中typname列中以 'timestamp'開頭的所有結果
			pg_type表是用來查看所有數據類型的屬性,typlen列是該數據類型的佔用大小

		show time zone;
			查看庫的時區位置
		select now();
			查看庫的當前時間,
		select now() at time zone 'Asia/Shanghai';
			查看 '上海' 時區的當前時間
		set time zone 'PRC';
			修改庫的時區爲 'PRC'
		select * from pg_timezone_names;
			pg_timezone_names表中包含了所有可用的時區
		\echo :AUTOCOMMIT
			查看是否開啓自動提交功能,也就是說是否開啓在執行插入、修改、刪除語句執行後,是否自動提交
			切記,一定要大寫
		create_time.strftime()
			psql時間轉換
	數據類型:
		smallint		2 字節	小範圍整數	-32768+32767
		integer		4字節	常用整數		正負21億 即 -21474836482147483647
		bigint  		8字節	大範圍整數	-92233720368547758089223372036954775807
		numeric		變量	用戶指定的精度,精確	小數點前最多爲131072個數字; 小數點後最多爲16383個數字。	(一般用於取小數點後幾位,也可以設置-n,例如-1表示保留十位),一般用法: insert into test select 2,round(100*random()::numeric,-1) from generate_series(1,1);
		real		4 字節	可變精度,不精確	6 位十進制數字精度
		double precision	8 字節	可變精度,不精確	15 位十進制數字精度
		smallserial		2 字節	自增的小範圍整數	132767
		serial		4 字節	自增整數		12147483647
			*注意如果直接設置serial8 , 也就相當於是 bigserial
		bigserial		8 字節	自增的大範圍整數	19223372036854775807

		money		8字節	貨幣金額		-92233720368547758.08+92233720368547758.07

		character		變長,有長度限制
		varying(n)		變長,有長度限制
		varchar(n)		變長,有長度限制
		character(n)	f定長,不足補空白
		char(n)		f定長,不足補空白
		text		變長,無長度限制

		timestamp	日期和時間,不帶時區的時間戳		例如:2016-06-22 19:10:25
		timestamptz	日期和時間,帶時區的時間戳		例如:2016-06-22 22:10:25-04
		date		只用於日期			例如:2016-06-22	  若輸入 2016-06-22 19:10:25-07,雖然也可以保存,但是隻保存2016-06-22
		time		只用於一日內時間			例如:19:10:25
		timetz		只用於一日內時間,帶時區		例如:19:10:25-07
		interval		時間間隔	        正負178000000年	例如:'1y 2mon 3d 100' 或者 '1 year 2 months 3 days 4 hours 5 minutes 6 seconds'

		boolean		布爾類型				例如:'true' 或者 'false' 或者 null

		枚舉類型
			create type mood as enum ('sad','ok','happy');
			自定義的枚舉類型,比如上面這個設置後,可以創建的字段類型直接寫 mood ,設置後該字段只能是 'sad''ok''happy'

		幾何類型	(常用於地理位置)
			point		16字節	平面中的點(其他類型的基礎)	(x,y)
			line	32 字節	(無窮)直線(未完全實現)	((x1,y1),(x2,y2))
			lseg	32 字節	(有限)線段	((x1,y1),(x2,y2))
			box	32 字節	矩形	((x1,y1),(x2,y2))
			path	16+16n 字節	閉合路徑(與多邊形類似)	((x1,y1),...)
			path	16+16n 字節	開放路徑	[(x1,y1),...]
			polygon	40+16n 字節	多邊形(與閉合路徑相似)	((x1,y1),...)
			circle	24 字節	圓	<(x,y),r> (圓心和半徑)

		網絡地址類型(用這些數據類型存儲網絡地址比用純文本類型好, 因爲這些類型提供輸入錯誤檢查和特殊的操作和功能。)
		(在對 inet 或 cidr 數據類型進行排序的時候, IPv4 地址總是排在 IPv6 地址前面,包括那些封裝或者是映射在 IPv6 地址裏的 IPv4 地址, 比如 ::10.2.3.4::ffff:10.4.3.2。)
			cidr	719 字節	IPv4 或 IPv6 網絡
			inet	719 字節	IPv4 或 IPv6 主機和網絡
			macaddr	6 字節		MAC 地址

		位串類型	(位掩碼-->https://www.jianshu.com/p/4e73512c03b8)
			位串就是一串 10 的字符串。它們可以用於存儲和直觀化位掩碼。 我們有兩種 SQL 位類型:bit(n) 和bit varying(n), 這裏的n是一個正整數。
			bit 類型的數據必須準確匹配長度 n, 試圖存儲短些或者長一些的數據都是錯誤的。bit varying 類型數據是最長 n 的變長類型;更長的串會被拒絕。 
			寫一個沒有長度的bit 等效於 bit(1), 沒有長度的 bit varying 意思是沒有長度限制。

		全文檢索,即通過自然語言文檔的集合來找到那些匹配一個查詢的檢索
			tsvector		tsvector 的值是一個無重複值的 lexemes 排序列表, 即一些同一個詞的不同變種的標準化。
			tsquery		tsquery 存儲用於檢索的詞彙,並且使用布爾操作符 &(and)|(or)!(not) 來組合他們,括號用來強調操作符的分組。

		UUID類型
			uuid		例子:a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11

 		json類型 參考:https://www.cnblogs.com/zhangfx01/p/9506219.html
			json		適合存儲,存儲快,但是查詢慢
			jsonb		適合檢索,存儲慢,但是查詢快,還支持許多額外的操作符
			對比:
				不能搞錯這個返回的類型,例如:
					我先定義了'data'字段爲json類型
					notes=# insert into aa(data) select(select '[1,2,3]'::jsonb ->>2);
					錯誤:  字段 "data" 的類型爲 json, 但表達式的類型爲 text
						至於這第二個‘select‘ 可加可不加
					notes=# insert into aa(data) select('[1,2,3]'::jsonb ->2);
					INSERT 0 1
					
				json和jsonb共同使用的操作符
					操作符	*返回類型		數組[1,2,3] as data		{"a":1,"b":2,"c":3} as data		{"a":{"b":{"c":1}},{"d":[4,5,6]} as data
					->	json		select 'data'::jsonb->2 ==3	select 'data'::jsonb->'a' ==1		select 'data'::jsonb ->'a' == {"b":{"c":1}}
					->>	text		select 'data'::jsonb->>2 ==3	select 'data'::jsonb->>'a' ==1		select 'data'::jsonb ->>'a' == {"b":{"c":1}}
					#>	json									select 'data'::jsonb #> '{a,b}' ={"c": 1}			
					#>>	text									select 'data'::jsonb #>> '{a,b}' ={"c": 1}
					注意:
						拿 #> 查詢,必須要用 '{}' 這個維度信息包起來
				jsonb額外操作符
					操作符	*返回類型			描述					例子						返回值
					@>	t(True)/f(False)	左邊的json值中是否包含右邊json				select '{"a":1,"b":{"c":2,"d":3}}'::jsonb @> '{"b":{"c":2}}'::jsonb;	t
					<@	t(True)/f(False)		和@>相反					pass
					?	t(True)/f(False)	判斷右邊的值是否是左邊的鍵之一			select '{"a":1,"b":2}'::jsonb ? 'b'; 			t
					?|	t(True)/f(False)	判斷右邊array[]中任何一個是否是左邊的鍵			select '{"a":1,"b":2}'::jsonb ?| array['c','b'];			t
					?&	t(True)/f(False)	判斷右邊array[]中是否都是左邊的鍵			select '{"a":1,"b":2}'::jsonb ?& array['b','a'];			t
					||	jsonb		把左邊和右邊的jsonb聯繫起來,如果右邊是已有的數據,就會覆蓋	select '{"a":1,"b":2}'::jsonb || '{"b":3,"c":4}'::jsonb, 
														'{"a":1,"b":2}'::jsonb || '{"b":3,"c":4}'::jsonb;			[{"a": 1, "b": 2}, "b", "c"],{"a": 1, "b": 3, "c": 4}
					-	jsonb		如果右邊是字符串類型,左邊就刪除右邊的鍵		select '{"a":1,"b":2}'::jsonb - 'c';	      (不存在不報錯)		{"a": 1, "b": 2}
					-	jsonb (同上刪除操作)	如果右邊是int類型,左邊就刪除右邊的下標,右邊要不是列表就報錯	select '[1,2,3,4]'::jsonb - 1;				[1, 34]
					#-	jsonb		右邊是字符串 套 一個字典,根據右邊內容刪除左邊鍵值		select '{"a":{"b":1,"c":{"d":1}}}'::jsonb #- '{a,b}';		{"a": {"c": {"d": 1}}}
													select '["a",{"b":1,"c":{"d":1}}]'::jsonb #- '{1,c,d}';		["a", {"b": 1, "c": {}}]

		XML類型 
			可以用於存儲XML數據
			(使用該類型,在編譯時必須使用 configure --with-libxml)
			
			創建XML值:
				可以使用xmlparse()	來從字符串中產生xml類型的值,例如:
					XMLPARSE (DOCUMENT '<?xml version="1.0"?><book><title>Manual</title><chapter>...</chapter></book>')
					XMLPARSE (CONTENT 'abc<foo>bar</foo><bar>foo</bar>')		

		數組類型:
			PostgreSQL 允許將字段定義成變長的多維數組。
			數組類型可以是任何基本類型或用戶定義類型,枚舉類型或複合類型。
			插入時使用大括號 {},元素在{}使用逗號隔開,例如:
				INSERT INTO sal_emp
    				VALUES ('Bill',
    				'{10000, 10000, 10000, 10000}',
   				'{{"meeting", "lunch"}, {"training", "presentation"}}');
			
			數組操作:
				操作符		描述				示例			結果
				=		相等		SELECT ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3];	t
				<>		不等於		select ARRAY[1,2,3] <> ARRAY[1,2,4];		t
				<		小於		select ARRAY[1,2,3] < ARRAY[1,2,4];		t
				>		大於		select ARRAY[1,4,3] > ARRAY[1,2,4];		t
				<=		小於等於		select ARRAY[1,2,3] <= ARRAY[1,2,4];		t
				>=		大於等於		select ARRAY[1,4,3] >= ARRAY[1,2,4];		t
				@>		包含(完全包含)	select ARRAY[1,2,3] @> ARRAY[1,2];		t
				<@		包含於		pass	(同上,不過左右反過來寫)
				&&		重疊(是否有相同元素)	select ARRAY[1,4,3] && ARRAY[2,1];		t
				||		數組與數組	select ARRAY[1,2,3] || ARRAY[4,5,6];		{1,2,3,4,5,6}
				||		一維與二維數組	select ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]];	{{1,2,3},{4,5,6},{7,8,9}}
				||		元素與數組連接	select 3 || ARRAY[4,5,6];			{3,4,5,6}
				||		數組與元素連接	select ARRAY[4,5,6] || 7;			{4,5,6,7}
				

	操作:https://www.runoob.com/postgresql/postgresql-syntax.html	雜七雜八的都在這個網址裏面
		\l
			展示所有庫
	
		\c 數據庫名
			進入該數據庫

		\c - 用戶名
			切換成該用戶
		
		\di
			列出所有索引

		\d+
			列出所有表的歸屬大小信息

		\dt+
			列出所有主表的歸屬大小信息

		\d
			列出所有表
		
		\d tablename
			列出該表的結構

		\dx
			查看已安裝的擴展
		
	測試:
		explain
			在執行操作之前加上explain之後,可以查看執行這條操作之後的執行計劃,但並不執行

		explain analyze
			在執行操作之前加上explain analyze之後,可以查看執行這條操作之後的執行計劃,且執行該操作
			*如果是DML操作(drop、select、create、insert into),需要在執行前開啓事務,然後查看執行,最後回滾
				例如:
					postgres=# begin;
					postgres=# explain analyze xxxxxxxxx;
					postgres=# rollback;
			例如
				EXPLAIN ANALYZE SELECT *
				FROM tenk1 t1, tenk2 t2
				WHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2 ORDER BY t1.fivethous;
				
				第一條數據:
				Bitmap Index Scan on tenk1_unique1  (cost=0.00..5.04 rows=101 width=0) (actual time=0.049..0.049 rows=100 loops=1)
     				 Index Cond: (unique1 < 100)
					cost表示的是預測時間,actual time是實際時間,loops是循環的次數
					planning time:計劃時間,Execution time:執行時間
				
	操作符:
		::		轉換類型,例如:	'1'::int	轉換成int類型
		||		連接符,例如 :    select 7||'m'; 	結果就是	7m
				
				

	函數:
		trunc()
			用於取整

		random()
			用於產生隨機數,0<random()<1
		
		uuid_generate_v4()
			用於產生隨機uuid,但是返回出來的值是有 "-",例如:49d8ae43-8014-415b-ae8e-81e063db30bb,所以推薦搭配replace(uuid_generate_v4()::varchar,'-','')使用,出來的結果是32位字符串,例如:93dd39775e014b7b8734a2c25d7adaaa
			(postgresql沒有uuid_generate_v4這個函數,使用前需要執行:create extension "uuid-ossp",不過這個只是作用與當前數據庫,可以參考鏈接:https://blog.csdn.net/duanbiren123/article/details/81274724)
			上面是創建類型爲varchar(32)的前提下,你也可以直接設置爲字段類型爲uuid,就可以直接傳入uuid_generate_v4()數據
			
		generate_series(num1,num2)
			該函數可以遍歷執行從num1到num2的數,例如:
				insert into table_name
				select r ,r||'_tans' from generate_series(1,2000000)r
					導入了200萬條數據,例如其中的一個數據是:
					id	name
					1	1_tans
					2	2_tans

		xmlparse()
			用於從字符串中提取XML值,例如:
				XMLPARSE (DOCUMENT '<?xml version="1.0"?><book><title>Manual</title><chapter>...</chapter></book>')
				XMLPARSE (CONTENT 'abc<foo>bar</foo><bar>foo</bar>')

		array_agg()
			用於當你查詢數據不只是一條是,會把你查詢出來的數據都放進一個數組裏面返回給你,不過如果是數組類型,就必須要是相同維度的數組才行
			例如:
				select array_agg(phone) from sal_emp;
				返回值爲:
					{{1000,1000},{1000,1000},{1000,1000}}				
		regexp_match()	從第一位開始匹配
			用於正則匹配,例如:
				select regexp_match('123-123','(\d+)-(\d+)')
				返回出來的結果是:
					{123,123}		#注意如果要查詢出來這裏第一條數據,就要使用嵌套查詢select (select regexp_match('123-123','(\d+)-(\d+)'))[1];
								第二個select可以不寫,例如:select (regexp_match('123-123','(\d+)-(\d+)'))[1];
		pgstattuple()	統計表或者索引的詳細空間佔用情況
			首先 create extension pgstattuple
			select * from pgstattuple( '表名或者索引名' )
			其中的字段解釋:
				字段              	類型            描述
				table_len           	bigint       物理關係長度,以字節計
				tuple_count         	bigint       活的元組的數量
				tuple_len           	bigint       活的元組的總長度,以字節計
				tuple_percent       	float8       活的元組的百分比
				dead_tuple_count    	bigint       死的元組的數量
				dead_tuple_len      	bigint       死的元組的總長度,以字節計
				dead_tuple_percent  	float8       死的元組的百分比
				free_space          	bigint       空閒空間總量,以字節計
				free_percent        	float8       空閒空間的百分比

			**注意,表長度(table_len)總是大於 活的元組的總長度(tuple_len),死元組的總長度(dead_tuple_len)和空閒空間總量(free_space)的總和,這是由
				固定的頁面開銷、指向元組的每頁指針表和確保元組正確對齊的填充來解釋的。

		pg_relation_size()	用來統計表的大小,不過傳入的參數可以是 oid 也可以是 表名
			例如:
				select pg_relation_size(16615)
				結果是:
					 pg_relation_size
					------------------
						       0

		to_tsvector( )	用來


		數組方法函數:
			array_append(array,元素)
				把元素添加進數組中,例如:
					SELECT array_append(ARRAY[1,2], 3);   
						結果:	{1,2,3}

	查看所有的存儲過程:
		select * from pg_proc;

	查看指定的存儲過程:
		select proname,prosrc from pg_proc where proname = 'function_name';

	保留一位小數:
		select round(random()::numeric,1);
		這裏的random()就相當於你傳入要保留一位小數的值

	修改一組數據:
		update 表名 set 字段=修改後的字段 where 指定修改的列
		例如:
			update test_jsonb set j_jsonb = j_jsonb || {"a":1}::jsonb where j_jsonb@>'{"b":2}'::jsonb
				給j_jsonb字段添加{"a":1}
	僅刪除該表所有數據:
		truncate table tablename
	
	給表重命名:
		alter table 原表名 rename to 修改的表名;

	刪除字段:
		alter table 表名 drop column 字段名;

	修改表中的某行某列的數據:
		update 表名 set 目標字段名=目標值 where 該行特徵;
		
	模糊查詢:
			一般:
			select * from 表名 where 字段 like ('%' || '關鍵字' || '%');
			或者:
			select * from 表名 where 字段 ~* '關鍵字';
		最佳:(據說可以在關鍵字內輸入任何特殊符號,都可以正常查詢 !!)
		SELECT * FROM 表名 WHERE 字段 ILIKE regexp_replace(concat('%','關鍵字','%'),'\\','\\\','g')

	取多條參數:
		select * from 表名 limit param1;			param1代表你要傳的條數
		select * from 表名 limit param1 offset param2;(param2+1) 條數據開始,取param1條參數

	生成隨機漢字:
		現附上鍊接: https://blog.csdn.net/weixin_34260991/article/details/90585081	

	
	查看統計表佔用空間:
		一、查找pg_class
			select relpages as 佔用空間,reltuples 記錄數 from pg_class where relname=表名;

		二、使用psql命令
			\dt+ 表名

		三、使用pgstattuple擴展
			select * from pgstattuple(表名);

	緩存: 鏈接:https://my.oschina.net/swuly302/blog/146529#OSC_h3_1 以及 https://www.cnblogs.com/linguoguo/p/10896235.html 再或者簡潔一些的:https://blog.csdn.net/liufeng1980423/article/details/102780810
		可以通過以下步驟查詢postgresql數據緩存情況
			1、創建pg_buffercache
		


	物理儲存:鏈接: http://rachbelaid.com/introduction-to-postgres-physical-storage/
		數據庫集羣使用的數據文件存儲在集羣的數據目錄中,該目錄通常稱爲PGDATA(在可用於定義它的環境變量的名稱之後)。PGDATA在您的操作系統或者安裝中可能具有不同的位置

		簡單得說,對於集羣得每一個數據庫,都是對應一個 PGDATA/base 的子目錄,子目錄的名字就是該數據庫在 pg_database 的oid。這個子目錄是該數據庫文件的缺省位置(也就是默認位置);
			特別值得一提的是,該數據庫的系統表存儲在此。每個表和索引都存儲在獨立的文件裏,以該表或者該索引的 filenode 號命名,該號碼可以在pg_class . relfilenode中找到	
				注意,雖然一個表的 filenode 通常和它的oid相同,但是實際上並不一定是這樣;有些操作比如 truncate,reindex,cluster以及一些特殊的alter table形式,
					都可以改變 filenode 而同時保留oid不變,所以不能斷言 filenode 和表oid就一定相同。

		數據庫儲存:
			對於集羣中的每一個數據庫,其中都有一個子目錄 PGDATA/base ,命令行的話是在pg_database中,每個數據庫都有對應的oid。此目錄是數據庫文件的默認位置。
			庫的oid查詢:
				如果要列出集羣中每個數據庫的oid,可以運行以下的查詢:(如果要找對應的數據庫,可以使用where datname= 'XXX'select oid,datname from pg_database;
					結果是:
						    oid  |  datname
						-------+-----------
 						 13012 | postgres
     						        1 | template1
						 13011 | template0
						 16395 | test_pg
						 16445 | notes
						(5 行記錄)
				也可以在cmd中執行:
					oid2name
					結果是:
						All databases:
						  Oid  Database Name  Tablespace
						----------------------------------
						  16445            notes       pg_default
						  13012        postgres      pg_default
						  13011      template0      pg_default
						      1          template1     pg_default
						  16395           test_pg      pg_default
		
		表儲存:
			每個表都存儲在一個單獨的文件中。對於普通關係,這些文件以表或索引的文件節點號命名,可以
				relfilenode在表的列中找到pg_class。pg_class是存在於pg_catalog架構中的系統表
			當表超過1GB是,它將被分成千兆字節大小的段,第一段的文件名和filenode相同,隨後的段分別命名爲filenode.1,filenode.2等。這種安排可以避免在文件大小受限制的平臺上出現問題。

			表的oid查詢:
				你可以直接通過數據庫來查詢到他的存儲的整個路徑:
					select pg_relation_filepath('表名');
					結果是:
						 pg_relation_filepath
						----------------------
						 base/16445/16486
						(1 行記錄)

				如果你只是想獲取表的oid,可以直接在cmd中操作:
					oid2name -d 庫名 -t 表名
					結果是:
						From database "notes":
						  Filenode  Table Name
						----------------------
						     16486          aa
		系統表:
			當你創建數據庫時,除了public(公衆的)和用戶創建的模式外,每個數據庫還包含一個 pg_catalog 模式,該模式包含系統表以及所有內置數據類型、函數和運算符。
				pg_catalog(catalog : 目錄) 總是有效的成爲搜索路徑的一部分,因此在查詢系統表時不需要使用前綴。
			 
			列出所有系統表的列表:
				\dt pg_catalog.*
				結果一部分是:
					    架構模式  |          名稱           |  類型    |  擁有者
					 ------------+--------------- ---+--------+----------
					 pg_catalog | pg_aggregate      | 數據表  | postgres
					 pg_catalog | pg_am                 | 數據表  | postgres
					 pg_catalog | pg_amop             | 數據表  | postgres
					-- More --

			pg_stat_activity :  鏈接: https://blog.csdn.net/luojinbai/article/details/44586917
				該表時一個系統視圖,每一行都表示一個系統進程,顯示與當前會話的活動進程的一些信息,比如當前會話的狀態和查詢等
				該表的所有字段可以去鏈接中查看,說說重要的字段
					state :
						該字段有六個狀態:
							active			活動的,後端執行查詢
							idle			空閒的,後端正在等待新的客戶端命令
							idle in transaction		事務中空閒,後端處於事務中,但當前未執行查詢
							id in transaction (aborted)	事務中空閒(終止),與事務中的空閒類似,但事務中的某個語句(聲明)導致錯誤
							fastpath function call	fast path函數調用,後端正在執行一個fastpath函數
							disabled			禁用,如果在此後端禁用了跟蹤活動,則會報告此狀態( This state is reported iftrack_activities is disabled in this backend )
				

		行的存儲方式:
			每個表都存儲爲固定大小(通常爲8kb)的頁面數組。在一個表中,所有頁面在邏輯上都是等效的,因此特定項目 () 可以存儲在任何頁面)
			用於存儲表的結構是一個堆文件。堆文件是可變大小的無序記錄的列表。堆文件的結構爲頁面(或塊)的集合,每一個頁面包含項的集合。術語項是指存儲在頁面上的一行。
			
			頁面結構圖:
				http://rachbelaid.com/assets/posts/heap_file_page.png
				
			它包含一些我們不打算介紹的標頭,但是它們提供有關校驗和,可用空間的開始,可用空間的結束等信息。鏢頭後的項目是由 (偏移,長度) 對組成的數組標識符,指向實際項目。
			因爲項目標識符知道被釋放才被移動,所以即使項目本身在頁面上四處移動以壓縮可用空間,它的索引也可以長期用於引用項目。一個項目的指針稱爲CTID (ItemPointer),由PostgreSQL創建,它由頁碼和項目標識符的索引組成。
			
			項目本身存儲在從未分配空間的末尾的空間中,糉子,一個頁面裏面的指針行被存儲在開始 , 元組()被存儲在頁的末尾。
			你可以通過添加 ctid 選定的列來訪問行的CTID:
				select ctid,* from 表名;
				結果是:
					    ctid  | id |       data
					-------+----+-------------------
					    (0,1) |  1 | {"keys":"values"}
					    (0,2) |  2 | 3
					    (0,3) |  3 | 3
					    (3 行記錄)
 
		限制:
			根據About PostgreSQL,最大列數在2501600之間,具體取決於列類型。列類型會影響他,是因爲在Postgresql中,行的寬度最多爲8kb(一頁),它們不能跨越頁面。
			但是這並不意味着列的值限制爲8kb,根據類型的不同,列中可能有較大的值,因爲postgresql具有成爲TOAST的機制,可以處理該問題。可以容納多少列,取決於所使用的數據類型的寬度。即使指向TOAST屬性的指針仍然需要一些字節。
			(我感覺 ,總的來說就是你設置列的時候,如果是定長的屬性,那麼列的大小就是那個屬性,如果你設置的是不定長的屬性,那麼當你儲存的數據大約是 2kb 之後,就會使用到postgresql的TOAST機制,即把數據分攤給TOAST表,來給你分配這個列的大小。)

		超大屬性存儲技術: 鏈接:http://www.postgres.cn/docs/9.4/storage-toast.html  ,https://my.oschina.net/Kenyon/blog/113026
			TOAST
							


		pg_class:
			這個表記錄這postgresql幾乎所有字段或者那些類似表的東西。包括索引 (索引還有它對應的pg_index) ,序列,試圖,符合類型和一些特殊關係類型;
			裏面的字段是:
					(
						relation :相當於表的意思 ,
						tuple 或者 item :相當於行的意思,
						filenode :是一個ID,代表對錶或索引的引用,
						block 和 page 等於,它們表示存儲表的文件的8kb段信息,
						heap 參考 heap file 。堆文件是可變大小的無序記錄的列表。儘管堆文件名相似,但堆文件與對數據結構不同,
						CTID :表示表中行版本的物理位置。CTID也是特殊的列,可用於每個表,但除非特別說明,否則不可見。它由頁碼和項目標識符的索引組成,
						oid :代表對象標識符,
						database cluster :我們稱數據庫集羣爲磁盤上的存儲區域。數據庫集羣是由運行中的數據庫服務器的單個實例管理的數據庫的集合,
						vaccum :PostgreSQL數據庫需要定期維護,即所謂的清理,
					)
				名稱		類型		參考		描述		
				oid		oid				行標識符(隱藏屬性;必須明確選擇)
				relname		name				表格,索引,視圖等的名稱
				relnamespace	oid		pg_namespace.oid	包含此relation的名稱空間的oid
				reltype		oid		pg_type .oid	與此錶行類型對應的數據類型的oid(如果有的話)(對於沒有pg_type條目的索引,爲零 )
				reloftype		oid		pg_type .oid	對於類型表,基礎複合類型的oid,對於所有其他relation爲零
				relowner		oid		pg_authid.oid	relation的所有者
				relam		oid		pg_am.oid		如果這是一個索引,則使用的訪問方法(B-樹,散列等)
				relfilenode	oid				該relation的磁盤文件的名稱; 零表示這是一個“映射”relation,其磁盤文件名由低級狀態決定
				reltablespace	oid		pg_tablespace.oid	存儲該relation的表空間。如果爲零,則隱含數據庫的默認表空間。(如果relation沒有磁盤上的文件,則無意義。)
				relpages		int4				該表的磁盤表示的大小(頁面大小爲BLCKSZ)。這只是計劃者使用的估計值。
											它由VACUUM,ANALYZE和一些DDL命令(如CREATE INDEX)更新。
				reltuples		float4				表中的行數。這只是計劃者使用的估計值。
											它由VACUUM,ANALYZE和一些DDL命令(如CREATE INDEX)更新。
				relallvisible	int4				在表格的可見性圖中標記爲全部可見的頁面數。這只是計劃者使用的估計值。
											它由VACUUM,ANALYZE和一些DDL命令(如CREATE INDEX)更新。
				reltoastrelid	oid		pg_class .oid	與此表關聯的TOAST表的oid,如果沒有,則爲0。TOAST表在“輔助表”中存儲“超出行”的大型屬性 。
				relhasindex	bool				如果這是一個表並且它有(或最近有)任何索引,則爲真
				relisshared	bool				如果此表在羣集中的所有數據庫之間共享,則爲true。只有某些系統目錄(如 pg_database)被共享。
				relpersistence	char				p =永久表, u =未記錄表,t =臨時表
				relkind		char				r =普通表, i =索引,S =序列,v =視圖,m =物化視圖, c =複合類型,t = TOAST表,f =外部表
				relnatts		int2				relation中的用戶列數(系統列未計數)。pg_attribute中必須有許多相應的條目。另見pg_attribute.attnum。
				relchecks		int2				表上CHECK約束的數量; 請參閱pg_constraint目錄
				relhasoids		bool				如果我們爲relation的每一行生成oid,則爲真
				relhaspkey	bool				如果表具有(或曾經有)主鍵,則爲真
				relhasrules	bool				如果表具有(或曾經有)規則,則爲真; 請參閱pg_rewrite目錄
				relhastriggers	bool				如果表具有(或曾經有)觸發器,則爲真; 請參閱 pg_trigger目錄
				relhassubclass	bool				如果表有(或曾經有過)任何繼承孩子,則爲真
				relrowsecurity	bool				如果表已啓用行級安全性,則爲true; 請參閱 pg_policy目錄
				relforcerowsecurity	bool				如果行級別安全性(啓用時)也爲true,則也適用於表所有者; 請參閱pg_policy目錄
				relispopulated	bool				如果relation被填充,則爲真(對於除某些實例化視圖之外的所有relation都是如此)
				relreplident	char				用於爲行構成“副本標識”的列:d = default(主鍵,如果有的話),
											n =無,f =所有列 i =具有indisreplident set的索引或default
				relfrozenxid	xid				在此表之前的所有交易ID已被替換爲永久(“凍結”)交易ID。這用於跟蹤是否需要將表抽真空以防止事務ID環繞
											或允許縮小pg_clog。零(InvalidTransactionId)如果relation不是一個表。
				relminmxid	xid				在此表之前的所有多重作業ID已由該事務ID替換。這用於跟蹤是否需要將表抽真空以防止多軸實現ID 繞回
											或允許縮小pg_multixact。零(InvalidMultiXactId)如果relation不是一個表。
				relacl		aclitem[]				訪問權限; 看到GRANT (給予權限) 和REVOKE (撤銷權限) 的細節
				reloptions		text[]				特定於訪問方法的選項,如“keyword = value”字符串

	Sequence序列:
		創建Sequence:
			create sequence seq_name
			increment 1			#增量步長爲1
			minvalue 1			#最小值爲1
			maxvalue 	9223372036854775807	#最大值爲9223372036854775807
			start 1				#從1開始
			cache 1				#緩存爲1
			cycle;				#循環,表示到最大值後從頭開始
			
		刪除Sequence:
			drop sequence seq_name;
	
		操作Sequence:  鏈接:https://www.cnblogs.com/mchina/archive/2013/04/10/3012493.html
			
		

		Sequence是一種自動增加的數字序列,一般作爲行或者表的唯一標識,用作代理主鍵。
		一般是用在serial (自增字段類型) 中
			create table tablename(
				colname serial
			);
			等價於:
			create Sequence tablename_colname_seq;
			create table tablename(
				colname integer default nextval('tablename_colname_seq') not null
			);

		你可以看每當我們一個表設置serial字段類型時,總是在這個表下面又創建了一個 表名_列名_seq 的表

	爲了提高postgresql的讀能力,可使用Query Cache:
		pass

	終止活動連接/會話:
		當想刪除數據庫時報錯說還有會話存在時,就可以使用這個方法終止會話
		總思想:
			可以使用pg_terminate_backend()函數和pg_stat_activity視圖來終止數據庫上的活動連接
		首先查看一下視圖pg_stat_activity信息 (這個視圖時自帶的)
		然後就有了下面的sql語句:
			SELECT 
			    pg_terminate_backend(pid) 
			FROM 
			    pg_stat_activity 
			WHERE 
			    pid <> pg_backend_pid()		# 不終止當前連接
			    AND datname = 'target_database';	# 只終止target_database上的連接

	查看用戶連接總數:
		select count(*) from pg_stat_activity;

	查看所有連接的用戶:
		select * from pg_stat_activity;

	取消當前某一個進程的查詢操作,但不釋放它的數據庫連接:
		select pg_cancel_backend( 填入通過pg_stat_activity中查詢出來的用戶pid )

	後臺殺死某一個進程,並取消它的數據庫連接,即釋放出寶貴的數據庫連接資源:
		select pg_terminate_backend( 填入通過pg_stat_activity中查詢出來的用戶pid )

	殺死所有空閒的進程:
		select pg_terminate_backend(pid) from pg_stat_activity where state='idle';
		

git:coding    *使用 git bash ,不然有些命令用不了
	(
		#如果用coding就沒必要設置括號中的內容
		設置git全局配置用戶名稱:
			git config --global user.name "用戶名"
		設置git全局配置用戶密碼:
			git config --global user.email "郵箱"

		查看全局配置用戶名稱:
			git config --global user.name
		查看全局配置用戶密碼:
			git config --global user.email
	)
	#鏈接:https://blog.csdn.net/qq_36150631/article/details/81038485
	
	先登錄你的coding工作站,
	配置公鑰:
		ssh-keygen -t rsa -C "[email protected]"
	打開公鑰:
		C:\Users\wuhaogongsi\.ssh
		中的id_rsa.pub文件,以記事本打開
	添加公鑰:
		打開coding進行添加
	操作:鏈接:https://blog.csdn.net/qq_36150631/article/details/81038485
		pwd						顯示當前全路徑
		git remote show
		git init						初始化
			git remote add origin git@github.com:YongHaoWu/test.git	初始化本地倉庫 (coding不用設置) (origin 是你後面git@github.com... 的一個命名,也就相當於你對應的遠程倉庫的主機名)
		git add .						把工作區的文件都添加到暫存區
		git commit -m '註釋'					把暫存區提交到本地倉庫
		git status						查看是否有文件的狀態 (一般來查看是否有文件未提交)
		git diff .						查看文件夾下所有文件與 暫存區 中的文件的差異
		git diff HEAD					查看文件夾下所有文件與 本地倉庫 中的文件的差異
		git diff HEAD^ HEAD				查看最近一次commit與最近一次commit的上一次commit的差異
		git diff HEAD -- ./lib					查看當前分支下,lib文件夾下的文件和上次提交之間的差別
		git diff 版本號_1 版本號_2				查看兩個版本號之間的差異
		git log						查看修改倉庫文件的日誌;如果查詢完之後跳出 END ,按 q 就可以了
		git log --pretty=oneline				簡單例舉修改倉庫文件的日誌
		git reset						取消add添加
		git reset --hard HEAD^				回退到上一個版本 (本地文件也修改)
		git reflog						查看所有版本號
		git reset --hard 版本號				恢復到指定的版本,工作區中的代碼也回滾到那個指定版本
		git reset --soft 版本號				恢復到指定的版本,工作區中的代碼不變
		git checkout -- .					丟棄工作區的修改  (如果已經提交到暫存區的就不會刪除)
		git checkout -b 名稱					創建+切換分支 (如果分支已經存在,就不能加-b)
		git checkout 名稱					更換分支
		git add . & git stash save '本次暫存標記的名字'		遇到臨時有其他事情要做 但是又不想提交上去的時候,就可以使用stach暫存起來 
		git stash list					查看當前暫存的記錄
		git stash pop stach@{標記號碼}				恢復暫存起來的數據,刪除stach裏的數據
		git stash apply stach@{標記號碼}			恢復暫存起來的數據

		git branch -D 分支名稱				刪除本地分支
		rm 文件名字加後綴					刪除暫存區的指定文件,如果不小心被rm刪除了,可以通過  git checkout -- 被刪除的文件名  來恢復文件,前提是不要被commit提交了
		git branch						查看本地倉庫的所有分支
		git branch -a					本地倉庫與遠程倉庫對比所有分支的情況 (綠色的是本地倉庫的分支,紅色的是遠程倉庫的分支)
		git branch -d 分支名稱				刪除本地倉庫的指定分支
		git fetch --all & git reset --hard origin/分支		兩個連用的目的是用origin/master 覆蓋本地分支,一般是本地分支和遠程分支由衝突時重置用

		git push -u 默認主機名稱(origin)				把本地倉庫提交到遠程倉庫 (第一次提交,後面再提交可允許不指定主機)
		git push						把本地倉庫提交到遠程倉庫
		git push --force					覆蓋遠程分支
		git push --all					把本地的所有分支都提交到遠程倉庫
		git push 主機名稱(origin) 分支名				提交指定的分支
		git push 主機名稱(origin) --delete 分支名			刪除指定主機的遠程分支 * (注意一定要加主機名稱)
		
		git pull 主機名稱(origin) 遠端分支名			把遠端指定的分支名導入本地
		git merge 分支名稱					把某分支與當前分支合併起來
		git gc & git count-objects -v & git checkout -f		把本地倉庫的內容恢復到本地

		git clean -d					清空所有新建的文件和文件夾
		還有一些關於commit分割的問題:
			如何用 rebase 、 reset   和   commit   來分割既有的提交。
			以後用到了再整理
		

	git配置:
		git config core.sparsecheckout true			配置git允許pull指定的文件或文件夾
		git config core.excludesfile ~/.idea			配置該倉庫自動忽略.idea文件夾,
		git config --global core.excludesfile ~/.idea		全局配置git自動

windows操作:  鏈接:https://www.cnblogs.com/yanqiong/p/10587960.html
	dir		展示當前文件夾裏的文件	例如:dir
	mkdir		創建文件夾		例如:mkdir 'test_operate'
	touch		創建文件  要加後綴		例如:touch operate.txt
	cat		顯示文件內容		例如:cat operate.txt
	echo		添加內容至文件內		例如:echo 111111 >> operate.txt 
	cls		清空cmd

linux操作:  https://blog.csdn.net/qq_27270029/article/details/80636198
	mkdir		創建文件夾
	mv 		移動文件夾		例如 mv '文件名' /usr/conf/java 
	touch		創建文件			例如 touch '文件名.後綴'
	tail 		查看文件最後幾行		例如 tail '文件名'
	tail -f		實時查看文件內容		例如 tail -f '文件名'
	

virtualenv:
	windows虛擬環境配置:鏈接:https://www.jianshu.com/p/a83a8f5d68dd?utm_campaign=maleskine&utm_content=note&utm_medium=writer_share&utm_source=weibo
		下載:
			python -m pip install virtualenv

		創建新的虛擬環境:
			virtualenv -p D:\my_environment\python.exe venv     #D:\... 是你虛擬環境對應的python程序,venv是你的虛擬環境名稱
	
		進入虛擬環境:
			cd 到對應虛擬環境中的Scripts中
			打開cmd,執行activate    就可以了
		退出:
			執行 deactivate
			(
				經試驗,deactivate不需要是對應虛擬環境,只需要是個deactivate.bat就行,
					所以建議把這個腳本單獨弄一個環境變量,就不用每次都cd 到對應的路徑中了。
				例如我是單獨在系統目錄中創建了一個deactivate文件夾,放入deactivate.bat,再配置對應的環境變量就可以了
			)
			
sourcetree:
	這是windows的git 可視化工具,主要是方便查看解決衝突
	配置本地倉庫:
		先在頁面上面找到 +create ,填寫入本地路徑就可以了
	配置遠程倉庫:
		1、首先參考上面git 的教程配置好公鑰
		2、打開頁面,選擇  '工具' > '選項' 
		3、配置好裏面的默認用戶信息和SSH客戶端配置,SSH客戶端選擇 'OpenSSH' ,然後選擇SSH密鑰路徑,也就是第一步你生成的密鑰文件id_rsa.pub,確定。
		4、選擇   '工具' > '添加SSH密鑰' ,選擇你的密鑰文件id_rsa.pub
		5、選擇   '設置' > 遠程倉庫  '添加' ,遠程名稱默認爲origin,再填上你coding項目的 SSH 的路徑 例如'[email protected]:........'
	

flask:
	不使用外鍵:
		https://graycarl.me/2016/12/27/sqlalchemy-without-foreignkey.html

	flask_ngx:
		https://zhuanlan.zhihu.com/p/38859762

	獲取flask_sql 獲取數據庫已有的表
		https://blog.csdn.net/weixin_40238625/article/details/88177492

	flask_orm基礎
		https://www.cnblogs.com/huchong/p/8274510.html

	orm沒有外鍵多表聯查:
		data = db.session.query(models.TbArticle, models.TbArticleContent)
  		data.join(models.TbArticle, models.TbArticle.uuid == models.TbArticleContent.uuid)

	current_app 上下文:    鏈接:https://blog.csdn.net/m0_37323771/article/details/80645100  , https://blog.csdn.net/JENREY/article/details/86606653
		pass

	請求鉤子:
		@app.before_first_request
			再第一次請求之前調用,可以用作初始化

		@app.before_request
			在每一次請求之前調用,這很好已經有請求裏,可能在這個裏面做校驗
		
		@app.after_request
			在執行完視圖函數之後會調用,並會把視圖函數所生成的響應傳入,可以在此方法中對響應做最後一步統一的處理
			例如:
				@app.after_request
				def after_request(response):
				    print("after_request")
				    response.headers["Content-Type"] = "application/json"
				    return response

		@app.teardown_request
			每一次請求之後都會調用,會接受一個參數,參數是服務器出現的錯誤信息,
			例如:
				@app.teardown_request
				def teardown_request(e):
				    print("teardown_request")	
flask_sqlalchemy:
	重寫filter_by:
		例如可能某個項目中,status是邏輯刪除的標誌,每次查詢都需要加上status=1,比如Gifts.query.filter_by(uid=current_user.id,  status=1)
			於是我們可以重寫filter_by:
		filter_by等查詢函數定義在sqlalchemy.orm.Query中,flask_sqlalchemy.BaseQuery繼承了orm的Query, 因此我們重寫的時候是直接繼承BaseQuery。
			Orm.Query ——> BaseQuery ——> 自定義Query
			自定義的filter_by的代碼爲:
				class Query(BaseQuery):
				    def filter_by(self, **kwargs):
				        if 'status' not in kwargs.keys():
				            kwargs['status'] = 1
				        return super(Query, self).filter_by(**kwargs)
			然後得指定query:
				db = SQLALchemy( query_class = Query )

	中文全文索引優化:
		https://www.codercto.com/a/25848.html
		https://www.cnblogs.com/zhenbianshu/p/8253131.html

pytest    鏈接:http://www.pytest.org/en/latest/
	--setup-show	獲取詳細的測試用例運行流程
	-x		出現異常立即結束測試

redis:
	啓動server:
		redis 2.X 版本需要cd到redis目錄下邊,redis-server redis.windows.conf	也就是啓動時添加它的conf配置
		redis 3.X 版本就只需要redis-server

	redis普通配置:
		r = redis.Redis( host='127.0.0.1', port=6379, db=3 )

	redis緩存池:
		pool = redis.ConnectionPool( host='127.0.0.1', port=6379, db=3 )
		r = redis.Redis( connection_pool=pool )
		把redis緩存池中的所有緩存keys取出來:
			list_id = r.keys()
		判斷執行結果:
			from celery.result import AsyncReault
			for i in list_id:
				asy = AsyncResult( id=i.decode(), app=cel )
				    if asy.successful():
				        result = asy.get()
				        print(result)
				        # result.forget() # 將結果刪除,執行完成,結果不會自動刪除
				        # asy.revoke(terminate=True)  # 無論現在是什麼時候,都要終止
				        # asy.revoke(terminate=False) # 如果任務還沒有開始執行呢,那麼就可以終止。
				    elif asy.failed():
				        print('執行失敗')
				    elif asy.status == 'PENDING':
				        print('任務等待中被執行')
				    elif asy.status == 'RETRY':
				        print('任務異常後正在重試')
				    elif asy.status == 'STARTED':
				        print('任務已經開始被執行')

	哨兵配置:通過哨兵可以創建一個當主服務器出現故障時自動將從服務器升級爲主服務器的一個分佈式系統。解決了主從複製出現故障時需要人爲干預的問題。
			這篇介紹哨兵的搭建,以及哨兵是如何進行哨兵發現和主從切換等功能。  鏈接:https://yq.aliyun.com/articles/624355spm=a2c4e.11155472.0.0.6b027c62W6cXjQ
		pass  (沒用過,可以看文檔)

	查看緩存信息: 鏈接:https://www.jianshu.com/p/b6f08341a3ec
		redis:
			查看消息長度		redis-cli -h 127.0.0.1 -p 6379 -n 1 llen celery
			查看消息隊列具體內容	redis-cli -h 127.0.0.1 -p 6379 -n 1 LRANGE key 0 -1
			清空隊列全部內容		redis-cli -h 127.0.0.1 -p 6379 -n 1 ltrim key 0 0
			清除前100條消息		redis-cli -h 127.0.0.1 -p 6379 -n 1 ltrim key 100 -1
			保留前100條消息		redis-cli -h 127.0.0.1 -p 6379 -n 1 ltrim key 0 100

	刪除:
		刪除當前庫的所有數據
			flushdb

		刪除所有庫的所有數據
			flushall

celery:
	超時機制:
		https://www.freebuf.com/column/216719.html

	定時任務: 鏈接:https://blog.csdn.net/zhangfh1990/article/details/77164499
		(1)
		注意點:
			定時任務其實就是拿一個裝飾器 (@cel.on_after_configure.connect) 用來預留執行tasks任務,要執行定時任務需要額外執行 celery -A celery目名 beat

		(2)
		直接設置定義的Celery對象中的conf.beat_schedule屬性就可以了
			例子:
				cel.conf.beat_schedule = {
				                    'test': {
				                    	# 具體需要執行的函數
				                    	# 該函數必須要使用@app.task裝飾
				                    'task': 'celery_task.tasks1.test_celery',
				                    	# 定時時間
				                    	# 每分鐘執行一次,不能爲小數
				                    	# 'schedule': crontab(minute='*/1'),
				                    'schedule': 10,
				                    	# 或者這麼寫,每小時執行一次
				                    	# "schedule":  crontab(minute=0, hour="*/1")
				                    	# 執行的函數需要的參數
				                    'args': ('測試定時',)
				                    },
				                    # 'test2': {
				                    # 'task': 'celery5.celery_task.test2.test_celery2',
				                    # # 設置定時的時間,10秒一次
				                    # 'schedule': timedelta(seconds=5),
				                    # 'args': ('測試')
				                    # }
				                }
				配置完後切記要運行  celery -A celery項目名 beat


	Config配置名:鏈接:https://blog.csdn.net/tony10010/article/details/94578077
		class Config:
		    # 包含以下兩個任務文件,去相應的py文件中找任務,對多個任務做分類
		    BROKER_URL  = 'redis://127.0.0.1:6379/1'		#發佈任務db
		    CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/2'	#任務結果db
		    CELERY_IMPORTS  = [				#加載文件
			'celery_task.tasks1',
 		              	'celery_task.tasks2',
		               	'celery_task.tasks3',
		               ]

	失敗重試:  鏈接:https://blog.csdn.net/yezi1993/article/details/89455716
		@cel.task(bind=True)		#bind=True    設置後會自動傳入self,即task對象,
		def test_celery(self,res):
		    # time.sleep(3)
		    try:
		        print('打印test_celery_1%s' % res)
		        assert 1==2
		    except Exception as e:
		        """
 		       郵件發送失敗,使用retry進行重試

		        retry的參數可以有:
		            exc:指定拋出的異常
		            throw:重試時是否通知worker是重試任務
		            eta:指定重試的時間/日期
		            countdown:在多久之後重試(每多少秒重試一次)
		            max_retries:最大重試次數
		        """
		        raise self.retry(exc=e, countdown=3, max_retries=5)

	在任務中調用任務:
		import celery
		celery.current_app.send_task('celery_task.tasks2.test_celery2', args=['調用成功'])

Docker操作:
	docker system prune				完整的系統清理,刪除所有

	https://www.jianshu.com/p/dd4a99222de2
	docker pull XX				下載鏡像
	docker images				查看鏡像
	docker rmi [image]				刪除鏡像,-f, -force 強制刪除鏡像,以便有容器引用該鏡像;-no-prune 不要刪除未帶標籤的父鏡像

	docekr run image_id /bin/bash			創建容器
	docker ps					查看啓動的容器,加上-a是指查看所有容器
	
	docker attach 鏡像名字(container_id)		使用attach 進入容器操作,當在其裏面使用了exit後,直接退出這個容器
	docker exce
	docker rm 				刪除容器

	docker run --name container-name:tag -d -p 服務器端口:Docker 端口 image-name
		--name:自定義容器名、-d:表示後臺運行容器、image-name:指定運行的鏡像名稱以及Tag、-p表示進行服務器與docker容器的端口映射,
			默認情況下容器中的鏡像佔用的端口是docker容器中的端口,與外界是隔離的,必須進行端口映射才能訪問

	docker ps -a -f status=exited			列出所有停止狀態的容器

linux系統:
	
	ssh-keygen的用法:鏈接參考: https://blog.csdn.net/qq_38570571/article/details/79268426
		主要是爲了使兩個linux機器之間使用ssh不需要用戶名和密碼。採用了數字簽名RSA或者DSA來完成這個操作。

	linux有兩個系列:
		RedHat系列:Redhat、 Centos、Fendora等
		Debian系列: Debian、Ubuntu等

	RedHat系列:
		1、常見的安裝包格式rpm包,安裝rpm包的命令是“rpm -參數”
		2、包管理工具 yum
		3、支持tar包

	Debian系列:
		1、常見的安裝包格式 deb包,安裝deb包的命令是“dpkg -參數”
		2、包管理工具 apt-get	
		3、支持tar包

	使用前要注意子的liunx系統是那個系列的

	Debian:
		aptitude				刪除包以及它的所有依賴包

	Centos:
		vi編輯器:
			保存命令:
				按ESC進入命令模式
				:w		保存但不退出
				:w file		將修改另外保存到file中,不退出vi
				:w!		強制保存,不退出vi
				:wq		保存文件並退出vi
				:wq!		強制保存文件,並退出vi
				q:		不保存文件,退出vi
				:q!		不保存文件,強制退出vi
				:e!		放棄所有修改,從上次保存文件開始再編輯

			yum list | grep postgresql		查看yum下載的所有包含 postgresql 的包
			cat /etc/redhat-release		展示當前的系統版本
		
		重啓命令:
			reboot   			普通重啓
			shutdown -r now 		立刻重啓(root用戶使用)
			shutdown -r 1010分鐘自動重啓(root用戶使用)
			shutdown -r 20:35 		在時間爲20:35時候重啓(root用戶使用)
  			shutdown -c		命令取消重啓
		關機命令: 
			halt 			立刻關機
			poweroff 			立刻關機
			shutdown -h now 		立刻關機(root用戶使用)
			shutdown -h 10 		10分鐘後自動關機
			shutdown -c		命令取消重啓

		ll -h 				展示當前文件大小,單位爲k
		ls				展示當前文件
		
		( CentOS7 )
		systemctl start XX.service		啓動服務
		systemctl stop XX.service		停止服務
		systemctl restart XX.service		重啓服務
		systemctl status XX.service		查看服務狀態
		systemctl enable XX.service		設置開機啓動
		systemctl disable XX.service		設置開機不啓動

		systemctl is-active XX.service		查看服務是否運行
		systemctl is-enable XX.service		查看服務是否設置爲開機啓動
		systemctl mask XX.service		註銷指定服務
		systemctl unmask XX.service		取消註銷指定服務

		systemctl suspend			進入睡眠模式
		systemctl hibemate			進入休眠模式
		systemctl rescue			強制進入救援模式
		systemctl emergency			強制進入緊急救援模式
		systemctl [command] [unit.target]	設置運行級別
			command:
				get-default : 取得當前的target
				set-default : 設置指定的target爲默認的運行級別
				isolate : 	切換到指定的運行級別
				unit.target :5.1表中列出的運行級別

		        運行級別對應表( 此外還是一個getty.target用來設置tty的數量 )
		init級別	systemctl target
		0	shutdown.target
		1	emergency.target
		2	rescure.target
		3	multi-user.target
		45	graphical.target
		6	無

		systemctl get-default			獲取當前的運行級別
		systemctl set-default multi-user.target		設置默認的運行級別爲multi-user下
		systemctl isolate multi-user.target		在不重啓的情況下,切換到運行級別multi-user下
		systemctl isolate graphical.target		在不重啓的情況下,切換到圖形界面下
		
		systemctl list-dependencies [unit] [--reverse]	查看當前運行級別target( mult-user )啓動了哪些服務 
								( --reverse 是用來檢查哪個unit使用了這個unit )
		systemctl list-units --all | grep sshd		查看開啓的sshd服務
		
java IntelliJ IDEA:
	下載:
		https://www.jetbrains.com/idea/download/#section=windows    #直接官方下載

	創建項目:
		對於小白,比較方便的就是先直接打開idea
		選擇創建新的項目,	
		進去選自定義,然後記得添加maven倉庫,就會幫你直接生成好了;
		要添加包,就打開pom.xml,在project標籤下的dependencies標籤中直接添加對應的dependency包的標籤就可以了

	快捷鍵:
		ctrl + e					顯示最近編輯的文件列表
		shift + Click				關閉文件
		ctrl + []				跳過大括號的開頭結尾
		ctrl + shift + 空格				跳轉到上次編輯的地方
		ctrl + F12					顯示當前文件的結構
		ctrl + F7					查詢當前元素在當前文件中的引用,然後按F3可以選擇
		ctrl + N 					快速打開類
		ctrl + shift + N				快速打開文件
		alt + q					看到當前方法的聲明
		ctrl + w					選擇單詞 繼而 語句 繼而 行 繼而 函數
		alt + F1					將正在編輯的元素在各個面板中定位
		ctrl + p					顯示參數信息
		ctrl + shift + Insert				選擇剪貼板內容並插入
		alt + Insert				生成構造器/Getter/Setter等
		ctrl + alt + v				引入變量。例如把括號內的SQL附成一個變量
		ctrl + alt + t				把代碼包在一塊內,例如try/catch
		ctrl + alt + b				找所有的子類
		ctrl + shift + b				找變量的類
		ctrl + g					定位行
		ctrl + shift +r				在指定窗口替換文本
		alt + shift + c				查找修改的文件
		ctrl + e					最近打開的文件
		F4					查找變量來源
		ctrl + alt + F7				選中的字符查找工程出現的地方
		ctrl + shift + o				彈出顯示查找內容

	使用maven倉庫,打包成jar文件,要運行只需要環境中有對應java版本即可運行:
		
			如果有maven的報錯,就在maven倉庫中的plugins標籤中添加這一段:
				<plugin>
				                <groupId>org.springframework.boot</groupId>
				                <artifactId>spring-boot-maven-plugin</artifactId>
				</plugin>
			如果這樣也不行可以參考我自己的plugins:
				<plugin>
				               <groupId>org.apache.maven.plugins</groupId>
				               <artifactId>maven-compiler-plugin</artifactId>
				               <configuration>
 				                   <encoding>utf8</encoding>
				                   <source>7</source>
				                   <target>7</target>
				                </configuration>
				            </plugin>
				            <plugin>
				                <groupId>org.springframework.boot</groupId>
				                <artifactId>spring-boot-maven-plugin</artifactId>
				            </plugin>

		首先點擊左上角file,選擇project_structure ;
		然後選擇Artifacts,點擊+,選擇jar,再選擇from modules .... ;
		跳出彈框後,選擇對應的main class,之後切記選擇下面 MANIFEST.MF生成路徑千萬不能是 ....\main\java路徑結尾的!!;
		點擊ok,ok。
		再點擊上面的Build選項,選擇 Build Artifact ,再選擇第一個build就可以了,
		等待幾秒鐘,你的項目目錄中就會生成一個out文件夾,點進去就有你生成好的jar文件了
		運行jar命令是 java -jar 文件名.jar

java:
	

發佈了78 篇原創文章 · 獲贊 26 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章