MySQL的高级语言

93 阅读9分钟

一、设置模拟用的模板表

create table info1 (id int,name varchar(10) primary key not null ,score decimal(5,2),address varchar(20),hobbid int(5));

insert into info1 values(1,'lily',80,'BA',2);
insert into info1 values(2,'haiyuon',90,'SL',2);
insert into info1 values(3,'sullyoon',60,'SL',4);
insert into info1 values(4,'jinni',99,'FS',5);
insert into info1 values(5,'bae',98,'AS',3);
insert into info1 values(6,'jiwoo',10,'SH',3);
insert into info1 values(7,'kuyjin',11,'NJ',5);

image.png

二、select 查询高级语句

1、按分数排序

mysql> select id,name,score from info order by score;

image.png

2、按分数降序排序

mysql> select id,name,score from info order by score desc;

image.png

3、order by 结合where进行条件过滤

mysql> select name,score from info where address='hangzhou' order by score desc;

筛选地址是杭州的学生按分数降序排列

image.png

ps:ORDER BY 语句也可以使用多个字段来进行排序,当排序的第一个字段相同的记录有多条的情况下,这些多条的记录再按照第二个字段进行排序,ORDER BY 后面跟多个字段时,字段之间使用英文逗号隔开,优先级是按先后顺序而定 但order by 之后的第一个参数只有在出现相同值时,第二个字段才有意义

4、AND/OR ——且/或

mysql> select * from info where score >70 and score <=90;

image.png mysql> select * from ky19 where score >70 or score <=90;

image.png 嵌套/多条件: mysql> select * from info where score >70 or (score >75 and score <90);

image.png

5、distinct 查询不重复记录

mysql> select distinct hobbid from info;

image.png

6、对结果进行分组

通过 SQL 查询出来的结果,还可以对其进行分组,使用 GROUP BY 语句来实现 ,GROUP BY 通常都是结合聚合函数一起使用的,常用的聚合函数包括:计数(COUNT)、 求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN),GROUP BY 分组的时候可以按一个或多个字段对结果进行分组处理。 SELECT column_name, aggregate_function(column_name)FROM table_name WHERE column_name operator value GROUP BY column_name;

按hobbid相同的分组,计算相同分数的学生个数(基于name个数进行计数)

mysql> select count(name),hobbid from info group by hobbid;

image.png

结合where语句,筛选分数大于等于80的分组,计算学生个数

mysql> select count(name),hobbid from info where score>=80 group by hobbid;

image.png

结合order by把计算出的学生个数按升序排列

mysql> select count(name),score,hobbid from info where score>=80 group by hobbid order by count(name) asc;

image.png

7、limit 限制输出

查询所有信息显示前4行记录

mysql> select * from info limit 3;

image.png

从第4行开始,往后显示3行内容

mysql> select * from info limit 3,3;

image.png

基础select 小的升阶 怎么输出最后三行

mysql> select id,name from info order by id desc limit 3;

image.png

8.设置别名

在 MySQL 查询时,当表的名字比较长或者表内某些字段比较长时,为了方便书写或者 多次使用相同的表,可以给字段列或表设置别名。使用的时候直接使用别名,简洁明了,增强可读性

查询info表的字段数量,以number显示

mysql> select count(*) as number from info;

image.png

9、通配符

通配符主要用于替换字符串中的部分字符,通过部分字符的匹配将相关结果查询出来。

通常通配符都是跟 LIKE 一起使用的,并协同 WHERE

查询名字是l开头的记录

mysql> select id,name from info where name like 'l%';

image.png

查询名字里是l和i中间有一个字符的记录

mysql> select id,name from info where name like 'li_i';

image.png

查询地址以s开头的记录

mysql> select id,address from info where address like 's%_';

image.png

10、子查询

子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语 句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一 步的查询过滤。

多表查询

mysql> select id,name,score from info where id in (select * from ky23);

image.png

查询分数大于80的记录

mysql> select name,score from info1 where id in (select id from info1 where score>80);

image.png

DELETE 也适用于子查询

删除分数大于80的记录

mysql> delete from info where id in (select id where score>80);

image.png

三、MySQL视图

视图:可以被当作是虚拟表或存储查询。

  • 视图跟表格的不同是,表格中有实际储存数据记录,而视图是建立在表格之上的一个架构,它本身并不实际储存数据记录。
  • 临时表在用户退出或同数据库的连接断开后就自动消失了,而视图不会消失。
  • 视图不含有数据,只存储它的定义,它的用途一般可以简化复杂的查询。 比如你要对几个表进行连接查询,而且还要进行统计排序等操作,写SQL语句会很麻烦的,用视图将几个表联结起来,然后对这个视图进行查询操作,就和对一个表查询一样,很方便。
 CREATE VIEW "视图表名" AS "SELECT 语句";   #创建视图表
 ​
 DROP VIEW "视图表名";                     #删除视图表

单表创建

image.png

image.png

多表创建

