MySQL 数据库SQL语句——高阶版本2

实验准备 数据库表配置:

mysql -uroot -p
show databases; create database train_ticket;
use train_ticket;
create table REGION(region varchar(10),site varchar(20));
create table FARE(site varchar(20),money int(10),date varchar(15)); desc REGION;
desc FARE; insert into REGION values ('south','changsha');
insert into REGION values ('south','nanchang');
insert into REGION values ('north','beijing');
insert into REGION values ('north','tianjin'); insert into FARE values ('changsha',1000,'2021-01-30');
insert into FARE values ('nanchang',700,'2021-01-30');
insert into FARE values ('beijing',1500,'2021-01-30');
insert into FARE values ('tianjin',1200,'2021-01-30');
insert into FARE values ('beijing',2200,'2021-02-05'); select * from REGION;
select * from FARE;

  

MySQL高级SQL语句:

1、EXISTS:

用来测试内查询有没有产生任何结果,类似布尔值是否为真
如果有的话,系统就会执行外查询中的SQL语句,若是没有,那整个SQL语句就不会产生任何结果。

语法:SELECT 字段1 FROM 表1 WHERE EXISTS (SELECT * FROM 表2 WHERE 条件);

例如:

select region from REGION where exists (select * from FARE where money = '700');

2、inner join、left join、right join :

inner join(等值相连) :
只返回两个表中联接字段相等的行

 语法:SELECT 字段 FROM 表1 INNER JOIN 表2 ON 表1.字段 = 表2.字段;  

left join(左联接)
返回包括左表中所有记录和右表中联接字段相等的记录 

语法:SELECT 字段 FROM 表1 LEFT JOIN 表2 ON 表1.字段 = 表2.字段;

  

right join(右联接)
返回包括右表中的所有记录和左表中联接字段相等的记录 

 语法:SELECT 字段 FROM 表1 RIGHT JOIN 表2 ON 表1.字段 = 表2.字段;

  

例如:

update FARE set site='xingjiang' where money='2200';

select * from REGION AS A inner join FARE AS B on A.site = B.site;
select * from REGION AS A left join FARE AS B on A.site = B.site;
select * from REGION AS A right join FARE AS B on A.site = B.site;

3、CREATE VIEW 视图 :

  视图:可被当作虚拟表或存储查询。 视图跟表格不同的是,表格中有实际存储资料,

而视图是建立在表格之上的一个架构,它本身并不实际存储资料。
 
  临时表在用户退出或者同数据库的连接断开后就自动消失了,而视图不会。
 
     视图不含有数据,只存储它的定义,它的用途一般可以简化复杂的查询。比如你要对几个表格进行连接查询,

而且还要进行统计排序等操作,写SQL语句会很麻烦,用视图将几个表格连接起来,然后对这个视图进行查询操作,

就和对一个表查询一样,很方便。

语法:CREATE VIEW 视图表名 AS SELECT语句;

例如:

select A.region,SUM(B.money) from REGION AS A inner join FARE AS B on A.site = B.site GROUP BY region;
create view C AS select A.region,SUM(B.money) from REGION AS A inner join FARE AS B on A.site = B.site GROUP BY region;
show tables;
select * from C;

  

4、UNION 联集 :
 
 将两个SQL语句的结果合并起来,两个SQL语句产生的字段需要是同样的资料种类 UNION:生成结果的资料值将没有重复,且按照字段的顺序进行排序。

语法:SELECT语句1 UNION SELECT语句2; 

UNION ALL:将生成结果的资料值都列出来,无论有无重复

语法:SELECT语句1 UNION ALL SELECT语句2;

例如:

select region from REGION union select money from FARE;
select site from REGION union select site from FARE;
select site from REGION union all select site from FARE;

  

6、交集值:

取2个sql语句结果的交集

例如:

select * from FARE;
insert into FARE values ('xingjiang',2200,'2021-02-05');
select * from FARE; select A.site from FARE AS A inner join REGION AS B on A.site = B.site;
select A.site from FARE AS A inner join REGION AS B using(site); select site from (select site from FARE union all select site from REGION) A group by A.site HAVING count(*) > 1; select site from (select A.site from FARE A inner join REGION B on A.site = B.site) C group by C.site; select site from FARE where site in (select site from REGION);

  

7、无交集值:

