多表连接查询
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
多表连接查询.txt单身很痛苦,单身久了更痛苦,前几天我看见一头母猪,都觉得它眉清目秀的什么叫残忍? 是男人,我就打断他三条腿;是公狗,我就打断它五条腿! 多表连接查询
1. 内连接
内连接分三种:
如果说是三个表以上的多表连接,哪么inner join 的顺序要和on正好相反
1) 等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
2) 不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括> 、> =、 <=、 <、!> 、! <和 <> 。
3) 自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
2.外连接:如果多个表连接时,想打印其中一个表中的全部记录,哪么我们使用外连接
3.全连接
4.交叉连接
teacher表: 3条记录分别对应3位老师
student表: 5条记录,2条是第一个老师,2条第2个老师,一条是没有老师
对应的是teacher表里的tid字段
别名
inner join
用natural join 或者 using ,必须是两张表的关联字段名一样
左连接 left join 是以左边的表为基准,右边的表要匹配左边的表
右连接 right join 是以右边的表为基准,左边的表要匹配右边的表
select student.sname from teacher right join student
select student.sname from student left join teacher
全连接
使用 UNION
交叉连接
交叉连接(CROSS JOIN),就是指不带W H E R E子句的查询。在数学上,就是表的笛卡尔积。也就是它查询出来的记录数行为两个表的乘积,对应记录也就是为表A*表B。
子查询
以子查询的结果作为主查询的条件
in
any
all
自连接
ALTER VIEW view_name AS SELECT * FROM person WHERE pid>2;
DROP VIEW view_name;
CREATE VIEW view1 AS ..........
视图的建立
create view view_name as select * from person;
msyql_query("select * from view_name");
查看视图
show tables
select * from view_name;
修改
alter view view_name as
删除视图
drop view view_name
MYSQL索引操作
索引用来快速的寻找那些具有特定值的记录,B-树的形式保存。
优点:
1. 对于记录数量很多的表,可以提高你的查询速度
缺点:
1. 占用空间的。
2. 索引会影响你的UPDATE,INSERT,DELETE速度
show index from structs;
drop index e_count_2 on structs
1. 主键 primary key: 不能为空,唯一性
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[USING index_type]
ON tbl_name (index_col_name,...)
index_col_name:
col_name [(length)] [ASC | DESC]
添加: alter table 表名 add primary key(字段名)
删
除: alter table 表名 drop primary key
2. 唯一索引 unique: 可以为空,唯一性
添加:alter table 表名 add unique 索引名(字段名)
注意: 如果你不输入索引名,那么以字段名作为索引名
删除: alter table 表名 drop index 索引名
3. 普通索引 INDEX : 都可以,没有限制
添加:
alter table 表名 add index 索引名(字段名)
create index 索引名 on 表名(字段名)
删除:
alter table 表名 drop index 索引名
drop index 索引名 on 表名
多列索引
where id1=xx and id2=xxx
alter table 表名 add index 索引名(字段名1,字段名2,。。)
短索引(索引前缀)
字段加限制
MySQL存储过程(一)
1. 创建实例数据库
create database db5;
use db5;
2.创建一个简单的工作表,并插入数据
create table t(s1 int);
insert into t values(5);
3.创建程序实例 create procedure Example
create procedure p1() select * from t;
SQL语句存储过程的第一部分是 create procedure
第二部分是过程名:上面新存储过程的名字是p1。
第三部分书参数列表()
第四部分是程序的主体,“select * from t”
在存储过程体中可以包含所有的合法SQL数据库定义语言,insert,update,delete,drop,create,replace等等语句,包括(set,commit,rollback)但是,在代码中如果包含MYSQL的扩充功能,那么代码将不能移植。
4. 调用存储过程,所需要输入的就是call和你过程名以及一个括号。
call p1();
5.过程中的特征子句
create procedure p2()language SQL
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT ''
select current_date,rand() from t;
6.Parameters参数
create procedure p5()------; //参数列表是空的
create procedure p5([IN] name data-type)---- //输入参数in可选,默认为参数为in
create procedure p5(out name data-type)----- //输出参数out
create procedure p5(inout 那么data-type)----- //即可以做输入参数也可以做输出参数
----输入参数in 例子。
create procedure p5(p int) set @x=p;
call p5(12345);
select @x;
----输出参数out 例子
create procedure p6(out p int)set p=-5;
call p6(@y);
select @y;
7. 复合语句:如果你的过程中有多条语句,那么你需要begin/end块。在这里你可以进行变量的定义和流程的控制
首先执行命令 delimiter //
create procedure p7()
BEGIN
set @a=6;
set @b=5;
insert into t values (@a);
select s1 * @a from t where s1>= @b;
END;//
-----在复合语句中申明变量
create procedure p8()
begin
DECLARE a INT;
DECLARE b INT;
SET a=5;
SET b=5;
insert into t values (a);
select s1*
a from t where s1>=b;
end;//
含有default默认语句舌设定语句的例子
create procedure p9()
begin
declare a ,b int default 5;
insert into t values(a);
select s1*a from t where s1>=b;
end;//
8. scope作用域的问题:内部的变量在其作用域范围内享有更高的优先权,当执行到end
变量时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储
过程外再也不能找到这个申明的变量,但是你可以通过out参数或者将其值指派
给会话变量来保存其值。
create procedure p11()
begin
declare x1 char(5) default 'outer';
begin
declare x1 char(5) default 'inner';
select x1;
end;
select x1;
end;//
/********************************* 存储过程中的条件式语句 ***************************************/
1. if-then -else语句
create procedure p12(in parameter int)
begin
declare var int;
set var=parameter+1;
if var=0 then
insert into t values(17);
end if;
if parameter=0 then
update t set s1=s1+1;
else
update t set s1=s1+2;
end if;
end;//
2. case指令:如果需要进行更多条件真假的判断我们可以使用case语句
create procedure p13(in parameter int)
begin
declare var int;
set var=parameter+1;
case var
when 0 then insert into t values(17);
when 1 then insert into t values(18);
else insert into t values(19);
end case;
end;//
/***************************** 循环语句 ************************************/
1. while ···· end while; 循环语句
create procedure p14()
begin
declare var int;
set var=0;
while var<6 do
insert into t values(var);
set var=var+1;
end while;
end;//
2. repeat···· end repeat ;它在执行操作后检查结果,而while则是执行前进行检查
create procedure p15()
begin
declare v int;
set v=0;
repeat
insert into t values(v);
set v=v+1;
until v>=5
end repeat;
end;//
3. loop ·····end loop; loop 循环不需要初始条件,这点和while 循环相似,同时和repeat
循环一样不需要结束条件, leave语句的意义是离开循环,
create procedure p16()
begin
declare v int;
set v=0;
LOOP_LABLE:loop
insert into t values(v);
set v=v+1;
if v >=5 then
leave LOOP_LABLE;
end if;
end loop;
end;//
4. LABLES 标号:标号可以用在begin repeat while 或者loop 语句前,语句标号只能在
合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步。
/***************************** ITERATE迭代 ***************************************/
1. ITERATE:通过引用复合语句的标号,来从新开始复合语
句
create procedure p20()
begin
declare v int;
set v=0;
LOOP_LABLE:loop
if v=3 then
set v=v+1;
ITERATE LOOP_LABLE;
end if;
insert into t values(v);
set v=v+1;
if v>=5 then
leave LOOP_LABLE;
end if;
end loop;
end;//
select s.sid,marks from student_info s left join marks m on
s.sid=m.sid;
select 字段列表
from 表1 inner join 表2,
表2 inner join 表3,
on
表2.字段=表3.字段,
on
表1.字段=表2.字段;
SELECT sname,s.sid,marks FROM student_info s LEFT JOIN marks m ON
s.sid=m.sid
UNION
SELECT sname,s.sid,marks FROM student_info s cross join marks m
select sname from student_info where sid in(select sid from marks where marks>50);
SELECT sname FROM student_info WHERE sid >ANY(SELECT sid FROM marks WHERE marks>50);
2,3,4
select sname from student_info where sid>(select min(sid) from marks where marks>50);
SELECT sname FROM student_info WHERE sid >ANY(SELECT sid FROM marks WHERE marks>50);
select sname from student_info where sid>(select max(sid) from marks where marks>50);
SELECT p2.pname,"领导者",p1.pname FROM person p1,person p2 WHERE p1.pid=p2.jid;
CREATE
VIEW `student`.`view1`
AS
(SELECT * FROM ...);
create index index_name on person(pid);