1. 程式人生 > >Linux—mysql 語言的sql語言多表操作

Linux—mysql 語言的sql語言多表操作

SQL JOINS

兩個表合併

交叉連線:笛卡爾乘積

內連線:

  • 等值連線:讓表之間的欄位以“等值”建立連線關係;
  • 不等值連線
  • 自然連線:去掉重複列的等值連線
  • 自連線

外連線:

  • 左外連線:
  • FROM tb1T J LEFOIN tb2 ON tb1.col=tb2.col
  • 右外連線
  • FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col

union的用法

union可以縱向把連個型別相同的表合併在一起,,***注意 這裡要求兩個表中的欄位名可以不一樣,但是欄位的型別必須相同才能合併

MariaDB [hellodb]> select stuid,name from students
    -> union 
    -> select tid,name from teachers;
+-------+---------------+
| stuid | name          |
+-------+---------------+
|     1 | Shi Zhongyu   |
|     2 | Shi Potian    |
.........
|    25 | Sun Dasheng   |
|     1 | Song Jiang    |
|     2 | Zhang Sanfeng |
|     3 | Miejue Shitai |
|     4 | Lin Chaoying  |
+-------+---------------+

使用union 合併同一張表的話,它會合並重復的記錄

交叉連線橫向合併兩個表

MariaDB [hellodb]> select * from students cross join teachers;
MariaDB [hellodb]> select * from students cross join teachers;
+-------+---------------+-----+--------+---------+-----------+-----+---------------+-----+--------+
| StuID | Name          | Age | Gender | ClassID | TeacherID | TID | Name          | Age | Gender |
+-------+---------------+-----+--------+---------+-----------+-----+---------------+-----+--------+
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |   1 | Song Jiang    |  45 | M      |
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |   2 | Zhang Sanfeng |  94 | M      |
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |   3 | Miejue Shitai |  77 | F      |
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |   4 | Lin Chaoying  |  93 | F      
MariaDB [hellodb]> select students.name as stud_name,teachers.name teach_name from students cross join teachers;

為了更好的區分合並表後的欄位名稱,所以我們要給 相同欄位的欄位名稱加別名

MariaDB [hellodb]> select s.name stud_name,t.name teach_name,
s.age stud_age,t.age teach_age 
from students as s cross join teachers as t;

多欄位加別名的時候我們也可以考慮給總表先加別名,然後在給欄位加別名

inner join 內交叉

 

MariaDB [hellodb]> select * from students as s inner join teachers as t on s.teacherid=t.tid;
取學生資訊表中的教師編號欄位和教室表中的老師tid欄位進行表與表和聯絡
MariaDB [hellodb]> select * from students as s inner join teachers as t on s.teacherid=t.tid;
+-------+-------------+-----+--------+---------+-----------+-----+---------------+-----+--------+
| StuID | Name        | Age | Gender | ClassID | TeacherID | TID | Name          | Age | Gender |
+-------+-------------+-----+--------+---------+-----------+-----+---------------+-----+--------+
|     5 | Yu Yutong   |  26 | M      |       3 |         1 |   1 | Song Jiang    |  45 | M      |
|     1 | Shi Zhongyu |  22 | M      |       2 |         3 |   3 | Miejue Shitai |  77 | F      |
|     4 | Ding Dian   |  32 | M      |       4 |         4 |   4 | Lin Chaoying  |  93 | F      |
+-------+-------------+-----+--------+---------+-----------+-----+---------------+-----+--------+
MariaDB [hellodb]> select s.name,t.name from students as s inner join teachers as t on s.teacherid=t.tid;
+-------------+---------------+
| name        | name          |
+-------------+---------------+
| Yu Yutong   | Song Jiang    |
| Shi Zhongyu | Miejue Shitai |
| Ding Dian   | Lin Chaoying  |
+-------------+---------------+
MariaDB [hellodb]> select s.name as stud_name,t.name as teach_name from students as s inner join teachers as t on s.teacherid=t.tid;
+-------------+---------------+
| stud_name   | teach_name    |
+-------------+---------------+
| Yu Yutong   | Song Jiang    |
| Shi Zhongyu | Miejue Shitai |
| Ding Dian   | Lin Chaoying  |
+-------------+---------------+
內連線inner join的順序不作要求

lefe join 左外連線

MariaDB [hellodb]> select * from students
    -> left  join
    -> teachers
    -> on students.teacherid=teachers.tid;