显示第一个SQL语句的结果,且与第二个SQL语句没有交集的结果,还不能重复

select distinct site from FARE where (site) not in (select site from REGION);

例如:

select A.*,B.* from FARE A left join REGION B using(site);
select site from FARE A left join REGION B using(site) where B.site is null;
select distinct site from FARE A left join REGION B using(site) where B.site is null;

  

8、case:

是SQL用来作为IF-THEN-ELSE之类逻辑的关键字

语法:
SELECT CASE (字段名)
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
……
ELSE 结果N
END
FROM 表名 #条件可以是一个数值或是公式。ELSE子句不是必须的。

例如:

select * from FARE;

select case site
when 'changsha' then money + 500
when 'tianjin' then money - 500
else money * 2
end
A,site
from FARE;

  

算排名 :

表格自我连接(self join),然后将结果依序列出,算出每一行之前(包括那一行本身)有多少行数
例如:
create table SCORE (name char(10),score int(4));

insert into SCORE values('zhangsan',95);
insert into SCORE values('lisi',96);
insert into SCORE values('wangwu',75);
insert into SCORE values('zhaoliu',80);
insert into SCORE values('qianqi',90);
select * from SCORE;
select A1.name,A1.score,count(A2.score) rank from 	SCORE A1,SCORE A2 where A1.score < A2.score OR (A1.score=A2.score and A1.name=A2.name) group by A1.name order by A1.score desc;

  

#######当A1的score字段值小于A2的score字段值、或者两表score字段值相等并且name字段值相等时,
从A1和A2表中 查询A1的name字段值、A1的score字段值、和A2的score字段的非空值 rank是别名 ,
并为A1的name字段分组,A1的score字段降
A1.score为75时,A2.score可为75、80、90、95、96 则 count(A2.score)为5 
A1.score为80时,A2.score可为80、90、95、96 则 count(A2.score)为4
A1.score为90时,A2.score可为90、95、96 则 count(A2.score)为3
A1.score为95时,A2.score可为95、96 则 count(A2.score)为2
A1.score为96时,A2.score可为96 则 count(A2.score)为1
这样再显示A1的name字段分组,A1的score字段降序排序 ,rank字段
则为下表所示

算中位数:

select * from (select A1.name,A1.score,count(A2.score) rank from SCORE A1,SCORE A2 where A1.score < A2.score OR (A1.score=A2.score and A1.name=A2.name) group by A1.name order by A1.score desc) A3 where A3.rank = (select (count(*)+1) DIV 2 from SCORE);

select score mid from (select A1.name,A1.score,count(A2.score) rank from SCORE A1,SCORE A2 where A1.score < A2.score OR (A1.score=A2.score and A1.name=A2.name) group by A1.name order by A1.score desc) A3 where A3.rank = (select (count(*)+1) DIV 2 from SCORE);

  

算累积总计:

select A1.*,sum(A2.score) sum_socore from SCORE A1,SCORE A2 where A1.score < A2.score or(A1.score=A2.score and A1.name=A2.name) group by A1.name order by A1.score desc;

  

算总合百分百:

select A1.*,A1.score/(select sum(score) from SCORE) z_sum from SCORE A1,SCORE A2 where A1.score < A2.score or (A1.score=A2.score and A1.name=A2.name) group by A1.name;

select sum(socre) from SCORE 是为了算出字段值总合,然后每一行一一除以总合,算出每行的总合百分比。  

算累计总合百分百:

select A1.name,A1.score,sum(A2.score),sum(A2.score)/(select sum(score) from SCORE) Z from SCORE A1,SCORE A2 where A1.score < A2.score or (A1.score=A2.score and A1.name=A2.name) group by A1.name order by A1.score desc;

select A1.name,A1.score,sum(A2.score),TRUNCATE(sum(A2.score)/(select sum(score) from SCORE),2) ||'%' Z from SCORE A1,SCORE A2 where A1.score < A2.score or (A1.score=A2.score and A11.name=A2.name) group by A1.name order by A1.score desc;

  

空值(null)和无值(’’)的区别

  1. 无值的长度为0,不占用空间;而空值null 的长度是null,是占用空间的
  2. IS NULL或者IS NOT NULL,是用来判断字段是不是NULL或者不是NULL,是不能查出是不是无值的
  3. 无值的判断使用=’‘或者<>’'来处理。<>代表不等于
  4. 在通过count()指定字段统计又多少行数时,如果遇到NULL值会自动忽略掉,遇到空值会自动加入记录中进行计算
