您的位置:首页 > 数据库

数据库学习2

2015-09-06 00:05 495 查看
一.union ['junɪən]:语法:select 语句 union [union选项] select 语句 union [union选项] select
语句;

例句:select * from stu where id=5 union select * from stu where sex='女';

^提醒:select 后面也有all和distinct选项,select后面默认选项是是all。Union后面的默认选项是distinct。

^^union的注意事项

如果两个表的字段名字不一样,最后结果显示的是第一个表的字段名

Union两边的select语句的字段个数必须要一致。

Union两边的数据类型可以不一样。

union和order by一起使用

注意:

union语句两边的select语句必须用括号括起来

每条select语句中必须结合limit才能生效

二、多表查询

1、内连接(inner join):

语法一:select 列名 from 表1 inner join 表2 on 表1.公共字段=表2.公共字段;

语法二:select 列名 from 表1,表2 where 表1.公共字段=表2.公共字段

显示指定的字段 select t1.id,num1,num2 from t1,t2 where t1.id=t2.id;

2、外连接

a)左外连接(left [outer] join):以左表为准,写在左边的表就是左表;

Select 列名 from 表1 left join 表 2 on 表1.公共字段=表2.公共字段

select stuname,表1.id from 表1 left join 表2 on 表1.id = 表2.id;

b)右外连接(right [outer] join):以右边的表为准;

3、交叉连接(cross join):

Select 列名 from 表1 cross join 表2 [on 表1.公共字段=表2.公共字段]

和内连接一样。

4、自然连接:

自动的判断条件,判断条件的依据是同名字段

自然连接分为:

