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 ;

猜你喜欢

转载自blog.csdn.net/weixin_42741132/article/details/82961385
今日推荐