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 ;