(1、自然内连接 (natural join)

(2、自然左外连接(natural left join)

(3、自然右外连接(natural right join )

自然连接的结论

1、表连接是通过同名字段来连接的

2、如果没有同名字段返回的是笛卡尔积

3、会对连接字段进行处理

a)合并公共字段

b)会把合并好的公共字段放在最前面。

5.using语句

指定连接字段,using还会对结果进行字段整理,整理后的结果和自然连接一样。

语法:Select 列名 from 表1 连接 表2 using(公共字段)

三、子查询

子查询介绍

(1、在查询的基础上继续进行查询叫子查询

(2、语法结构:select 字段 from 表 where (select 查询)

(3、外面的查询叫父查询,里面的查询叫子查询。子查询为父查询提供条件。

(4、当子查询返回多条记录的时候,条件运算符使用in 或not in;

1.some和any是一样的,表示一些的意思。some可以用来代替in语句。!=all等价于not in

2.exists和not exists子查询

例子 select * from stu where exists(select * from stumarks where 分数>60);

子查询的分类

(1、标量子查询:子查询返回的值就一个。

(2、列子查询:子查询返回一列,一列中有多个值。

(3、行子查询:子查询返回多个字段

(4、表子查询,子查询的结果充当父查询的表

脚下留心:from后面必须是一个表,如果将结果数据当做表来看,必须给子查询的结果起一个别名。

四:视图:a视图是一张虚拟表,表示一张表的一部分或者多张表的综合,视图中没有真实的 数据,这是表结构,数据在基表(原始表)中。

b同一张表可以创建多个视图。

视图的用途

(1、筛选表中的数据,防止未经许可访问用户敏感数据

(2、增加数据的兼容行。(数据表的字段名发生改变,程序可以不用更改字段名)

(3、降低数据查询的复杂程度

(4. 隐藏表结构

1.创建视图

create [or replace ] view 视图名

as

代码

视图的算法

1、merge:合并算法(将视图语句和外层查询语句合并以后再执行)

2、temptable:临时表算法(将视图生成一个临时表,然后再执行外层语句)

undefined:未定义算法,用哪种算法是有mysql自己决定的,这是一种默认算法,一般视图都会选merge算法,因为merge算法效率高。

3.解决:在创建视图的时候指定算法

create algorithm=temptable view vw1

as

select * from stu order by ch desc

五、事务处理(transaction[træn'zækʃən])

1、什么是事务

事务(transaction)是一个工作单元,有一条或多条语句组成,这些语句要么全部执行,要么全部不执行,事务是一个不可分割的逻辑单元。

2、事务的特性

(1、原子性:事务是一个整体,不可分割。

(2、一致性:当事务完成时,数据必须保证一致的状态。

(3、隔离性:所有的事务之间是独立的。

(4、永久性:事务完成后对数据的修改是永久修改,在事务完成之前是可以更改的。

3、开启事务

语法:start transaction或begin work

4、提交事务

语法:commit

5。回滚事务

语法:rollback

6.总结:

(1、start transaction或begin work事务开始

(2、提交事务(commit)或回滚事务(rollback)事务结束

(3、在默认情况下,每个独立SQL语句也是一个自动提交事务

六、索引的类型

优点:查询速度加快。

缺点:数据操作语句减慢。

1.普通索引

方法一:通过创建索引的方法创建

create index 索引名 on 表名 (字段名)

create index ix_stu_stname on stu(stuname);

方法二:通过更改表的方法创建

alter table 表名 add index 索引名 (字段名)

alter table stu add index ix_stu_stuname(stuname);

方法三:创建表的时候一起创建索引

create table test(

id int primary key;

index ix_test_name(name);

2.主键索引:只要创建一个主键,就自动的创建了一个主键索引。

1、如何创建主键索引?

创建主键,只要创建主键就自动的创建了主键索引

2、主键索引可以创建多少个?

主键索引只能有一个。

3、唯一索引

3.创建唯一索引

a:语法:create unique index 索引名 on 表名(字段名)

create unique index ix_stu_name on stu(name)

b:更改表的时候创建索引

c:创建表的时候创建唯一索引

4.创建多列索引

alter table 表名 add index 索引名 (字段1,字段2);

创建索引的指导原则

合适做索引的列

1、该列用于频繁搜索

2、该列用于对数据进行排序

3、经常在where子句中出现作为条件查询的列

4、在join子句中出现做连接查询的列。

不适合做索引的列

1、改列中仅仅保护几个不同的值不合适做索引

2、表中仅仅就几行数据不适合做索引。

七、1、存储过程(类似函数)

(1、存储过程类似于js中的函数。

(2、用来执行复杂的业务逻辑

(3、存储过程中可以保护判断、循环、多条sql语句。

存储过程的优点

(1、执行速度更快

(2、允许模块化程序设计

(3、减少网络流量

2、创建存储过程

create procedure 存储过程名(参数,参数,…)

begin

//代码

End

存储过程的参数分为输入参数(in)、输出参数(out)、输入输出参数(inout),默认是输入参数。

如果存储过程中就一条语句,begin和end是可以省略的。

^^脚下留心:通常情况下,“;“表示SQL语句结束,同时向服务器提交并执行。但是存储过程中有很多SQL语句,每一句都要以分号隔开,这时候我们就需要使用其他符号来代替向服务器提交的命令。通过delimiter命令更改语句结束符。

例子:delimiter //;

3、调用存储过程 call 存储过程名()//

4、删除存储过程

语法:drop procedure [if exists] 存储过程名

5、创建复杂的存储过程

传递一个学号,显示学生信息和考试成绩

create procedure xxx(in stuid varchar(20))

begin

select * from stu where stuno = stuid;

select * from stu2 whert stuno = stuid;

end//

6、declare声明局部变量

(1、declare声明局部变量的

(2、语法: declare 变量名 数据类型 [default value];

(3、通过select 字段 into 变量或set给变量赋值

(4、变量名不可以和表的字段名一样。

7.练习:传入一个学号,显示姓名和性别

drop procedure if exists proc;

create procedure proc(in id varchar(20))

begin

declare name varchar(20); //声明变量

declare sex char(1); //声明变量

select stuname,stusex into name,sex(给变量赋值) from stuinfo where stuno=id;

select name,sex;

end//

8.例题:查找同桌

通过姓名求的座位号,通过座位号求的同桌

drop procedure if exists proc;

create procedure proc(name varchar(20))

begin

declare seat int;//声明座位号这个变量

select stuseat into seat(给变量赋值) from stuinfo where stuname=name;

select * from stuinfo where stuseat=seat+1 or stuseat=seat-1;

end//

9.通过set给变量赋值

drop procedure if exists proc;

create procedure proc(in num1 int,in num2 int)

begin

declare num int; -- 声明变量

set num=num1+num2; -- 声明变量

select num;

end//

10.用户变量(可以理解成全局变量)

用户变量只要在前面加一个@符即可

set @name=’李白’;

select @name;

11、系统变量

MySQL启动的时候就存在的变量,以@@开头的都是系统变量

12.带输出参数的存储过程

drop procedure if exists proc;

create procedure proc(num int , out result int)

begin

set result=num*num;

end//
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: