当前位置: 首页 > news >正文

MySQL高级语法

视图

作用:将查询语句封装成一张可视化的表,封装的是动态SQL语句,会根据数据表的数据而更新

创建视图

  • 语法:create view 视图名 as 查询语句;

(1)准备数据

MariaDB [db1]> create table ping (-> id int primary key,-> name varchar(20)-> );
Query OK, 0 rows affected (0.008 sec)MariaDB [db1]> insert into ping values(1,'sunyingsha'),(2,'ch;enmeng'),(3,'wangmanyu');
Query OK, 3 rows affected (0.003 sec)
Records: 3  Duplicates: 0  Warnings: 0MariaDB [db1]> select * from ping;
+----+------------+
| id | name       |
+----+------------+
|  1 | sunyingsha |
|  2 | ch;enmeng  |
|  3 | wangmanyu  |
+----+------------+
3 rows in set (0.001 sec)

(2)创建视图

MariaDB [db1]> create view get_ping as select * from ping order by id desc;
Query OK, 0 rows affected (0.003 sec)

查看视图

MariaDB [db1]> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| get_ping      |
| ping          |
| xinxi         |
+---------------+
3 rows in set (0.000 sec)

查看视图结果

MariaDB [db1]> select * from get_ping;
+----+------------+
| id | name       |
+----+------------+
|  3 | wangmanyu  |
|  2 | ch;enmeng  |
|  1 | sunyingsha |
+----+------------+
3 rows in set (0.001 sec)

查看视图创建语句

MariaDB [db1]> show create view get_ping;
+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View     | Create View                                                                                                                                                                            | character_set_client | collation_connection |
+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| get_ping | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `get_ping` AS select `ping`.`id` AS `id`,`ping`.`name` AS `name` from `ping` order by `ping`.`id` desc | utf8                 | utf8_general_ci      |
+----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
1 row in set (0.001 sec)

修改视图

MariaDB [db1]> alter view get_ping as select id from ping;
Query OK, 0 rows affected (0.003 sec)MariaDB [db1]> select * from get_ping;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
+----+
3 rows in set (0.001 sec)

删除视图

MariaDB [db1]> drop view get_ping;
Query OK, 0 rows affected (0.000 sec)

多表关联

  • 语法:select * from 主表名 inner|left|right join 副表名 on 主表.字段=副表.字段;
  • inner join:两边都有记录
  • left join:以主表记录为主
  • right join:以副表记录为主
  • 查询过程中的执行顺序:from>where>group(包含聚合函数,如min、max、avg等)>having>order>select外键

调用函数

  • count:统计
  • distinct:去重
  • avg:获取平均值
  • min/max:最小值/最大值
  • sum:求和
  • year/month/day:获取年/月/日的部分

准备两张数据表

mysql> create database db2;
mysql> use db2
mysql> create table xinxi(
id int auto_increment,
name varchar(20) not null,
sex int(1) not null default 0,
birth datetime,
primary key(id)
);
mysql> alter table xinxi add unique key(name);
mysql> insert into xinxi(name,sex,birth) values('xiaozhan',0,'1990-1-1'),
('luhan',0,'1990-4-20'),('liying',1,'1988-1-1'),('baby',1,'1989-1-1');
mysql> create table paihangbang(
id int not null,
score int,
rank int,
name varchar(20)
);
mysql> insert into paihangbang values(1,100,1,'xiaozhan'),(2,98,2,'luhan'),
(3,97,3,'tangyan'),(4,96,4,'liying');

连接两张数据表

