內網安全:域內橫向移動
阿新 • • 發佈:2021-09-30
第一章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' )