ホームページ >データベース >mysql チュートリアル >MySQL - マルチテーブルクエリの詳細な紹介と例
1. テーブル間の関係
1 対 1: ユーザー テーブルと ID 情報テーブル、ユーザー テーブルがメイン テーブルです
例: man テーブル、女性テーブル
create table man( mid int primary key auto_increment, mname varchar(32), wid int unique );
create table woman( wid int primary key auto_increment, wname varchar(32) );
1 対多: 最も一般的なテーブル リレーションシップ、ユーザー テーブル、注文テーブル
例: 従業員テーブル、部門テーブル
create table emp( empno int primary key auto_increment, ename varchar(32), deptno int );
create table dept( deptno int primary key auto_increment, dname varchar(32) );
多対多: たとえば、学生テーブルやコース スケジュールでは、通常、多対多の関係は 1 対多または多対 1 の関係に分割されます。
create table student( sid int primary key auto_increment, sname varchar(32) );
insert into student (sname) values ('大拿'); insert into student (sname) values ('唐嫣'); insert into student (sname) values ('王健林');
create table course( cid int primary key auto_increment, cname varchar(32) );
insert into course (cname) values ('语文'); insert into course (cname) values ('数学'); insert into course (cname) values ('英语'); insert into course (cname) values ('化学');
create table s_c( cid int, sid int );
insert into s_c (sid,cid) values (1,1); insert into s_c (sid,cid) values (1,2); insert into s_c (sid,cid) values (1,3); insert into s_c (sid,cid) values (1,4); insert into s_c (sid,cid) values (2,2); insert into s_c (sid,cid) values (2,4); insert into s_c (sid,cid) values (3,1); insert into s_c (sid,cid) values (3,3);
2. 複数のテーブルを使用する理由
大量のデータの冗長性を避けるため。
分割できるテーブルは多ければ多いほど良いというわけではなく、実情に応じて分割してください。
#3. コンセプト
複数のテーブルを同時にクエリする4.分類
f35d6e602fd7d0f0edfa6f7d103c1b57クエリのマージ Union、Union all
結果セットのマージとは、2 つの select ステートメントのクエリ結果を結合することを意味します。 (ユニオンと同等)
2 つのマージ結果、列の数、列の順序、クラスは一貫している必要があります
create table emp( empno int primary key auto_increment, ename varchar(32) );
create table dept( deptno int primary key auto_increment, dname varchar(32) );
select * from emp union select * from dept; select * from emp union all select * from dept;2cc198a1d5eb0d3eb508d858c9f5cbdb接続クエリ
従業員テーブル
create table emp( empno int primary key auto_increment, # 员工编号 ename varchar(32), #员工姓名 job varchar(32), #员工职位 mgr int, #上级编号 hiredate date, #入职时间 sal double, #薪水 comm double, #奖金 deptno int #所属部门 );部門テーブル
create table dept( deptno int primary key auto_increment, #部门编号 dname varchar(32), #部门名称 loc varchar(32) #部门地址 );内部結合: 内部結合....on , join , ,
内部結合は比較演算子であり、条件を満たす行のみを返します。条件
#例:
select * from emp inner join dept on emp.deptno=dept.deptno; select * from emp e ,dept d where e.deptno = d.deptno; select * from emp e join dept d where e.deptno = d.deptno;
外部結合:
左外部結合: LEFT OUTER JOIN | left join ... on クエリ、クエリ上のすべての行を表します。 left、右側に行がない場合は null
select * from emp e LEFT OUTER JOIN dept d ON e.deptno = d.deptno;
select * from emp e right OUTER JOIN dept d ON e.deptno = d.deptno;## になります。 #Self-join:
select e.ename,el.ename from emp e left join emp el on e.mgr = el.empno;
select * from emp natural join dept; select * from emp NATURAL left join dept; select * from emp NATURAL right join dept;
##5bdf4c78156c7953567bb5a0aef2fc53サブクエリ (ANY サブクエリ、IN サブクエリ、SOME サブクエリ、ALL サブクエリ) サブクエリによって解決される問題:
Cong Hao よりも背が高いのは誰の給料ですか? ? ?
select * from emp where sal >(select sal from emp where ename='从浩');定義: サブクエリを使用すると、1 つのクエリを別のクエリにネストできます
:
1. 括弧 2. メインクエリの where select の from の後にサブクエリを使用できます
3.サブクエリは
4 でグループ化した後には使用できません。メイン クエリとサブクエリは同じテーブル内にある必要はありません。メイン クエリで使用できるのは、サブクエリから返された値のみです。
要件: 部門名が人事である従業員情報をクエリする最初の方法: サブクエリを使用する
select * from emp where deptno=(select deptno from dept where dname='人力部');
2 番目の方法: 関連クエリを使用する
select * from emp e,dept d where e.deptno = d.deptno and d.dname='人力部';SQL 最適化: 複数テーブル クエリを使用してみてください
#
select empno,ename,sal from emp;SQL 最適化: 複数テーブルのクエリを使用してみる
SQL 実行プランを通じてそれを確認できます。
SQL 実行プランを見ると、2 つのメソッドの実行が同じであることがわかります。
5.from后面的子查询
需求:
查询员工号 姓名 月薪
select empno,ename,sal from emp;
6.一般不在子查询中排序
7.一般先执行子查询,再去执行主查询
ANY关键字
假设any内部的查询返回结果个数是三个,如:result1,result2,result3,那么
select .... from .. where a > any(...); ->select ..... from ... where a > result1 or a >result2 or a >result3;
需求:
查询工资比1号部门中任意一个员工高的信息
select * from emp where sal > any(select sal from emp where deptno = 1);
ALL关键字
ALL关键字与any关键字类似,只不过上面的or改成and :
select .... from .. where a > all(...); ->select ..... from ... where a > result1 and a >result2 and a >result3;
需求:
查询工资比1号部门中所有员工号的员工信息
select * from emp where sal > all(select sal from emp where deptno = 1);
SOME关键字
some 关键字和any关键字是一样的功能。所以:
select .... from .. where a > any(...); ->select ..... from ... where a > result1 or a >result2 or a >result3;
IN关键字
IN运算符用于where表达式中,以列表向的形式支持多个选择。语法如下:
where column in (v1,v2,v3,.....); where column not in (v1,v2,v3,.....);
当in前面加上not运算符时候,表示与in相反的意思,既不在这写列表项中选择。
案例:
查询部门名称是人力和研发的员工
select * from emp where deptno in (select deptno from dept where dname='人力部' or dname='研发部') 分类: MySQL数据库
想了解更多相关问题请访问PHP中文网:MySQL视频教程
以上がMySQL - マルチテーブルクエリの詳細な紹介と例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。