image.png

修改原表数据

image.png

NULL 值

在 SQL 语句使用过程中,经常会碰到 NULL 这几个字符。通常使用 NULL 来表示缺失 的值,也就是在表中该字段是没有值的。如果在创建表时,限制某些字段不为空,则可以使用 NOT NULL 关键字,不使用则默认可以为空。在向表内插入记录或者更新记录时,如果该字段没有 NOT NULL 并且没有值,这时候新记录的该字段将被保存为 NULL。需要注意 的是,NULL 值与数字 0 或者空白(spaces)的字段是不同的,值为 NULL 的字段是没有 值的。在 SQL 语句中,使用 IS NULL 可以判断表内的某个字段是不是 NULL 值,相反的用 IS NOT NULL 可以判断不是 NULL 值。

image.png

四、表连接

MYSQL数据库中的三种连接:

  • inner join(内连接):只返回两个表中联结字段相等的行(有交集的值)
  • left join(左连接):返回包括左表中的所有记录和右表中联结字段相等的记录
  • right join(右连接):返回包括右表中的所有记录和左表中联结字段相等的记录

语法: SELECT column_name(s)FROM table1 INNER/LEFT/RIGHT JOIN table2 ON table1.column_name = table2.column_name;

1、左连接(left join)

select * from info1 left join info2 on info1.name=info2.name;

image.png

2、右连接 (RIGHT JOIN)

select * from info1 right join info2 on info1.name=info2.name;

image.png

1、内连接

select info1.id,info1.name from info1 inner join info2 on info1.name=info2.name;

image.png

五、存储过程

存储过程是一组为了完成特定功能的SQL语句集合。

存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。存储过程在执行上比传统SQL速度更快、执行效率更高。

存储过程的优点:

1、执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率。

2、SQL语句加上控制语句的集合,灵活性高。

3、在服务器端存储,客户端调用时,降低网络负载。

4、可多次重复被调用,可随时修改,不影响客户端调用。

5、可完成所有的数据库操作,也可控制数据库的信息访问权限。

创建与调用

 delimiter $$
 create procedure proc01 ()    #创建存储过程,过程名为proc01,不带参数
 -> begin                      #过程体以关键字BEGIN开始
 -> create table student(id int,name char(10),age int);
 -> insert into student values(1,'zhangsan',18);
 -> insert into student values(2,'lisi',18);
 -> select * from student;
 -> end $$                     #过程体以关键字END结束
 ​
 delimiter ;                   #将语句的结束符号恢复为分号
 ​
 call proc01;                  #调用存储过程
 
 show tables           #查看变是否创建成功
 
 select * from students;      #查看表数据

查看存储过程

 show create procedure proc01;
 show create procedure proc01\G       #查看存储过程的具体信息
 ​
 show procedure status like '%Proc01%'\G

删除存储过程

存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。

 drop procedure if exists proc01;
 #仅当存在时删除,不添加If EXISTS 时,如果指定的过程不存在,则产生一个错误。

六、总结

1、select、order by limit的一个结合

对 MySQL 数据库的查询,除了基本的查询外,有时候需要对查询的结果集进行处理。 例如只取 10 条数据、对查询结果进行排序或分组等等。

使用 SELECT 语句可以将需要的数据从 MySQL 数据库中查询出来,如果对查询的结果进行排序,可以使用 ORDER BY 语句来对语句实现排序,并最终将排序后的结果返回给用户。这个语句的排序不光可以针对某一个字段,也可以针对多个字段

ORDER BY 语句也可以使用多个字段来进行排序,当排序的第一个字段相同的记录有多条的情况下,这些多条的记录再按照第二个字段进行排序,ORDER BY 后面跟多个字段时,字段之间使用英文逗号隔开,优先级是按先后顺序而定 但order by 之后的第一个参数只有在出现相同值时,第二个字段才有意义

limit 限制输出的结果记录 在使用 MySQL SELECT 语句进行查询时,结果集返回的是所有匹配的记录(行)。有时候仅 需要返回第一行或者前几行,这时候就需要用到 LIMIT 子句

2、对结果进行分组

通过 SQL 查询出来的结果,还可以对其进行分组,使用 GROUP BY 语句来实现 ,GROUP BY 通常都是结合聚合函数一起使用的,常用的聚合函数包括:计数(COUNT)、 求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN),GROUP BY 分组的时候可以按一个或多个字段对结果进行分组处理。

SELECT column_name, aggregate_function(column_name)FROM table_name WHERE column_name operator value GROUP BY column_name;

3、表连接

  • inner join(内连接):只返回两个表中联结字段相等的行(有交集的值)
  • left join(左连接):返回包括左表中的所有记录和右表中联结字段相等的记录
  • right join(右连接):返回包括右表中的所有记录和左表中联结字段相等的记录

4、存储过程

存储过程是一组为了完成特定功能的SQL语句集合。 存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。存储过程在执行上比传统SQL速度更快、执行效率更高。