数据库学习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//
语句;
例句: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//
相关文章推荐
- 数据库的学习
- oracle模糊查询优化
- PL/SQL DEVELOPER执行计划的查看
- 高级SQL优化(一) ——《12年资深DBA教你Oracle开发与优化——性能优化部分
- 数据库分页大全(oracle利用解析函数row_number高效分页)
- Oracle的A*M*命名缩写解释
- PostgreSQL同步复制搭建
- PostgreSQL同步复制故障测试
- Oracle中dblink 的使用方法
- Oracle中常出现的错误信息及解决方案
- Oracle实现数据同步
- 留言板——数据库设计
- 天下数据浅谈数据库系统明日之星MySQL
- oracle 两表关联时,年月条件的写法引起的巨大性能的差异
- oracle分页查询
- Mysql 阶段调优
- MySQL性能优化的最佳21条经验
- 手工删除Oracle 12C数据库实例
- redis配置项解释
- 数据库课程设计