create table SITE(site varchar(20));
insert into SITE values('nanjing');
insert into SITE values('beijing');
insert into SITE values('');
insert into SITE values('taijin');
insert into SITE values();
insert into SITE values('');
select * from SITE;

  

select length(site) from SITE;
select * from SITE where site is NULL;
select * from SITE where site is not NULL;
select * from SITE where site ='';
select * from SITE where site <> '';

  

正则表达式:(shell一样)

匹配模式			描述						实例
^ 匹配文本的开始字符 ‘^bd’ 匹配以 bd 开头的字符串
$ 匹配文本的结束字符 ‘qn$’ 匹配以 qn 结尾的字符串
. 匹配任何单个字符 ‘s.t’ 匹配任何 s 和 t 之间有一个字符的字符串
* 匹配零个或多个在它前面的字符 ‘fo*t’ 匹配 t 前面有任意个 o
+ 匹配前面的字符 1 次或多次 ‘hom+’ 匹配以 ho 开头,后面至少一个m 的字符串
字符串 匹配包含指定的字符串 ‘clo’ 匹配含有 clo 的字符串
p1|p2 匹配 p1 或 p2 ‘bg|fg’ 匹配 bg 或者 fg
[...] 匹配字符集合中的任意一个字符 ‘[abc]’ 匹配 a 或者 b 或者 c
[^...] 匹配不在括号中的任何字符 ‘[^ab]’ 匹配不包含 a 或者 b 的字符串
{n} 匹配前面的字符串 n 次 ‘g{2}’ 匹配含有 2 个 g 的字符串
{n,m} 匹配前面的字符串至少 n 次,至多m 次 ‘f{1,3}’ 匹配 f 最少 1 次,最多 3 次
语法:SELECT 字段 FROM 表名 WHERE 字段 REGEXP 匹配模式 

例如:

select * from FARE where site regexp '^[n]';
select * from FARE where site regexp '[n]';
select * from FARE where site regexp 'jin|jing';

  

存储过程(与Shell函数差不多,代码的复用) :

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

  1. 执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
  2. SQL语句加上控制语句的集合,灵活性高
  3. 在服务器端存储,客户端调用时,降低网络负载
  4. 可多次重复被调用,可随时修改,不影响客户端调用
  5. 可完成所有的数据库操作,也可控制数据库的信息访问权限
语法:
DELIMITER !! #将语句的结束符号从分号;临时修改,以防出问题,可以自定义
CREATE PROCEDURE XXX() #创建存储过程,过程名自定义,()可带参数
BEGIN #过程体以关键字BEGIN开始
select * from xxx; #过程体语句
END!! #过程体以关键字END结尾
DELIMITER ; #将语句的结束符号恢复为分号 call XXX; #调用存储过程 -----查看存储过程-----
show create procedure [数据库.]储存过程名; #查看某个储存过程的具体信息
show create procedure XXX;
show procedure status [like '%XXX%'] \G

  

例如:

DELIMITER !!
CREATE PROCEDURE KIND1()
BEGIN
select * from FARE;
END!! DELIMITER ;
CALL KIND1;
show create procedure train_ticket.KIND1\G
show procedure status like '%KIND1%'\G

  

存储过程的条件语句:

DELIMITER !!
CREATE PROCEDURE KIND3(IN num int(10))
BEGIN
declare var int;
set var=num*2;
if var>=10 then
update FARE set money=money+1;
else
update FARE set money=money-1;
end if;
END!!
DELIMITER ; 
CALL KIND3(5);
CALL KIND3(4);

  

循环语句while:

create table akg(id int);

DELIMITER !!
CREATE PROCEDURE KIND4()
BEGIN
declare var int;
set var=0;
while var<5 do
insert into akg values(var);
set var=var+1;
end while;
END!! DELIMITER ;
CALL KIND4;
select * from akg;

  

