day15(mysql 的多表查詢,事務)

mysql之多表查詢

1.合并結果集

  作用:合并結果集就是把兩個select語句查詢的結果連接到一起!

?

/*創建表t1*/
CREATE  TABLE t1(a INT PRIMARY KEY ,b VARCHAR(10)
)
INSERT INTO t1 VALUES(1,'a');
INSERT INTO t1 VALUES(2,'b');
INSERT INTO t1 VALUES(3,'c');
/*創建t2*/
CREATE  TABLE t2(c INT PRIMARY KEY ,d VARCHAR(10)
)
INSERT INTO t2 VALUES(4,'d');
INSERT INTO t2 VALUES(5,'e');
INSERT INTO t2 VALUES(6,'f');

  合并結果集有兩種方式:

    union: 去除重復記錄。  

/*使用union進行連接兩個select語句*/select * from t1 union select * from t2;
查詢結果為:

?

  為了體現去重思想: 我們給t1添加一條數據

insert into t1 values(4,'d');

  重新進行查詢則:

select * from t1 union select * from t2;

? ?證明了 t1表和t2表的相同的數據會去掉

  

   union all:不用出去重復記錄。

select * from t1 union all select * from t2;

輸出結果中 ? 4d出現了兩次

  總結 : ?union :連接兩個查詢語句 ?去除完全相同的數據

      union all: 連接兩個查詢語句,不去除完全相同的記錄

     ? ? 要求:被合并的兩個結果:列數、列類型必須相同。

2.連接查詢

  連接查詢就是求出多個表的乘積 ?eg:t1連接t2,那么查詢出來的結果為t1*t2

  

select * from t1,t2;