+-------+---------------+-----+--------+---------+-----------+------+---------------+------+--------+
| StuID | Name          | Age | Gender | ClassID | TeacherID | TID  | Name          | Age  | Gender |
+-------+---------------+-----+--------+---------+-----------+------+---------------+------+--------+
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |    3 | Miejue Shitai |   77 | F      |
|     2 | Shi Potian    |  22 | M      |       1 |         7 | NULL | NULL          | NULL | NULL   |
|     3 | Xie Yanke     |  53 | M      |       2 |        16 | NULL | NULL          | NULL | NULL   |
|     4 | Ding Dian     |  32 | M      |       4 |         4 |    4 | Lin Chaoying  |   93 | F      |
|     5 | Yu Yutong     |  26 | M      |       3 |         1 |    1 | Song Jiang    |   45 | M      |
MariaDB [hellodb]> select stuid,s.name as stud_name,t.name as teach_name from students as s left  join teachers as t on s.teacherid=t.tid;
+-------+---------------+---------------+
| stuid | stud_name     | teach_name    |
+-------+---------------+---------------+
|     1 | Shi Zhongyu   | Miejue Shitai |
|     2 | Shi Potian    | NULL          |
|     3 | Xie Yanke     | NULL          |
|     4 | Ding Dian     | Lin Chaoying  |
|     5 | Yu Yutong     | Song Jiang    |
|     6 | Shi Qing      | NULL          |

right join 右外連線

MariaDB [hellodb]> select stuid,s.name as stud_name,t.name as teach_name from students as s right  join teachers as t on s.teacherid=t.tid;
+-------+-------------+---------------+
| stuid | stud_name   | teach_name    |
+-------+-------------+---------------+
|     1 | Shi Zhongyu | Miejue Shitai |
|     4 | Ding Dian   | Lin Chaoying  |
|     5 | Yu Yutong   | Song Jiang    |
|  NULL | NULL        | Zhang Sanfeng |
+-------+-------------+---------------+

MariaDB [hellodb]> select * from students as s left join teachers as t on s.teacherid=t.tid where t.tid is null;
+-------+---------------+-----+--------+---------+-----------+------+------+------+--------+
| StuID | Name          | Age | Gender | ClassID | TeacherID | TID  | Name | Age  | Gender |
+-------+---------------+-----+--------+---------+-----------+------+------+------+--------+
|     2 | Shi Potian    |  22 | M      |       1 |         7 | NULL | NULL | NULL | NULL   |
|     3 | Xie Yanke     |  53 | M      |       2 |        16 | NULL | NULL | NULL | NULL   |
|    24 | Xu Xian       |  27 | M      |    NULL |      NULL | NULL | NULL | NULL | NULL   |
|    25 | Sun Dasheng   | 100 | M      |    NULL |      NULL | NULL | NULL | NULL | NULL   |
+-------+---------------+-----+--------+---------+-----------+------+------+------+--------+

子查詢

 

子查詢:在查詢語句巢狀著查詢語句,效能較差

基於某語句的查詢結果再次進行的查詢

用在WHERE子句中的子查詢:

用於比較表示式中的子查詢;子查詢僅能返回單個值

SELECT Name,Age FROM students WHERE Age>(SELECT avg(Age)

FROM students);

用於IN中的子查詢:子查詢應該單鍵查詢並返回一個或多個值從構成列表

SELECT Name,Age FROM students WHERE Age IN (SELECT Age

FROM teachers);

用於EXISTS

 

多表查詢

用於FROM子句中的子查詢

使用格式: SELECT tb_alias.col1,... FROM (SELECT clause) AS tb_alias

WHERE Clause;

示例:

SELECT s.aage,s.ClassID FROM (SELECT avg(Age) AS aage,ClassID

FROM students WHERE ClassID IS NOT NULL GROUP BY ClassID) AS s

WHERE s.aage>30;

聯合查詢: UNION

SELECT Name,Age FROM students UNION SELECT Name,Age FROM

teachers;

子查詢例子:

MariaDB [hellodb]> select * from students where age >(select avg(age) from students);
+-------+--------------+-----+--------+---------+-----------+
| StuID | Name         | Age | Gender | ClassID | TeacherID |
+-------+--------------+-----+--------+---------+-----------+
|     3 | Xie Yanke    |  53 | M      |       2 |        16 |
|     4 | Ding Dian    |  32 | M      |       4 |         4 |
|     6 | Shi Qing     |  46 | M      |       5 |      NULL |
|    13 | Tian Boguang |  33 | M      |       2 |      NULL |
|    25 | Sun Dasheng  | 100 | M      |    NULL |      NULL |
+-------+--------------+-----+--------+---------+-----------+