MySQL 数据库SQL语句——高阶版本2的更多相关文章

  1. MySQL 数据库SQL语句——高阶版本1

    MySQL 数据库SQL语句--高阶版本 实验准备,数据表配置 mysql -uroot -p show databases; create database train_ticket; use tr ...

  2. MySQL数据库SQL语句基本操作

    一.用户管理: 创建用户: create user '用户名'@'IP地址' identified by '密码'; 删除用户: drop user '用户名'@'IP地址'; 修改用户: renam ...

  3. MySQL数据库sql语句的一些简单优化

    1.查询条件的先后顺序 有多个查询条件时,要把效率高能更精确筛选记录的条件放在后边.因为MySQL解析sql语句是从后往前的(不知是否准确). 例: select a.*,b.* from UsrIn ...

  4. MySQL 数据库--SQL语句优化

    explain查询和分析sql 开发中,为满足一业务功能,使用mysql书写sql时,一条sql往往有多种写法,那么我们就需要选择执行效率比较高的sql. 因此要比较分析sql的执行过程,且同一条sq ...

  5. mySQL数据库Sql语句执行效率检查--Explain命令

    mysql性能的检查和调优方法 Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的 ...

  6. MYSQL数据库SQL语句集锦

    *特别说明:FILED代表数据表字段,CONDITIONS代表where之后的条件,TABLENAME代表数据表名   []中括号内的内容代表 可有可无. 创建数据库 create  database ...

  7. MySql数据库SQL语句将编码

    -- 查看所有字符编码 SHOW CHARACTER SET; -- 查看创建数据库的指令并查看数据库使用的编码 show create database dbtest; -- 查看数据库编码: sh ...

  8. MySQL数据库sql语句

    零.用户管理: 1.新建用户: >CREATE USER name IDENTIFIED BY 'ssapdrow'; 2.更改密码: >SET PASSWORD FOR name=PAS ...

  9. 千万级大数据的Mysql数据库SQL语句优化

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

随机推荐

  1. Lomsat gelral

    题目描述 You are given a rooted tree with root in vertex 11 . Each vertex is coloured in some colour. Le ...

  2. 将ymal文件内容转换成字典格式

    yaml文件内容如图: 转换代码如下: import yaml def init_yaml(): with open(r"..\config.yaml", 'r', encodin ...

  3. $.ajax传输js数组,spring接收异常

    今天测试,出现一个奇怪的问题 $.ajax传输js数组,spring接收这个数组,出现奇怪的现象,如果数组只有一个元素,且这个元素字符串最后一个字符是以逗号,结尾的话, spring会自动把这个逗号去 ...

  4. java 使用 ArrayList 排序【包括数字和字符串】

    1.数字排序 /** * 数字排序 */ @Test public void t2() { List<Integer> list = new ArrayList<>(); li ...

  5. CSS相关知识及入门

    CSS(层叠样式表) 作用 修饰HTML页面,美化 CSS代码规范 放置规范 在<style>标签内容体中书写样式代码 <style>标签放置在<head>标签内. ...

  6. Bootstrap实战 - 注册和登录

    一.介绍 注册和登录在社交和商业网站中是必不可少的一个部分. 二.知识点 2.1 标签页 2.1.1 基础标签页 标签页的使用与导航栏类似,同时都依赖于基础样式 nav,不同的是附加样式变成了 nav ...

  7. 【Java】数组

    文章目录 数组 一.数组的定义 二.数组的声明与创建 三.内存分析 四.三种初始化 五.数组的四个基本特点 六.数组边界 七.数组的使用 八.多维数组 九.Arrays类 十.稀疏数组 数组 一.数组 ...

  8. python2.7发送邮件失败之——邮箱安全问题

    使用python2.7发送邮件,通过脚本调试,脚本运行通过成功发出了邮件,但是目标邮箱qq没有收到. 刚开始怀疑脚本问题,上网查找资料后,发现邮箱发送成功后目标邮件没有收到有可能有以下几种原因: 1. ...

  9. Android官方文档翻译 十六 4.Managing the Activity Lifecycle

    Managing the Activity Lifecycle 管理activity的生命周期 Dependencies and prerequisites 依赖关系和先决条件 How to crea ...

  10. C#进阶——记一次USB HID的各种坑(x86,x64,win10,win7)

    一.简叙 写工控上位机的搬砖人,难免会遇到USB通讯,在一个项目中,我写的上位机使用USB HID协议和STM32通讯传输数据,从零大概花了几天找例程,找资料,最后是各种搬砖修补,终于出来了一个出版D ...