MariaDB [db2]> select * from xinxi inner join paihangbang on-> xinxi.name=paihangbang.name;
+----+----------+-----+---------------------+----+-------+------+----------+
| id | name     | sex | birth               | id | score | rank | name     |
+----+----------+-----+---------------------+----+-------+------+----------+
|  1 | xiaozhan |   0 | 1990-01-01 00:00:00 |  1 |   100 |    1 | xiaozhan |
|  2 | luhan    |   0 | 1990-04-20 00:00:00 |  2 |    98 |    2 | luhan    |
|  3 | liying   |   1 | 1988-01-01 00:00:00 |  4 |    96 |    4 | liying   |
+----+----------+-----+---------------------+----+-------+------+----------+
3 rows in set (0.001 sec)MariaDB [db2]> select * from xinxi left join paihangbang on xinxi.name=paihangbang.name;
+----+----------+-----+---------------------+------+-------+------+----------+
| id | name     | sex | birth               | id   | score | rank | name     |
+----+----------+-----+---------------------+------+-------+------+----------+
|  1 | xiaozhan |   0 | 1990-01-01 00:00:00 |    1 |   100 |    1 | xiaozhan |
|  2 | luhan    |   0 | 1990-04-20 00:00:00 |    2 |    98 |    2 | luhan    |
|  3 | liying   |   1 | 1988-01-01 00:00:00 |    4 |    96 |    4 | liying   |
|  4 | baby     |   1 | 1989-01-01 00:00:00 | NULL |  NULL | NULL | NULL     |
+----+----------+-----+---------------------+------+-------+------+----------+
4 rows in set (0.001 sec)MariaDB [db2]> select * from xinxi right join paihangbang on-> xinxi.name=paihangbang.name;
+------+----------+------+---------------------+----+-------+------+----------+
| id   | name     | sex  | birth               | id | score | rank | name     |
+------+----------+------+---------------------+----+-------+------+----------+
|    1 | xiaozhan |    0 | 1990-01-01 00:00:00 |  1 |   100 |    1 | xiaozhan |
|    2 | luhan    |    0 | 1990-04-20 00:00:00 |  2 |    98 |    2 | luhan    |
| NULL | NULL     | NULL | NULL                |  3 |    97 |    3 | tangyan  |
|    3 | liying   |    1 | 1988-01-01 00:00:00 |  4 |    96 |    4 | liying   |
+------+----------+------+---------------------+----+-------+------+----------+
4 rows in set (0.000 sec)

多表联查

准备数据

#创建数据库:mysql_test
mysql> drop database if exists mysql_test;
mysql> create database mysql_test;
mysql> use mysql_test;
#创建学生表:student
mysql> create table student (
s_id int,
s_name varchar(8),
s_birth date,
s_sex varchar(4)
) default charset utf8;
#插入数据
mysql> insert into student values
(1,'赵雷','1990-01-01','男'),(2,'钱电','1990-12-21','男'),(3,'孙风','1990-05-20','男'),
(4,'李云','1990-08-06','男'),(5,'周梅','1991-12-01','女'),(6,'吴兰','1992-03-01','女'),
(7,'郑竹','1989-07-01','女'),(8,'王菊','1990-01-20','女');
#创建课程表:course
mysql> create table course (
c_id int,
c_name varchar(8),
t_id int
)default charset utf8;
#插入数据
mysql> insert into course values(1,'语文',2),(2,'数学',1),(3,'英语',3);
#创建成绩表score
mysql> create table score (
s_id int,
c_id int,
s_score int
)default charset utf8;
#插入数据
mysql> insert into score values(1,1,80),(1,2,90),(1,3,99),(2,1,70),(2,2,60),
(2,3,65),(3,1,80),(3,2,80),(3,3,80),(4,1,50),(4,2,30),(4,3,40),(5,1,76),
(5,2,87),(6,1,31),(6,3,34),(7,2,89),(7,3,98);

查询需求

(1)查询"李"姓学生的数量

MariaDB [mysql_test]> select count(*) as cnt_name_li from student where s_name like '李%';
+-------------+
| cnt_name_li |
+-------------+
|           1 |
+-------------+
1 row in set (0.001 sec)

(2)查询"01"课程的学生的信息及课程分数


MariaDB [mysql_test]> select s.*,score.s_score from student s inner join score on s.s_id = score.s_id;
+------+--------+------------+-------+---------+
| s_id | s_name | s_birth    | s_sex | s_score |
+------+--------+------------+-------+---------+
|    1 | 赵雷   | 1990-01-01 | 男    |      80 |
|    1 | 赵雷   | 1990-01-01 | 男    |      90 |
|    1 | 赵雷   | 1990-01-01 | 男    |      99 |
|    2 | 钱电   | 1990-12-21 | 男    |      70 |
|    2 | 钱电   | 1990-12-21 | 男    |      60 |
|    2 | 钱电   | 1990-12-21 | 男    |      65 |
|    3 | 孙风   | 1990-05-20 | 男    |      80 |
|    3 | 孙风   | 1990-05-20 | 男    |      80 |
|    3 | 孙风   | 1990-05-20 | 男    |      80 |
|    4 | 李云   | 1990-08-06 | 男    |      50 |
|    4 | 李云   | 1990-08-06 | 男    |      30 |
|    4 | 李云   | 1990-08-06 | 男    |      40 |
|    5 | 周梅   | 1991-12-01 | 女    |      76 |
|    5 | 周梅   | 1991-12-01 | 女    |      87 |
|    6 | 吴兰   | 1992-03-01 | 女    |      31 |
|    6 | 吴兰   | 1992-03-01 | 女    |      34 |
|    7 | 郑竹   | 1989-07-01 | 女    |      89 |
|    7 | 郑竹   | 1989-07-01 | 女    |      98 |
+------+--------+------------+-------+---------+
18 rows in set (0.001 sec)