?  連接查詢會產生 ?笛卡爾積

  假設集合A={a,b},集合B={0,1,2},則兩個集合的笛卡爾積為{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。可以擴展到多個集合的情況。

  為了去除笛卡爾積給我們帶來的多余的數據 ? 我們使用連接查詢 給了一個約束條件(外鍵約束)

  為了更好的體驗連接查詢的約束條件 我們重新建了兩個表

create table classes(cid int primary key auto_increment,cname varchar(20),cnum int
);
insert into classes values(null,'01班',20);       
insert into classes values(null,'02班',30);    
insert into classes values(null,'03班',40);    
insert into classes values(null,'04班',41);   
create table student(
      sid int primary kay auto_increament,
      cname varchar(20),
      sex varchar(1),
      brithday date,
      cno int,
      constraint fk_st_c1 foreign key (cno) references classes (cid)
);

/*給student表添加數據*/
INSERT INTO student VALUES(NULL,'張三','男','1990-09-01',1);
INSERT INTO student VALUES(NULL,'李四','女','1991-02-13',1);
INSERT INTO student VALUES(NULL,'王五','男','1990-03-12',1);
INSERT INTO student VALUES(NULL,'趙六','男','1992-02-12',2);
INSERT INTO student VALUES(NULL,'田七','男','1994-05-21',2);
INSERT INTO student VALUES(NULL,'張五','女','1990-05-17',2);
INSERT INTO student VALUES(NULL,'張老七','女','1990-06-17',3);
INSERT INTO student VALUES(NULL,'王老四','女','1990-04-12',3);
INSERT INTO student VALUES(NULL,'李六','男','1990-09-12',1);  

  班級表 ? ?            學生表?

? ? ? ? ? ? ? ? ? ? ? ? ??

?

?學生表中的cno字段的外鍵是班級表中的cid

這樣我們使用連接查詢會產生(班級表的條數*學生表的條數=4*9=36)

SELECT COUNT(*) FROM classes ,student 

  加上約束條件使沒用的數據過濾掉 ?使用where關鍵字

SELECT COUNT(*) FROM classes c,student s  WHERE c.cid=s.cno;

  使無效數據過濾掉,所以union 一般我們不會使用

?

  因此產生了內連接和外連接查詢

  內連接分為: ? (特點 ?查詢條件必須滿足)

    顯式內連接(inner join ? .....on) ? 其中 ?inner關鍵字可以省略 ? ?

        

SELECT * FROM classes c INNER JOIN student s ON c.cid=s.cno;
SELECT * FROM classes c  JOIN student s ON c.cid=s.cno; /*省略inner關鍵字*/

    隱式內連接

      就是我們剛才提到的連接查詢

?    

SELECT * FROM classes c,student s  WHERE c.cid=s.cno;

    外連接?

      左外連接: ?左表作為基礎

        left outer join ? on

SELECT * FROM classes c LEFT OUTER JOIN student s ON c.cid=s.cno;

  把班級表作為基礎 ?查詢出來的結果為:

? ? ? ? ? ? ? ? ? ? ?

      右外連接: ?右表作為基礎

        right outer join on?

SELECT * FROM classes c RIGHT OUTER JOIN student s ON c.cid=s.cno;

   把學生表作為基礎 ?查詢出來的結果為:

? ? ? ? ? ? ? ? ? ? ? ??

?

? ? ? ? 使用一張圖來總結左連接和右連接

    

?

3.子查詢?

? ?   子查詢:一個select語句中包含了另一個select語句

    子查詢的位置

      where后 ? :作為條為被查詢的一條件的一部分

?

      from 后 ? ? : ? 作表;

  ?當子查詢出現在where后作為條件時,還可以使用如下關鍵字:

?

    1. any
    2. all

?

      子查詢結果集的形式:

?

      1. 單行單列(用于條件)
      2. 單行多列(用于條件)
      3. 多行單列(用于條件)
      4. 多行多列(用于表)

?

    

查詢學生生日在91年之后的班級的信息。
select * from classes where cid in (SELECT cno FROM student WHERE birthday > '1991-01-01');
帶exists的子查詢
?查詢學生生日大于91年1月1日,如果記錄存在,前面的SQL語句就會執行
select * from classes where exists (SELECT cno FROM student WHERE birthday > '1991-01-01');
帶any的子查詢
SELECT * FROM classes WHERE cid > ANY (SELECT cno FROM student )
帶all的子查詢
SELECT * FROM classes WHERE cid > ALL (SELECT cno FROM student)

?

  事務

?

事務的特性(面試題)

?

原子性:指事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生。?

?

一致性:事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態。轉賬前和轉賬后的總金額不變。

?

隔離性:事務的隔離性是多個用戶并發訪問數據庫時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作數據所干擾,多個并發事務之間要相互隔離。

?

持久性:指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即使數據庫發生故障也不應該對其有任何影響。

?

?

?

4、事務的隔離級別

?

贓讀:指一個事務讀取了另一個事務未提交的數據。

?

不可重復讀:在一個事務內讀取表中的某一行數據,多次讀取結果不同。一個事務讀取到了另一個事務提交后的數據。(update

?

虛讀(幻讀):是指在一個事務內讀取到了別的事務插入的數據,導致前后讀取不一致。 (insert)

?

?

?

數據庫通過設置事務的隔離級別防止以上情況的發生:

?

* 1READ UNCOMMITTED: 贓讀、不可重復讀、虛讀都有可能發生。

?

* 2READ COMMITTED: 避免贓讀。不可重復讀、虛讀都有可能發生。(oracle默認的)

?

* 4REPEATABLE READ:避免贓讀、不可重復讀。虛讀有可能發生。(mysql默認)

?

* 8SERIALIZABLE: 避免贓讀、不可重復讀、虛讀。

?

級別越高,性能越低,數據越安全

?

?

?

mysql中:

?

查看當前的事務隔離級別:SELECT @@TX_ISOLATION;

?

更改當前的事務隔離級別:SET TRANSACTION ISOLATION LEVEL 四個級別之一。

?

設置隔離級別必須在事務之前

?

?

?

練習:設置事務的隔離級別為 read uncommitted

?

時間

線程1

線程2

說明

t1

begin;

?

?

t2

select * from account where name='zs';

結果1000

?

?

t3

?

begin;

?

t4

?

update account set money=money+100 where name='zs';

?

t5

select * from account where name='zs';

結果1100

?

讀到了另一個線程未提交事務的數據。贓讀發生了

t6

?

commit;

?

t7

select * from account where name='zs';

結果1100

?

讀到了另一個線程提交事務的update數據。不可重復讀發生了

t8

?

insert into account values(4,'zl',1000);

執行insert語句插入數據,事務自動提交了

?

t9

select * from account;

查到4條數據

?

讀到了另一個線程自動提交事務的insert語句數據。虛讀發生了

t10

commit;

?

?

?

轉載于:https://www.cnblogs.com/fjkgrbk/p/mysql_moreTable.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454997.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454997.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454997.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue router傳參_新手使用vue-router傳參時注意事項

1. 使用name和params組合傳參this.$router.push({name: details, params: {id: 233}})路由配置import Vue from vueimport Router from vue-router Vue.use(Router) export default new Router({ mode: history, routes: [ { path: /details, name: details, component: resolv…

FFMpeg分析詳細分析

與其說是分析,不如說是學習,只是看在自己第一次寫系列文章的份上,給足自己面子,取個有"深度"的題目!如有人被題目所蒙騙進來,還望見諒! URLProtocol,URLContext和ByteIOContext是FFMp…

《jQuery基礎》總結

目前,互聯網上最好的jQuery入門教材,是Rebecca Murphey寫的《jQuery基礎》(jQuery Fundamentals)。這本書雖然是入門教材,但也足足有100多頁。我對它做了一個詳細的筆記,試圖理清jQuery的設計思想&#xff…

邏輯綜合工具DesignCompiler使用教程

邏輯綜合工具Design Compiler使用教程 圖形界面design vision操作示例 邏輯綜合主要是將HDL語言描述的電路轉換為工藝庫器件構成的網表的過程。綜合工具目前比較主流的是synopsys公司Design Compiler,我們在設計實踐過程中采用這一工具。Design compiler有兩種工作…

遍歷結構體_三菱ST語言編程(3)——結構體變量

上篇文章介紹了數組,是一組相同類型數據的列表,那么不同類型的數據能否組合到一起用一個標簽表示呢?答案當然是可以的,而實現這個功能的就是結構體(struct)。建立結構體在三菱結構化編程的界面中左側程序部件里可以找到結構體標簽…

關于微信小程序swiper的問題

關于小程序swiper的問題 代碼 在官方示例上給swiper添加了currentbindchangecircular添加了一個buttonbindtap用于切換下一張 index.wxml <swiper indicator-dots"{{indicatorDots}}"bindchange"swiperChange"current"{{index}}"circular&quo…

PyQt5案例匯總(完整版)

個人博客點這里 PyQt5案例匯總(完整版) 起步 PyQt5是一套綁定Qt5的應用程序框架。他在Python 2.x和3.x中都是可用的。該教程使用的是Python3.x。 Qt庫是一套最有用的GUI庫。 PyQt5是作為一套Python模塊實現的。他已經超過620個類和6000個函數與方法。他是一個運行在所有主…

中的 隱藏鼠標菜單_Mac移動隱藏刪除頂部菜單欄圖標教程

蘋果菜單欄貫穿 Mac 的屏幕頂部。左側是蘋果菜單和應用菜單&#xff0c;應用菜單一般顯示你當前使用的Mac軟件的所有功能菜單。右側通常是以圖標顯示的狀態菜單&#xff0c;幫助你快速查看Mac的狀態以及快速訪問某些Mac軟件。移動圖標位置若想要重新排列狀態菜單欄的圖標&#…

可以用什么代替平面鏡

答案是鏡面 潛望鏡是利用平面鏡來改變光路轉載于:https://www.cnblogs.com/lidepeng/p/7280593.html

[hadoop] kettle spoon 基礎使用 (txt 內容抽取到excel中)

spoon.bat 啟動kettle。 測試數據 1. 新建轉換 輸入中選擇文本文件輸入 雙擊設置文本輸入 字符集、分隔符設置 獲取對應的字段&#xff0c;預覽記錄。 拖入 excel輸出&#xff0c;設置轉換關系 設置輸出路徑 獲取字段 啟動轉換 導入的excel數據&#xff08;設置好格式,圖中ID,A…

ffmpeg提取音頻播放器總結

ffmpeg提取音頻播放器總結&#xff1b; 一&#xff1a;簡介 從編寫音頻播放器代碼到完成播放器編寫&#xff0c;測試&#xff0c;整整5天的時間&#xff0c;這時間還不算之前對 ffmpeg熟悉的時間&#xff0c;可以說是歷經千辛萬苦&#xff0c;終于搞出來了&#xff0c;雖然最…

【BZOJ 4103】 [Thu Summer Camp 2015]異或運算 可持久化01Trie

我們觀察數據&#xff1a;樹套樹 PASS 主席樹 PASS 一層一個Trie PASS 再看&#xff0c;異或&#xff01;我們就把目光暫時定在01Tire然后我們發現&#xff0c;我們可以帶著一堆點在01Trie上行走&#xff0c;因為O(n*q*30m*30)是一個可選復雜度。 我們想一下我們正常的時候…

Docker學習筆記——Java及Tomcat Dockerfile

1、Java Dockerfile創建項目目錄java&#xff0c;目錄下上傳所需java版本壓縮包&#xff0c;并創建Dockerfile文件&#xff0c;項目結構如下&#xff1a;java-Dockerfile-jdk-8u111-linux-x64.gzDockerfile內容&#xff1a;# JAVA # Version 1.8.0_111 # SOURCE_IMAGE FROM cen…

rabbitmq接口異常函數方法_RabbitMQ監控(三):監控隊列狀態

#RabbitMQ 監控(三)驗證RabbitMQ健康運行只是確保消息通信架構可靠性的一部分&#xff0c;同時&#xff0c;你也需要確保消息通信結構配置沒有遭受意外修改&#xff0c;從而避免應用消息丟失。RabbitMQ Management HTTP API提供了一個方法允許你查看任何vhost上的任何隊列&…

FFMpeg語法參數中文參考手冊

要查看你的ff mpeg支持哪些 格式&#xff0c;可以用如下命令&#xff1a;$ ffmpeg -formats | less還可以把 視頻文件導出成jpg序列幀&#xff1a;$ ffmpeg -i bc-cinematic-en.avi example.%d.jpgdebian下安裝ffmpeg很簡單&#xff1a;&#xff03;apt-get install ffmpegffmp…

Java類集框架 —— LinkedHashMap源碼分析

前言 我們知道HashMap底層是采用數組單向線性鏈表/紅黑樹來實現的&#xff0c;HashMap在擴容或者鏈表與紅黑樹轉換過程時可能會改變元素的位置和順序。如果需要保存元素存入或訪問的先后順序&#xff0c;那就需要采用LinkedHashMap了。 LinkedHashMap結構 LinkedHashMap繼承自H…

apache 支持.htaccess重寫url

1. httpd.conf 添加&#xff1a; <Directory />Options Indexes FollowSymLinks MultiviewsAllowOverride allRequire all grantedRewriteEngine On</Directory> 開啟&#xff1a; 在phpinfo里找到&#xff1a; 說明開啟成功。 2.httpd-vhosts.conf &#xff08;開…

oom 如何避免 高并發_【高并發】高并發環境下如何防止Tomcat內存溢出?看完我懂了!!...

【高并發】高并發環境下如何防止Tomcat內存溢出&#xff1f;看完我懂了&#xff01;&#xff01;發布時間&#xff1a;2020-04-19 00:47,瀏覽次數&#xff1a;126, 標簽&#xff1a;Tomcat寫在前面隨著系統并發量越來越高&#xff0c;Tomcat所占用的內存就會越來越大&#xff0…

[JSOI2008]最小生成樹計數

OJ題號&#xff1a;  BZOJ1016 題目大意&#xff1a;   給定一個無向帶權圖&#xff0c;求最小生成樹的個數。 思路&#xff1a;   先跑一遍最小生成樹&#xff0c;統計相同權值的邊出現的個數。   易證不同的最小生成樹&#xff0c;它們不同的那一部分邊的權值實際上是…

vuex webpack 配置_vue+webpack切換環境和打包之后服務器配置

import axios from ‘axios‘import store from ‘../store/index‘const rootUrl process.env.API_ROOT//創建axios實例const service axios.create({timeout:30000 //超時時間})//添加request攔截器service.interceptors.request.use(config >{if (Object.keys(config.hea…