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)