(3)查询"01"课程比"02"课程成绩高的学生的信息及课程分数

MariaDB [mysql_test]> select s.*,sc1.s_score as score_01,sc2.s_score as score_02-> from student s-> inner join (-> select * from score where c_id = 1-> ) sc1-> on s.s_id = sc1.s_id-> inner join (-> select * from score where c_id = 2-> ) sc2-> on s.s_id = sc2.s_id-> where sc1.s_score > sc2.s_score;
+------+--------+------------+-------+----------+----------+
| s_id | s_name | s_birth    | s_sex | score_01 | score_02 |
+------+--------+------------+-------+----------+----------+
|    2 | 钱电   | 1990-12-21 | 男    |       70 |       60 |
|    4 | 李云   | 1990-08-06 | 男    |       50 |       30 |
+------+--------+------------+-------+----------+----------+
2 rows in set (0.002 sec)

支持中文

方法一:建表时支持中文

MariaDB [db2]> create table tzhong(-> id int,-> name varchar(20),-> sex int)DEFAULT CHARSET=utf8 collate=utf8_general_ci;
Query OK, 0 rows affected (0.008 sec)

测试:

MariaDB [db2]> insert into tzhong values(1,'哈哈哈',0);
Query OK, 1 row affected (0.001 sec)MariaDB [db2]> select * from tzhong;
+------+-----------+------+
| id   | name      | sex  |
+------+-----------+------+
|    1 | 哈哈哈    |    0 |
+------+-----------+------+
1 row in set (0.001 sec)

方法二:建库时支持中文

MariaDB [db2]> create database db10 DEFAULT CHARSET=utf8 collate=utf8_general_ci;
Query OK, 1 row affected (0.001 sec)

测试:

MariaDB [db10]> create table tzhong(-> id int,-> name varchar(20),-> sex int);
Query OK, 0 rows affected (0.006 sec)MariaDB [db10]> show create table tzhong;
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                                                                                      |
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tzhong | CREATE TABLE `tzhong` (`id` int(11) DEFAULT NULL,`name` varchar(20) DEFAULT NULL,`sex` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci |
+--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.001 sec)

方法三:修改服务配置文件

[root@localhost ~]# vim /etc/my.cnf.d/mariadb-server.cnf 
[mysqld]character-set-server=utf8

重启服务,测试:

MariaDB [(none)]> create database 新库;
Query OK, 1 row affected (0.001 sec)MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| db1                |
| db10               |
| db2                |
| information_schema |
| mysql              |
| performance_schema |
| 新库               |
+--------------------+
7 rows in set (0.001 sec)

http://www.dtcms.com/a/389101.html

相关文章:

  • rust编写web服务04-数据库初体验
  • 芋道开源框架应用的小问题。细节!!
  • PyQt6之QDateEdit和QTimeEdit格式设置
  • FTP协议在国产化环境下的最佳替代方案是什么?
  • C语言(长期更新)第18讲:数据在内存中的存储
  • 模块三 进阶微服务
  • Vue3 组件封装原则与实践指南
  • Git合并冲突
  • 部署K8S集群
  • K8S配置管理:ConfigMap与Secret
  • 奥威BI+ChatBI:数据智能时代的一体化解决方案
  • 微服务与云原生实战:Spring Cloud Alibaba 与 Kubernetes 深度整合指南
  • 从慕尼黑到新大陆:知行科技「智驾」与「机器人」的双行线
  • VINTF中manifest.xml和compatibility_matrix.xml的作用
  • AI时代云原生数据库一体机的思考
  • 配置manifest.xml和compatibility_matrix.xml
  • Prometheus高可用监控架构性能优化实践指南
  • 低代码平台与云原生开发理念是否契合?
  • 红队测试手册:使用 promptfoo 深入探索大语言模型安全
  • el-date-picker设置默认值
  • 结语:Electron 开发的完整路径
  • 数据结构系列之线性表
  • Vue2 生命周期钩子详解:beforeCreate、created、mounted、beforeDestroy 用法顺序与坑点指南
  • electron nodejs安装electron 以及解压打包
  • 每日一题:链表排序(归并排序实现)
  • 团体程序设计天梯赛-练习集 L1-032 Left-pad
  • AI的出现,能否代替IT从业者
  • 一个基于Java+Vue开发的灵活用工系统:技术实现与架构解析
  • 原神望陇村遗迹 解谜
  • 半导体制造常提到的Fan-in晶圆级封装是什么?