MYSQL<五>

來源:互聯網
上載者:User

標籤:查看   primary   個學生   com   步驟   mount   組織圖   用法   rem   

-- ########## 01、LIMIT的使用和分頁 ##########INSERT INTO studentinfo VALUES(NULL, ‘劉備‘, ‘男‘, 35), (NULL, ‘關羽‘, ‘男‘, 30), (NULL, ‘張飛‘, ‘男‘, 25),(NULL, ‘貂蟬‘, ‘女‘, 15), (NULL, ‘呂布‘, ‘男‘, 33), (NULL, ‘甄姬‘, ‘女‘, 22), (NULL, ‘董卓‘, ‘男‘, 55);SELECT * FROM studentinfo;-- LIMIT的使用:-- 用法1、LIMIT 起始位置, 記錄條數-- LIMIT的起始位置0表示第一條記錄SELECT * FROM studentinfo LIMIT 0, 3;SELECT * FROM studentinfo LIMIT 1, 3;-- 錯誤碼: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘-1, 3‘ at line 1SELECT * FROM studentinfo LIMIT -1, 3;-- 用法2、LIMIT 記錄條數-- 從第一條記錄開始取若干條記錄SELECT * FROM studentinfo LIMIT 0;SELECT * FROM studentinfo LIMIT 1;SELECT * FROM studentinfo LIMIT 2;SELECT * FROM studentinfo LIMIT 3;-- LIMIT一般用於分頁操作-- 共有7條資料,設定每頁3條記錄,共分為3頁-- 列出每頁的記錄來歸納分頁的方法:-- 擷取總記錄條數SELECT COUNT(*) AS 總記錄條數 FROM studentinfo;-- 第1頁:第1條、第2條、第3條SELECT * FROM studentinfo LIMIT 0, 3;-- 第2頁:第4條、第5條、第6條SELECT * FROM studentinfo LIMIT 3, 3;-- 第3頁:第7條SELECT * FROM studentinfo LIMIT 6, 1;    -- 此語句執行OK,但是不利於規律的歸納SELECT * FROM studentinfo LIMIT 6, 3;-- 從上面的語句進行分析歸納,得出分頁的通用方法-- 考慮製作方法還是從方法的傳回值類型 和 參數列表 入手-- 1、傳回值類型就是當前頁的資料集合-- 2、參數列表:對於LIMIT子句來說,就兩個參數:初始位置 和 記錄條數--         A:記錄條數:人為設定每一頁的記錄的條數--        B:初始位置:變化的值,但是只要知道了當前是第幾頁,就可以推算出初始位置是多少--             計算公式:(當前頁 - 1) * 記錄條數-- 3、隱含了一個資料需要擷取:總頁數--         A:總記錄條數 % 單頁記錄條數 == 0 時,總頁數 = (總記錄條數 / 單頁記錄條數)--         B:總記錄條數 % 單頁記錄條數 != 0 時,總頁數 = (總記錄條數 / 單頁記錄條數) + 1-- 4、擷取總記錄條數:SELECT COUNT(*) AS 總記錄條數 FROM 表名;-- ########## 02、插入資料和查詢資料的結合操作 ##########-- 建立學生臨時資訊表CREATE TABLE studenttemp(    id INT AUTO_INCREMENT PRIMARY KEY,    `name` VARCHAR(10) NOT NULL,    gender ENUM(‘男‘, ‘女‘) NOT NULL);SELECT * FROM studentinfo;SELECT * FROM studenttemp;-- 需求:把學生資訊表中的部分內容查詢出來插入到學生臨時資訊表中-- 思路:結合使用查詢 和 插入-- INSERT結合查詢的寫法:INSERT INTO 新表(需要插入的列1, 需要插入的列2, ...) 查詢其他表中的資料內容INSERT INTO studenttemp(`name`, gender)SELECT studentname, studentgender FROM studentinfo;SELECT * FROM studenttemp;-- 注意:新表和舊錶的欄位可以欄位名不一致、順序不一致,但是對應欄位的資料類型必須要一致(資料範圍小的內容放入到資料範圍大的欄位中是可以的)-- ########## 03、子查詢 ##########-- 子查詢:在一個查詢中包含了另一個查詢語句-- 1、【獨立子查詢】:先執行子查詢,再執行外層查詢-- 使用之前建立的courseinfo表 和 teacherinfo表INSERT INTO courseinfo VALUES(NULL, ‘語文‘, 1), (NULL, ‘數學‘, 2), (NULL, ‘英語‘, 1);INSERT INTO teacherinfo VALUES(NULL, ‘張老師‘, ‘男‘, 60), (NULL, ‘王老師‘, ‘女‘, 30), (NULL, ‘李老師‘, ‘男‘, 40);SELECT * FROM courseinfo;SELECT * FROM teacherinfo;-- 需求:列出代課的老師的資訊-- 下句表示的是所有老師的資訊,我們需要的是代課的老師的資訊,所以要去課程資訊表中看看哪些老師代課的,找出來SELECT * FROM teacherinfo;-- 錯誤碼: 1242 Subquery returns more than 1 row(因為子查詢擷取到的是一個集合)SELECT * FROM teacherinfoWHERE teacherid = (SELECT teacherid FROM courseinfo);-- 正確寫法:使用IN判斷欄位的內容和集合中的值是否匹配SELECT *FROM teacherinfoWHERE teacherid IN (SELECT teacherid FROM courseinfo);-- 如下寫法也正確,但是沒有必要這樣做,特別對於大量的資料,使用DISTINCT這個去重複的操作非常耗時,除非迫不得已,否則不使用去重複SELECT *FROM teacherinfoWHERE teacherid IN (SELECT DISTINCT teacherid FROM courseinfo);-- 可以按照如下步驟進行理解:-- step1、得到集合資料(代課的老師編號):SELECT teacherid FROM courseinfo這個子查詢得到 {1, 2, 1}集合-- step2、代課老師的編號是上一步操作中得到的集合中的某一個資料,拿著這個資料到老師資訊表進行篩選SELECT * FROM teacherinfo WHERE teacherid IN (1, 2, 1);-- 需求:尋找單個學生的所有課程成績均及格的學生編號 和 學生姓名-- 顯然發生了語義錯誤:下面子查詢做的事情:-- 只要這門課程的成績大於60分就把其學生編號篩選下留下來了,沒有去管這個學生其他課程成績SELECT studentid AS 學生編號, studentname AS 學生姓名FROM studentinfoWHERE studentid IN (    SELECT studentid    FROM scoreinfo    WHERE score >= 60);SELECT * FROM scoreinfo;-- 正確寫法:-- 寫法1、逆向思路:考慮到正向思路難度比較大,所謂所有課程成績均及格的同學-- 就是刪除了那些只要有課程不及格就算不及格的同學後剩下的同學-- 另外還必須是有成績的同學才是我們要找的那部分同學(需要進行商務邏輯的確認)SELECT studentid AS 學生編號, studentname AS 學生姓名FROM studentinfoWHERE studentid NOT IN(    SELECT studentid    FROM scoreinfo    WHERE score < 60)-- 有課程成績的同學編號AND studentid IN (SELECT studentid FROM scoreinfo);-- 寫法2、正向思路:考慮在成績資訊表中依據學生編號進行分組,擷取組的最小成績大於等於60的同學SELECT studentid AS 學生編號, studentname AS 學生姓名FROM studentinfoWHERE studentid IN (    SELECT studentid    FROM scoreinfo    GROUP BY studentid    HAVING MIN(score) >= 60);SELECT * FROM scoreinfo;-- 使用比較子的子查詢-- 需求:列出不小於選修了課程編號2的學生編號的學生資訊-- 錯誤碼: 1242 Subquery returns more than 1 rowSELECT *FROM studentinfoWHERE studentid >= (SELECT studentid FROM scoreinfo WHERE courseid = 2);-- 正確寫法:雖然沒有大於等於某個範圍的關鍵字或是符號,但是可以大於等於這個範圍中最大的那個資料值SELECT *FROM studentinfoWHERE studentid >= (SELECT MAX(studentid) FROM scoreinfo WHERE courseid = 2);-- 使用EXISTS關鍵字的子查詢:如果子查詢查詢到了結果,外層的查詢才執行;否則的話,外層的查詢不執行-- 需求:有課程成績大於等於90分的同學就列出全部的學生資訊SELECT *FROM studentinfoWHERE EXISTS (SELECT * FROM scoreinfo WHERE score >= 90);-- 需求:有課程成績大於90分的同學就列出全部的學生資訊SELECT *FROM studentinfoWHERE EXISTS (SELECT * FROM scoreinfo WHERE score > 90);-- 使用ANY 或 SOME 的子查詢-- 需求:列出編號大於任一個選修了課程編號2的學生編號的學生資訊SELECT *FROM studentinfoWHERE studentid >= ANY(SELECT studentid FROM scoreinfo WHERE courseid = 2);-- 上句等價於下句:列出編號大於選修了課程編號2的學生編號最小那個編號的學生資訊SELECT *FROM studentinfoWHERE studentid >= (SELECT MIN(studentid) FROM scoreinfo WHERE courseid = 2);-- 關鍵字SOME 和 關鍵字ANY 是同義字SELECT *FROM studentinfoWHERE studentid >= SOME(SELECT studentid FROM scoreinfo WHERE courseid = 2);-- 使用ALL的子查詢-- 需求:列出學生編號不小於所有選修了課程編號2的學生編號的學生資訊SELECT *FROM studentinfoWHERE studentid >= ALL(SELECT studentid FROM scoreinfo WHERE courseid = 2);-- 上句可以理解為:大於等於查詢出課程編號2的學生學號這個範圍中最大的那個資料值SELECT *FROM studentinfoWHERE studentid >= (SELECT MAX(studentid) FROM scoreinfo WHERE courseid = 2);-- 結合常見的情境:客戶資訊  和  訂單資訊來看看子查詢的使用-- 客戶資訊表CREATE TABLE customers(    customerid INT AUTO_INCREMENT PRIMARY KEY,    customername VARCHAR(10) NOT NULL);INSERT INTO customers VALUES(NULL, ‘張三‘), (NULL, ‘李四‘), (NULL, ‘王五‘), (NULL, ‘趙六‘);-- 訂單資訊表CREATE TABLE orders(    orderid INT AUTO_INCREMENT PRIMARY KEY,    customerid INT NOT NULL,    -- 金額    amount DECIMAL(10, 2) NOT NULL,    -- 訂單類型:現金、信用卡    ordertype VARCHAR(10) NOT NULL);INSERT INTO orders VALUES(NULL, 1, 22.25, ‘現金‘), (NULL, 2, 11.75, ‘信用卡‘), (NULL, 2, 5.00, ‘信用卡‘), (NULL, 2, 8.00, ‘現金‘),(NULL, 3, 9.33, ‘信用卡‘), (NULL, 3, 10.11, ‘信用卡‘);SELECT * FROM customers;SELECT * FROM orders;-- 1、獨立子查詢作為資料來源(包含資料的集合)的使用-- 需求:以客戶為單位,統計每個客戶的現金消費總數-- 1)篩選在分組後做-- 錯誤碼: 1054 Unknown column ‘ordertype‘ in ‘having clause‘-- 分析:因為按照customerid進行分組形成的每個組中會有不同的ordertypeSELECT customerid AS 客戶編碼, SUM(amount) AS 現金消費總數FROM ordersGROUP BY customeridHAVING ordertype = ‘現金‘;-- 2)篩選在分組前做,考慮使用子查詢-- 錯誤碼: 1248 Every derived table must have its own aliasSELECT *FROM (    SELECT customerid AS 客戶編碼, SUM(amount) AS 現金消費總數    FROM orders    WHERE ordertype = ‘現金‘    GROUP BY customerid);-- 正確寫法:SELECT *FROM (    SELECT customerid AS 客戶編碼, SUM(amount) AS 現金消費總數    FROM orders    WHERE ordertype = ‘現金‘    GROUP BY customerid) AS temp;-- 不使用星號萬用字元,使用具體欄位-- 錯誤碼: 1054 Unknown column ‘customerid‘ in ‘field list‘SELECT customerid AS 客戶編碼, SUM(amount) AS 現金消費總數FROM (    SELECT customerid AS 客戶編碼, SUM(amount) AS 現金消費總數    FROM orders    WHERE ordertype = ‘現金‘    GROUP BY customerid) AS temp;-- 正確寫法:-- 寫法1SELECT 客戶編碼, 現金消費總數FROM (    SELECT customerid AS 客戶編碼, SUM(amount) AS 現金消費總數    FROM orders    WHERE ordertype = ‘現金‘    GROUP BY customerid) AS temp;-- 寫法2SELECT temp.客戶編碼, temp.現金消費總數FROM (    SELECT customerid AS 客戶編碼, SUM(amount) AS 現金消費總數    FROM orders    WHERE ordertype = ‘現金‘    GROUP BY customerid) AS temp;-- 2、關聯子查詢-- 1)在查詢條件中使用關聯子查詢-- 需求:查詢出消費總計小於20元的客戶資訊SELECT * FROM orders;-- 寫法1、使用獨立子查詢SELECT *FROM customersWHERE customerid IN(    SELECT customerid    FROM orders    GROUP BY customerid    HAVING SUM(amount) < 20);-- 寫法2、使用關聯子查詢-- 【使用關聯子查詢時,子查詢不再像獨立子查詢那樣可以獨立執行,也不再像獨立子查詢那樣先執行】SELECT *FROM customers AS cWHERE (    SELECT customerid    FROM orders AS o    WHERE o.customerid = c.customerid    GROUP BY o.customerid    HAVING SUM(o.amount) < 20);-- 可以理解為:分步操作,在查詢條件中的關聯子查詢相當於遍曆外層表中關聯欄位的每一行記錄-- 在這裡,查詢條件中的關聯子查詢使用的關聯欄位customerid相當於遍曆外層的customers表中的customerid這個關聯欄位的每一行記錄-- 因為關聯子查詢中涉及到使用外層表中的關聯欄位,所以關聯子查詢就無法獨立執行-- 第1行記錄SELECT customeridFROM orders AS oWHERE o.customerid = 1GROUP BY o.`customerid`HAVING SUM(o.`amount`) < 20;-- 第2行記錄SELECT customeridFROM orders AS oWHERE o.customerid = 2GROUP BY o.`customerid`HAVING SUM(o.`amount`) < 20;-- 第3行記錄(查詢到了滿足條件的記錄,所以留下來)SELECT customeridFROM orders AS oWHERE o.customerid = 3GROUP BY o.`customerid`HAVING SUM(o.`amount`) < 20;-- 第4行記錄SELECT customeridFROM orders AS oWHERE o.customerid = 4GROUP BY o.`customerid`HAVING SUM(o.`amount`) < 20;-- 2)關聯子查詢作為一個計算的列-- 需求:列出客戶姓名以及客戶的個人消費數量-- 分析:單個的擷取客戶姓名 或是 單個的擷取客戶的個人消費數量都好辦,但是要在一個查詢結果中出現這兩者有些麻煩,藉助於關聯子查詢SELECT * FROM orders;SELECT * FROM customers;SELECT customerid AS 客戶編碼, COUNT(*) AS 客戶的個人消費數量FROM ordersGROUP BY customerid;SELECT    customername AS 客戶姓名,    (        SELECT COUNT(o.orderid) AS 消費數量        FROM orders AS o        WHERE o.customerid = c.customerid    ) AS 個人消費數量FROM customers AS c;-- 可以理解為:分步操作,在列中的關聯子查詢相當於遍曆外層表中關聯欄位的每一行記錄-- 在這裡,查詢條件中的關聯子查詢使用的關聯欄位customerid相當於遍曆外層的customers表中的customerid這個關聯欄位的每一行記錄-- 因為關聯子查詢中涉及到使用外層表中的關聯欄位,所以關聯子查詢就無法獨立執行-- 第1行記錄SELECT COUNT(o.orderid) AS 消費數量FROM orders AS oWHERE o.customerid = 1-- 第2行記錄SELECT COUNT(o.orderid) AS 消費數量FROM orders AS oWHERE o.customerid = 2-- 第3行記錄SELECT COUNT(o.orderid) AS 消費數量FROM orders AS oWHERE o.customerid = 3-- 第4行記錄SELECT COUNT(o.orderid) AS 消費數量FROM orders AS oWHERE o.customerid = 4-- 子查詢的總結:-- 1、獨立子查詢:可以獨立執行,且先執行-- 2、關聯子查詢:不可以獨立執行,且伴隨著外層查詢的操作,每一次都被調用-- ########## 04、表的串連 ##########-- 常用的情境:部門 和 員工 是 一對多的關係,部門是一,員工是多-- 為了體現這種一對多的關係,在員工資訊表中放置部門編號這個欄位-- 部門表CREATE TABLE dept(    deptid INT AUTO_INCREMENT PRIMARY KEY,    deptname VARCHAR(20) UNIQUE NOT NULL);-- 員工表CREATE TABLE employee(    employeeid INT AUTO_INCREMENT PRIMARY KEY,    employeename VARCHAR(10) NOT NULL,    deptid INT NULL);-- 類比資料INSERT INTO dept VALUES(NULL, ‘開發部‘), (NULL, ‘銷售部‘), (NULL, ‘總經辦‘), (NULL, ‘人事部‘);INSERT INTO employee VALUES(NULL, ‘劉備‘, 1), (NULL, ‘張飛‘, 1), (NULL, ‘關羽‘, 1),(NULL, ‘曹操‘, 2), (NULL, ‘荀彧‘, 2), (NULL, ‘郭嘉‘, 2),(NULL, ‘孫權‘, 3), (NULL, ‘周瑜‘, 3), (NULL, ‘陸遜‘, 3),(NULL, ‘孟獲‘, NULL), (NULL, ‘于吉‘, 5);SELECT * FROM dept;SELECT * FROM employee;-- 1、交叉串連(CROSS JOIN):擷取笛卡爾積(笛卡兒積)-- 交叉串連:不加任何限制條件,把兩個實體(分別有m條記錄 和 n條記錄)進行串連,形成m*n條記錄的新的集合-- 寫法1SELECT * FROM dept, employee;-- 寫法2、顯式使用CROSS JOIN關鍵字(推薦寫法)SELECT * FROM dept CROSS JOIN employee;-- 2、內串連(INNER JOIN):在交叉串連上進行條件限制(篩選)-- 需求:查詢出員工資訊及其對應的所屬部門的名稱-- 分析:上述取得的笛卡爾積沒有任何條件的限制,很多資料是沒用意義的--          我們需要根據員工資訊表中的部門唯一標識-----部門編號,到部門資訊表中擷取部門的相應資訊出來--         也就是員工資訊表中的部門編號應該和部門資訊表中的部門編號對應起來-- 考慮使用INNER JOIN關鍵字 和 WHERE子句SELECT *FROM dept INNER JOIN employeeWHERE dept.`deptid` = employee.`deptid`;-- 改進SELECT employee.`employeeid` AS 員工編號, employee.`employeename` AS 員工姓名, dept.`deptname` AS 部門名稱FROM dept INNER JOIN employeeWHERE dept.`deptid` = employee.`deptid`;-- 可以理解為:首先取得交叉串連的笛卡爾積,再針對笛卡爾積使用條件限制,就得到了內串連的結果SELECT employee.`employeeid` AS 員工編號, employee.`employeename` AS 員工姓名, dept.`deptname` AS 部門名稱FROM dept CROSS JOIN employeeWHERE dept.`deptid` = employee.`deptid`;-- 上述寫法等價於SELECT employee.`employeeid` AS 員工編號, employee.`employeename` AS 員工姓名, dept.`deptname` AS 部門名稱FROM dept, employeeWHERE dept.`deptid` = employee.`deptid`;-- 對於串連的對應關係的描述,SQL中提供了 ON 關鍵字SELECT employee.`employeeid` AS 員工編號, employee.`employeename` AS 員工姓名, dept.`deptname` AS 部門名稱FROM dept INNER JOIN employeeON dept.`deptid` = employee.`deptid`;-- 3、外串連(OUTER JOIN)-- 理解:這裡的外,是針對作為重點的那個集合而言的-- 1)左外串連/左串連(LEFT OUTER JOIN/LEFT JOIN):-- 以左邊的表為主,右邊的表中能匹配的上的資料列出來,匹配不上的顯示為NULL值-- 2)右外串連/右串連(RIGHT OUTER JOIN/RIGHT JOIN):-- 以右邊的表為主,左邊的表中能匹配的上的資料列出來,匹配不上的顯示為NULL值-- 需求:列出公司全部的部門以及部門的員工資訊(多行顯示)-- 分析:重點在全部的部門,另外要列出的是全部部門中每個部門對應的員工的資訊--          隱含的意思,哪怕這個部門沒有員工,也要列出這個部門來,沒有員工時,員工資訊就顯示為NULL值--          但是,員工沒有部門的,不考慮SELECT *FROM deptLEFT OUTER JOIN employeeON dept.`deptid` = employee.`deptid`;-- 寫法1、使用LEFT OUTER JOINSELECT dept.`deptname` AS 部門名稱, employee.`employeeid` AS 員工編號, employee.`employeename` AS 員工姓名FROM deptLEFT OUTER JOIN employeeON dept.`deptid` = employee.`deptid`;-- 寫法2、使用LEFT JOINSELECT dept.`deptname` AS 部門名稱, employee.`employeeid` AS 員工編號, employee.`employeename` AS 員工姓名FROM deptLEFT JOIN employeeON dept.`deptid` = employee.`deptid`;-- 需求:列出公司全部的員工以及員工的部門資訊-- 分析:重點在全部的員工上,另外要列出的是全部員工中每個員工對應的部門的資訊--          隱含的意思,哪怕這個員工沒有部門,也要列出這個員工來,沒有部門時,部門資訊就顯示為NULL值-- 寫法1、使用左串連寫法SELECT employee.`employeeid` AS 員工編號, employee.`employeename` AS 員工姓名, dept.`deptname` AS 部門名稱FROM employeeLEFT JOIN deptON employee.`deptid` = dept.`deptid`;-- 寫法2、使用右串連寫法SELECT employee.`employeeid` AS 員工編號, employee.`employeename` AS 員工姓名, dept.`deptname` AS 部門名稱FROM deptRIGHT OUTER JOIN employeeON employee.`deptid` = dept.`deptid`;-- 簡化SELECT employee.`employeeid` AS 員工編號, employee.`employeename` AS 員工姓名, dept.`deptname` AS 部門名稱FROM deptRIGHT JOIN employeeON employee.`deptid` = dept.`deptid`;-- 4、自串連(內串連的變體)-- 需求:設計公司的組織架構資訊表(這種設計很重要:務必掌握)-- 蔡氏國際--            蔡氏中國--                    蔡氏安徽--                    蔡氏北京--                    蔡氏上海--            蔡氏美國--                    蔡氏紐約--                    蔡氏德州--            蔡氏日本--                    蔡氏關東--                    蔡氏關西-- 考慮樹形結構來進行描述,描述樹結構上的節點的位置,需要描述其當前的節點和它的父節點,這樣才能確定它的位置-- 公司組織圖資訊表CREATE TABLE companyinfo(    -- 組織編號    companyid INT AUTO_INCREMENT PRIMARY KEY,    -- 組織名稱    companyname VARCHAR(10) NOT NULL,    -- 組織父編號    companypid INT NOT NULL);-- 類比資料INSERT INTO companyinfo VALUES(NULL, ‘蔡氏國際‘, 0),(NULL, ‘蔡氏中國‘, 1), (NULL, ‘蔡氏美國‘, 1), (NULL, ‘蔡氏日本‘, 1),(NULL, ‘蔡氏安徽‘, 2), (NULL, ‘蔡氏北京‘, 2), (NULL, ‘蔡氏上海‘, 2),(NULL, ‘蔡氏紐約‘, 3), (NULL, ‘蔡氏德州‘, 3), (NULL, ‘蔡氏關東‘, 4), (NULL, ‘蔡氏關西‘, 4);SELECT * FROM companyinfo;-- 需求:根據給定的組織名稱查看其組織編號及其下一級-- 思路:首先按給定的組織名稱擷取其組織編號,再拿著這個組織編號做companypid父編號在表中查詢,得到其下一級-- 分步操作如下:-- step1、首先按給定的組織名稱擷取其組織編號SELECT companyid AS 組織編號, companyname AS 組織名稱FROM companyinfoWHERE companyname = ‘蔡氏中國‘;-- step2、拿著這個組織編號做companypid父編號在表中查詢,得到其下一級SELECT companyid AS 下一級組織編號, companyname AS 下一級組織名稱FROM companyinfoWHERE companypid = 2;-- 不使用分步操作,使用自串連,將組織資訊表集合1的編號 和 組織資訊表集合2的父編號 進行匹配-- 也就是把左表的編號作為右表的父編號進行匹配SELECT *FROM companyinfo AS c1INNER JOIN companyinfo AS c2ON c1.`companyid` = c2.`companypid`;-- 考慮到需求要根據給定的組織名稱查看其組織編號及其下一級-- 錯誤碼: 1052 Column ‘companyname‘ in where clause is ambiguous  companyname列在WHERE子句中有歧義(因為有多個companyname欄位)SELECT *FROM companyinfo AS c1INNER JOIN companyinfo AS c2ON c1.`companyid` = c2.`companypid`WHERE companyname = ‘蔡氏中國‘;-- 正確寫法1、篩選條件中使用 ON  和  WHERESELECT c1.`companyid` AS 組織編號, c1.`companyname` AS 組織名稱, c2.`companyname` AS 下一級組織名稱FROM companyinfo AS c1INNER JOIN companyinfo AS c2ON c1.`companyid` = c2.`companypid`WHERE c1.companyname = ‘蔡氏中國‘;-- 正確寫法2、篩選條件中使用 ONSELECT c1.`companyid` AS 組織編號, c1.`companyname` AS 組織名稱, c2.`companyname` AS 下一級組織名稱FROM companyinfo AS c1INNER JOIN companyinfo AS c2ON c1.`companyid` = c2.`companypid` AND c1.companyname = ‘蔡氏中國‘;-- 正確寫法2、篩選條件中使用 WHERESELECT c1.`companyid` AS 組織編號, c1.`companyname` AS 組織名稱, c2.`companyname` AS 下一級組織名稱FROM companyinfo AS c1INNER JOIN companyinfo AS c2WHERE c1.`companyid` = c2.`companypid` AND c1.companyname = ‘蔡氏中國‘;-- 需求:查看一級組織(一級子公司)及其下一級組織(多行顯示)SELECT c1.`companyid` AS 組織編號, c1.`companyname` AS 一級組織名稱, c2.`companyname` AS 下一級組織名稱FROM companyinfo AS c1INNER JOIN companyinfo AS c2WHERE c1.`companyid` = c2.`companypid` AND c1.`companypid` = 1;-- 需求:查看一級組織(一級子公司)及其下一級組織(單行顯示)SELECT temp.組織編號, temp.一級組織名稱, GROUP_CONCAT(temp.下一級組織名稱) AS 下一級組織名稱FROM(    SELECT c1.`companyid` AS 組織編號, c1.`companyname` AS 一級組織名稱, c2.`companyname` AS 下一級組織名稱    FROM companyinfo AS c1    INNER JOIN companyinfo AS c2    WHERE c1.`companyid` = c2.`companypid` AND c1.`companypid` = 1) AS tempGROUP BY temp.組織編號, temp.一級組織名稱;

 

MYSQL<五>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.