05.mysql高级教程

1.子查询 

(1)子查询更符合人的思维方

(2)子查询可以对查询效率进行优化

例:查询小刘所在公司:

一般写法:

select c.name 公司名
from company c,member m
where c.id=m.comid and m.name='小刘'

(1)select子查询:从member表中查询

select (select name from company where id = comid)
from member
where name ='小刘'

(2)where子查询:从company表中查询

select name 公司名
from company
where id =(select comid from member where name='小刘')

ps.若要查询一个集合,则使用in

select name 公司名
from company
where id in(select comid from member where name ='小刘' or name='小王')

(3)from子查询:适用三表及以上

  ps.select子查询和where子查询是把子查询结果当【数据】

       from子查询是把查询结果当【表】

  注意:from子查询主要用于3张表以上的连接查询

例:先查A B两张表,再用查询结果和C表连接查询

select c.name 公司名
from (select name n,comid id from member where name='小刘 ') t1
      company c
where t1.id = c.id

2.索引

2.1二叉树结构

如果没有索引,它的查询效率会非常的低。建立起索引后,会生成一个二叉树,如果比根结点小,放到左边,如果比根节点大,放到右边,于是提高了索引效率。

PS.索引虽然提高了查询效率,但却降低了表的更新速度,如对表进行增删改查时,MySql不仅要保存数据,还要保存索引文件每次添加了索引列的字段。

2.2 BTREE树结构:层次比二叉树低,查询效率高

      1.树的每个节点最多包含m个孩子

      2.除根节点与叶子节点外,每个节点至少有【ceil(m/2)】个孩子

      3.若根节点不是叶子节点,那它至少有两个孩子

      4.所有的叶子节点都在同一层

      5.每个非叶子节点都有n个key与n+1个指针组成,其中【ceil(m/2)-1】<=n<=m-1

插入过程如下:以5叉B树为例:

 

2.3 索引分类

1)单值索引:一个索引只包含单个列,一个表可以有多个单列索引

2)唯一索引:索引列的值必须唯一,但允许有空

3)复合索引:一个索引包含多个列

2.4索引基本语法

city表:                                                                       country表:

          

       1)创建索引

          为city表中的city_name创建索引:

create index idx_city_name on city(city_name);  //要为索引创建名字

      2)查看索引

show index from city

      3)删除索引

drop index idx_city_name on city

      4)ALTER命令

alter table city add unique idx_city_name(city_name)

3.存储过程

  可以理解为存储在数据库中一段SQL语句的集合。

函数:是一个由返回值的过程。

过程:是一个没有返回值的函数。

3.1定义存储过程

  无参数

DELIMITER $$

create  procedure demo_01.demo4()    
	-- 存储过程体
	begin		
		declare name varchar(10) default '';	-- declare声明变量
		set name = "jim";			
		select name;   -- 函数体
	end$$

DELIMITER ;

 调用存储过程:

CALL demo4();

含参数: 

DELIMITER $$

create procedure demo2(in s_sex char(1),out s_count int)  -- in表示输入,out表示输出
    
	
	begin			
		
       select count(*) into s_count from student where sex =s_sex; 
                                                  -- 通过into把值放入s_count
       select s_count;
		 
	end$$

DELIMITER ;

调用过程 :

CALL demo2 ('男',@s_count);

3.2查看存储过程

show procedure status

3.3删除存储过程

drop procedure pro_test1$

3.4常用函数:

  (1)if else:

DELIMITER $$
CREATE
    PROCEDURE demo.demo3(IN day INT)
	-- 存储过程体
	BEGIN
		IF day = 0 THEN
		SELECT '星期天';
		ELSEIF day = 1 THEN
		SELECT '星期一';
		ELSEIF day = 2 THEN
		SELECT '星期二';
		ELSE
		SELECT '无效日期';
		END IF;
		
	END$$
DELIMITER ;

 (2)case:

DELIMITER $$
CREATE 
    PROCEDURE demo4(IN num INT)
	BEGIN
		CASE -- 条件开始
	
		WHEN num<0 THEN 
			SELECT '负数';
		WHEN num>0 THEN 
			SELECT '正数';
		ELSE 
		SELECT '不是正数也不是负数';
	
		END CASE; -- 条件结束
	END$$
DELIMITER;

(3)while():

DELIMITER $$
CREATE 
    PROCEDURE demo6(IN num INT,OUT SUM INT)
	BEGIN
	     SET SUM = 0;
	     WHILE num<10 DO -- 循环开始
	         SET num = num+1;
	         SET SUM = SUM+num;
	         END WHILE; -- 循环结束
	END$$
DELIMITER;

  (4)repeat until:

-- 创建过程
DELIMITER $$
CREATE 
    PROCEDURE demo7(IN num INT,OUT SUM INT)
	BEGIN
	     SET SUM = 0;
	     REPEAT-- 循环开始
		SET num = num+1;
		SET SUM = SUM+num ;
		UNTIL num>=10
		END REPEAT; -- 循环结束
	END$$
DELIMITER;

(5)loop:

DELIMITER $$
CREATE 
    PROCEDURE demo8(IN num INT,OUT SUM INT)
	BEGIN
	     SET SUM = 0;
	     demo_sum:LOOP-- 循环开始
		SET num = num+1;
		IF num > 10 THEN
		    LEAVE demo_sum; -- 结束此次循环
		ELSEIF num <= 9 THEN
		    ITERATE demo_sum; -- 跳过此次循环
		END IF;
		
		SET SUM = SUM+num;
		END LOOP demo_sum; -- 循环结束
	END$$
DELIMITER;

(6)插入信息

DELIMITER $$
CREATE 
    PROCEDURE demo9(IN s_student VARCHAR(10),IN s_sex CHAR(1),OUT s_result VARCHAR(20))
	BEGIN
	   -- 声明一个变量 用来决定这个名字是否已经存在
	   DECLARE s_count INT DEFAULT 0;
	   -- 验证这么名字是否已经存在
	   SELECT COUNT(*) INTO s_count FROM student WHERE `name` = s_student;	
	   IF s_count = 0 THEN
	        INSERT INTO student (`name`, sex) VALUES(s_student, s_sex);
		SET s_result = '数据添加成功';
	   ELSE
                SET s_result = '名字已存在,不能添加';
                SELECT s_result;
	   END IF;
	END$$
DELIMITER;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值