MariaDB [hellodb]> select st.name student_name,sc.score from students as st inner join scores as sc on st.stuid=sc.id;
+---------------+-------+
| student_name  | score |
+---------------+-------+
| Shi Zhongyu   |    77 |
| Shi Potian    |    93 |
| Xie Yanke     |    47 |
| Ding Dian     |    97 |
| Yu Yutong     |    88 |
| Shi Qing      |    75 |
| Xi Ren        |    71 |
| Lin Daiyu     |    89 |
| Ren Yingying  |    39 |
| Yue Lingshan  |    63 |
| Yuan Chengzhi |    96 |
| Wen Qingqing  |    86 |
| Tian Boguang  |    83 |
| Lu Wushuang   |    57 |
| Duan Yu       |    93 |
+---------------+-------+
MariaDB [hellodb]> select st.name student_name,c.course,sc.score from students as st inner join scores as sc on st.stuid=sc.id inner join courses as c on sc.courseid=c.courseid;
+---------------+----------------+-------+
| student_name  | course         | score |
+---------------+----------------+-------+
| Shi Zhongyu   | Kuihua Baodian |    77 |
| Shi Potian    | Weituo Zhang   |    93 |
| Xie Yanke     | Kuihua Baodian |    47 |
| Ding Dian     | Daiyu Zanghua  |    97 |
| Yu Yutong     | Kuihua Baodian |    88 |
| Shi Qing      | Weituo Zhang   |    75 |
| Xi Ren        | Daiyu Zanghua  |    71 |
| Lin Daiyu     | Kuihua Baodian |    89 |
| Ren Yingying  | Hamo Gong      |    39 |
| Yue Lingshan  | Dagou Bangfa   |    63 |
| Yuan Chengzhi | Hamo Gong      |    96 |
| Wen Qingqing  | Hamo Gong      |    86 |
| Tian Boguang  | Dagou Bangfa   |    83 |
| Lu Wushuang   | Taiji Quan     |    57 |
| Duan Yu       | Jinshe Jianfa  |    93 |
+---------------+----------------+-------+

sql

檢視

檢視: VIEW,虛表,儲存有實表的查詢結果

建立方法:

  • CREATE VIEW view_name [(column_list)]
  • AS select_statement
  • [WITH [CASCADED | LOCAL] CHECK OPTION]

檢視檢視定義: SHOW CREATE VIEW view_name

刪除檢視:

  • DROP VIEW [IF EXISTS]
  • view_name [, view_name] ...
  • [RESTRICT | CASCADE]

檢視中的資料事實上儲存於“基表”中,因此,其修改操作也會針對基表實現;

其修改操作受基表限制

例子:

MariaDB [hellodb]> select stuid,s.name stud_name,t.name teacher_name from students as s inner join teachers as t on s.teacherid=t.tid; 
+-------+-------------+---------------+
| stuid | stud_name   | teacher_name  |
+-------+-------------+---------------+
|     5 | Yu Yutong   | Song Jiang    |
|     1 | Shi Zhongyu | Miejue Shitai |
|     4 | Ding Dian   | Lin Chaoying  |
+-------+-------------+---------------+
MariaDB [hellodb]> create view view_student_teacher as select stuid,s.name stud_name,t.name teacher_name from students as s inner join teachers as t on s.teacherid=t.tid; 
MariaDB [hellodb]> select * from view_student_teacher;
+-------+-------------+---------------+
| stuid | stud_name   | teacher_name  |
+-------+-------------+---------------+
|     5 | Yu Yutong   | Song Jiang    |
|     1 | Shi Zhongyu | Miejue Shitai |
|     4 | Ding Dian   | Lin Chaoying  |
+-------+-------------+---------------+
MariaDB [hellodb]> show tables;			###檢視本身不是表,它也不能存放資料,它虛擬的表
| view_student_teacher |
+----------------------+
MariaDB [hellodb]> show create view view_student_teacher;   ###檢視視圖表的建立過程
MariaDB [hellodb]> show table status from hellodb\G;		##如何判斷檢視資料庫中的表是檢視還是真正的表;

 

函式

函式:系統函式和自定義函式

系統函式:https://dev.mysql.com/doc/refman/5.7/en/func-op-summaryref.html

自定義函式 (user-defined function UDF)

  • 儲存在mysql.proc表中
  • 建立UDF:

語法:

  • CREATE [AGGREGATE] FUNCTION function_name(parameter_name
  • type,[parameter_name type,...])
  • RETURNS {STRING|INTEGER|REAL}
  • runtime_body

例子:create ....... function 函式名......(引數 type[ ....type,.....])

feturns {string 、integer、real}字串整數\返回值\實數

說明:

  • 引數可以有多個,也可以沒有引數
  • 必須有且只有一個返回值

自定義函式

檢視函式列表:

  • SHOW FUNCTION STATUS;

檢視函式定義

  • SHOW CREATE FUNCTION function_name

刪除UDF:

  • DROP FUNCTION function_name

呼叫自定義函式語法:

  • SELECT function_name(parameter_value,...)

自定義函式

示例:無參UDF

  • CREATE FUNCTION simpleFun() RETURNS VARCHAR(20) RETURN "Hello
  • World!”;

示例:有引數UDF

  • DELIMITER //
  • CREATE FUNCTION deleteById(uid SMALLINT UNSIGNED) RETURNS ##(欄位名—型別—unsigned正整數)returns
  • VARCHAR(20) ### 返回 varchar(20)字串
  • BEGIN ### 函式體
  • DELETE FROM students WHERE stuid = uid;
  • RETURN (SELECT COUNT(stuid) FROM students);
  • END//
  • DELIMITER ;