1. 程式人生 > 其它 >內網安全:域內橫向移動

內網安全:域內橫向移動

第一章SELECT語句

###	SELECT子句
```sql
語法:
---新+行重新命名為:discount_factor
	SELECT
first_name,
last_name,
points,
(points+10)*100AS	discount_factor
FROMcustomers

練習:
---查詢價格,新增價格:原價*1.1
SELECT
name,
unit_price,
unit_price*1.1AS'newprice'
FROMproducts
```
###	WHERE子句
```sql
語法:
---選擇積分大於3000的使用者
	SELECT*
	FROMcustomers
	WHEREpoints>3000

---sql標準日期寫法,選擇出生日期>1990-01-01的人
	SELECT*
	FROMcustomers
	WHEREbirth_date>'1990-01-01'
練習:
---查詢>2019-01-01的訂單
	SELECT*
	FROMorders
	WHEREorder_date>='2019-01-01'
```
###	AND,OR,NOT運算子
```sql
運算子基礎語法:
---查詢生日>1990-01-01或者point>1000積分的
SELECT*
	FROMcustomers
	WHEREbirth_date>'1990-01-01'	ANDpoints>1000
AND練習:
---查詢id=6的,庫存*價格>30的表
SELECT*
	FROMorder_items
	WHEREorder_id=6AND(quantity*unit_price)>30
IN運算子語法:
---查詢同時等於VA,FL,GA,的資料
	SELECT*
	FROMcustomers
	WHEREstateIN('va','fl','ga')
IN運算子練習:
---查詢stock中等於49,38,72的資料
SELECT*
	FROMproducts
	WHEREquantity_in_stockIN(49,38,72)
BETWEEN運算子語法:
---查詢積分在1000到3000之間的資料
	SELECT*
	FROMcustomers
	WHEREpointsBETWEEN1000AND3000
BETWEEN運算子練習:
---查詢出生日在1990到2000之間的資料
	SELECT*
	FROMcustomers
	WHEREbirth_dateBETWEEN'1990-01-01'AND'2000-01-01'
LIKE運算子語法:
---查詢以b開頭為名字的顧客資料,%代表任意匹配
	SELECT*
	FROMcustomers
	WHERElast_nameLIKE'b%'
REGEXP(正則表示式)運算子語法:
---‘|’管道符或連線;【a-h】a-h範圍匹配;‘^’匹配前面任意;'$'匹配任意後面
	SELECT*
	FROMcustomers
	WHERElast_nameREGEXP'field|mac'
	WHERElast_nameREGEXP'[gim]e'
練習:
---查詢包含AMBUR和ELKA的資料
	SELECT*
	FROMcustomers
	WHEREfirst_nameREGEXP'AMBUR|ELKA'
SELECT*
	FROMcustomers
	WHERElast_nameREGEXP'EY$|ON$'

SELECT*
	FROMcustomers
	WHERElast_nameREGEXP'^my|se'

	SELECT*
	FROMcustomers
	WHERElast_nameREGEXP'b[ru]'
NULL運算子:
---查詢為空的資料
	SELECT*
	FROMcustomers
	WHEREphoneISNULL
---查詢沒有發貨的資料,實際經常使用的語句
	SELECT*
	FROMorders	
	WHEREshipped_dateISNULL
```
###	ORDERBY子句
```sql
ORDERBY語法:
---排序
	SELECT*
	FROMcustomers
	ORDERBYfirst_name
LIMIT語法:
---先排序再取前三資料
	SELECT*
	FROMcustomers
	ORDERbypointsDESC
	LIMIT3
```
#	第二章joins(連線)
###	1.內連結
```sql
內連結語法:
---內鏈查詢客戶表和訂單表
	SELECTorder_id,o.customer_id,first_name,last_name
	FROMorderso
	JOINcustomersc
		ONo.customer_id=c.customer_id
---查詢內連線訂單和產品
	SELECTorder_id,o.product_id,quantity,o.unit_price
	FROMproductsp
	JOINorder_itemso
		ONp.product_id=o.product_id
跨資料庫連線語法:
---sql_store連線到sql_inventory資料庫
	SELECT*
	FROMorder_itemsoi
	JOINsql_inventory.productsp
		ONoi.product_id=p.product_id
自連線語法:(多用於組織架構圖)
---自連線員工與管理員
	SELECT*
	FROMemployeese
	JOINemployeesm
	ONe.reports_to=m.employee_id
多表連線語法:
---查詢多表連線,訂單表,客戶表,狀態表
	SELECTo.order_id,
		o.order_date,
c.first_name,
c.last_name,
os.nameASstatus
	FROMorderso
	JOINcustomersc
		ONo.customer_id=c.customer_id
	JOINorder_statusesos
		ONo.status=os.order_status_id
多key表連線語法:
---多key表連線語法
	SELECT*
	FROMorder_itemsoi
	JOINorder_item_notesoin
		ONoi.order_id=oin.order_id
ANDoi.product_id=oin.product_id
隱士連線語法:
---
```
###	2.外連線
```sql
外連結語法:
---外連線,查詢包含訂單為null的所有資料(內連結不包含null資料)
	SELECT
	c.customer_id,
c.first_name,
o.order_id
	FROMorderso
	RIGHTJOINcustomersc
		ONc.customer_id=o.customer_id

外連線練習:
---外連結查詢
	SELECT
	oi.product_id,
p.name,
oi.quantity
	FROMorder_itemsoi
	RIGHTJOINproductsp
		ONoi.product_id=p.product_id
多表外連結:
---
	SELECT*
	FROMcustomersc
	LEFTJOINorderso
		ONc.customer_id=o.customer_id
	LEFTJOINshipperssh
		ONo.shipper_id=sh.shipper_id

多表外連結lianxi:
---3
	SELECT
	o.order_id,
o.order_date,
c.first_nameAScustomer,
sh.nameASshipper
	FROMorderso
	JOINcustomersc
		ONo.customer_id=c.customer_id
	LEFTJOINshipperssh
		ONo.shipper_id=sh.shipper_id
	LEFTJOINorder_statusesos
		ONo.status=os.order_status_id
```
###USING子句
```sql
USING語法:
---連線的N張表中相同的名字可以用USING()來表示
	SELECT*
	FROMorderso
	JOINcustomersc
	--ONo.customer_id=customers.customer_id
USING(customer_id)
!!!自然連線語法:不建議使用,資料庫自動連線,無法控制
	SELECT
	*
	FROMorderso
	NATURALJOINcustomersc
交叉連線:
---
	SELECT
	c.customer_id,
c.first_name,
p.name
	FROMcustomersc
	CROSSJOINproductsp
聯合查詢|UNION:
---
	SELECT
	o.order_id,
o.order_date,
'Active'ASstatus
	FROMorderso
	WHEREo.order_date>='2019-01-01'
	UNION
	SELECT
	o.order_id,
o.order_date,
'Archived'ASstatus
	FROMorderso
	WHEREo.order_date<'2019-01-01'
UNION練習:
---根據orders表積分劃分會員級別:青銅-白銀-黃金
	SELECT
	c.customer_id,
c.first_name,
c.points,
'Bronze'AStype
	FROMcustomersc
	WHEREpoints<2000
	UNION
	SELECT
	c.customer_id,
c.first_name,
c.points,
'Silver'AStype
	FROMcustomersc
	WHEREpoints>=2000ANDpoints<3000
	UNION
	SELECT
	c.customer_id,
c.first_name,
c.points,
'Gold'AStype
	FROMcustomersc
	WHEREpoints>=3000
	ORDERBYfirst_name
```
#	第三章增刪改
```sql
插入行語法:
---
	INSERTINTOcustomers---(可以加入需要插入的值)
	VALUES(
	DEFAULT,
'john',
'smith',
'1990-1-1',
NULL,
'address',
'city',
'ca',
0)
插入多行語法:
---增加多行
	INSERTINTOshippers(name)
	VALUES('shipper1'),
	('shipper2')
單次插入多行練習:
---在產品表中一次增加3行,包括(名稱,價格,數量)的資料
	INSERTINTOproducts(name,quantity_in_stock,unit_price)
	VALUES
	('baicai',5,3),
('doufu',20,3),
('rou',15,3)
插入分層行:
---母子關聯行插入(orders關聯orders_team)
	INSERTINTOorders(customer_id,order_date,status)
	VALUES(1,'2019-01-02',1);

	INSERTINTOorder_items
	VALUES
(LAST_INSERT_ID(),1,2,2.95),
(LAST_INSERT_ID(),2,2,4.95)
建立表複製語法:
---格式+各種查詢子句任意組合
	CREATETABLEorders_archivedAS---格式
	SELECT*FROMorders---隨意寫各種查詢子句
更改表資料:
---
	UPDATEinvoices---選擇表
	SETpayment_total=0,payment_date=NULL---更改內容
	WHEREinvoice_id=1---選擇行
練習:
	UPDATEinvoices
	SET
	payment_total=invoice_total*0.5,
	payment_date=due_date
	WHEREinvoice_id=3
更改多行:
---
	UPDATEinvoices
	SET
	payment_total=invoice_total*0.5,
	payment_date=due_date
	WHEREclient_id=3---選擇所有id為3的全部更改
WHEREclient_idIN(3,4)---選擇所有id為3和4的全部更改
練習:
---查詢所有大於90年的積分+50
	UPDATEcustomers
	SET
		points=points+50
	WHERE
		birth_date<'1990-01-01'
更新表中使用子查詢語法:
---先用SELECT子查詢找到積分>3000的,然後在更新為Gode
	UPDATEorders
	SETcomments='Goad'
	WHEREcustomer_idIN
		(SELECTcustomer_id
		FROMcustomers
		WHEREpoints>3000)
刪除行:
---	使用子查詢刪除某行
	DELETEFROMinvoices
WHEREclient_id=(
SELECTclient_id
FROMclients
WHEREname='Myworks'
)