Mysql原生文--マルチテーブル

5021 ワード

開始する前に、テーブルを作成し、テーブルとデータの準備をする必要があります.
1.  
create table department(
	id int,
    name varchar(20)
);
create table employee(
	id int primary key auto_increment,
    name varchar(20),
    sex enmu('male','female') not null default = 'male',
    age int,
    dep_id int,
    constraint fk_id foreign key(dep_id) references department(id),
);

2.    
insert into department values 
(200,'  '),
(201,'    '),
(202,'  '),
(203,'  ');

insert into employee (name,sex,age,dep_id)values
('egon','male',18,200),
('alex','female',48,201),
('wupeiqi','male',38,201),
('yuanhao','female',28,202),
('liwenzhou','male',18,200),
('jingliyang','female',18,204);

#      
desc department;
desc employee;

#          
select * from department;
select * from employee;

マルチテーブルのクエリーです.主に2つのクエリーに分けられます.この2つのクエリーは、マルチテーブル接続クエリーとサブクエリーの2つです.
複数テーブル接続クエリー
1.交差接続:一致条件は適用されません.デカルト積を生成します.
select * from employee,department;

2.内部接続
#         ,                    。
# department  204    ,  employee    204            
select employee.id,employee.name,employee.age,employee.sex,department.name from employee inner join department on employee.dep_id=department.id;

   sql        sql  
select employee.id,employee.name,employee.age,employee.sex,department.name from employee,department where employee.dep_id=department.id;

3.外部ジョインの左ジョイン:左テーブルの全レコードを優先的に表示する
#       ,         ,           
#     :                     
select employee.id,employee.name,department.name as depart_name from employee letf join department on employee.dep_id=department.id;

4.外部ジョインの右ジョイン:右テーブルの全レコードを優先的に表示する
#       ,         ,         
#     :                     
select employee.id,employee.name,department.name as depart_name from employee right join department on empolyee.dep_id=department.id; 

5.全外接続:左右2つのテーブルのすべてのレコードを表示する
select * from employee left join department on employee.dep_id = department.id
union
select * from employee right join department on employee.dep_id = department.id;
#   union union all   :union        

6.適合接続クエリー
#   1:         employee department ,  employee   age       25,       25             
select employee.name,department.name from employee inner join department on employee.dep_id=department.id where age > 25;
#  2:         employee department ,   age         
select employee.id,employee.name,employee.age,department.name from employee inner join department on employee.dep_id=department.id order by age asc;

サブクエリ
# 1.                       。
# 2.           ,               。
#3:        :IN、NOT IN、ANY、ALL、EXISTS   NOT EXISTS    
#4:          := 、 !=、> 、

1.INキー付きサブクエリ
#       25       
select id,name from department
    where id in 
        (select dep_id from employee group by dep_id having avg(age) > 25);
   sql      。
 select department.name from employee inner join department on employee.dep_id=department.id where employee.age > (select avg(age) from employee group by dep_id);
#         
select name from employee
    where dep_id in 
        (select id from department where name='  ');

#    1     (            id)
select name from department where id not in (select distinct dep_id from employee);

2.比較演算子付きサブクエリ
#     :=、!=、>、>=、
#                  
mysql> select name,age from emp where age > (select avg(age) from emp);
+---------+------+
| name    | age  |
+---------+------+
| alex    | 48   |
| wupeiqi | 38   |
+---------+------+
2 rows in set (0.00 sec)


#               、  
select t1.name,t1.age from emp t1
inner join 
(select dep_id,avg(age) avg_age from emp group by dep_id) t2
on t1.dep_id = t2.dep_id
where t1.age > t2.avg_age; 

3 EXISTSキーワード付きサブクエリ
EXISTS関字キーが存在することを示す.EXISTSキーワードを使用している場合、内部レベルクエリ文はクエリのレコードを返さない.真偽の値を返します.TrueまたはFalseがTrueを返すと、外部クエリー文がクエリーされます.戻り値がFalseの場合、外部クエリー文はクエリーされません.
#department    dept_id=203,Ture
mysql> select * from employee
    ->     where exists
    ->         (select id from department where id=200);
+----+------------+--------+------+--------+
| id | name       | sex    | age  | dep_id |
+----+------------+--------+------+--------+
|  1 | egon       | male   |   18 |    200 |
|  2 | alex       | female |   48 |    201 |
|  3 | wupeiqi    | male   |   38 |    201 |
|  4 | yuanhao    | female |   28 |    202 |
|  5 | liwenzhou  | male   |   18 |    200 |
|  6 | jingliyang | female |   18 |    204 |
+----+------------+--------+------+--------+
#department    dept_id=205,False
mysql> select * from employee
    ->     where exists
    ->         (select id from department where id=204);
Empty set (0.00 sec)