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 ;