알고 싶어요 다음과 같습니다.
나는 내 응용 프로그램 (예 - PHP) 이 사용할 계획이 있지만, 여러 데이터베이스에 대해 쿼리합니다 실행하십시오 don& # 39 싶지 않다, 어떤 선택을 한 테이블에 쿼리하지 여러 곳에서 데이터를 얻기 위해 합니까?
참고: 나는 이 글을 쓰는 등 싶다 나는 항상 잘 할 수 있는 다양한 질문에 대한 서면 안내선 https://partner. microsoft. PHP 에서 발견한 대기열은, 이 때 내가 답을 자세한 내용은 링크를 게시할 수 있다고요.
이에 대한 답을 빽이라는 끕니까 다음과 같다.
이 질문에 닫히지만:
mysql> create table colors(id int(3) not null auto_increment primary key,
-> color varchar(15), paint varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> show columns from colors;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| color | varchar(15) | YES | | NULL | |
| paint | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
mysql> insert into colors (color, paint) values ('Red', 'Metallic'),
-> ('Green', 'Gloss'), ('Blue', 'Metallic'),
-> ('White' 'Gloss'), ('Black' 'Gloss');
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> select * from colors;
+----+-------+----------+
| id | color | paint |
+----+-------+----------+
| 1 | Red | Metallic |
| 2 | Green | Gloss |
| 3 | Blue | Metallic |
| 4 | White | Gloss |
| 5 | Black | Gloss |
+----+-------+----------+
5 rows in set (0.00 sec)
이 표에서는 서로 다른 브랜드의 차량은 아웃해야 브랜드를 카야르 판매할 수 있다는 것.
mysql> create table brands (id int(3) not null auto_increment primary key,
-> brand varchar(15));
Query OK, 0 rows affected (0.01 sec)
mysql> show columns from brands;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| brand | varchar(15) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)
mysql> insert into brands (brand) values ('Ford'), ('Toyota'),
-> ('Nissan'), ('Smart'), ('BMW');
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> select * from brands;
+----+--------+
| id | brand |
+----+--------+
| 1 | Ford |
| 2 | Toyota |
| 3 | Nissan |
| 4 | Smart |
| 5 | BMW |
+----+--------+
5 rows in set (0.00 sec)
서로 다른 유형의 차량 모델 테이블 다룰 오프하도록 간단해진다는 엔드입니다 아닌 실제 사용할 수 있을 것입니다 자동차 유형이 다른 자동차 모델.
mysql> create table models (id int(3) not null auto_increment primary key,
-> model varchar(15));
Query OK, 0 rows affected (0.01 sec)
mysql> show columns from models;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| model | varchar(15) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> insert into models (model) values ('Sports'), ('Sedan'), ('4WD'), ('Luxury');
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from models;
+----+--------+
| id | model |
+----+--------+
| 1 | Sports |
| 2 | Sedan |
| 3 | 4WD |
| 4 | Luxury |
+----+--------+
4 rows in set (0.00 sec)
마지막으로, 이 모든 다른 모든 것을 할 수 있는 표를 테이블뿐 타이법으로요 백업하도록 관계가 없었다. 실제로 파악하기 위한 고유 ID 번호를 필드이므로 롯이여 과시했다.
mysql> create table cars (id int(3) not null auto_increment primary key,
-> color int(3), brand int(3), model int(3));
Query OK, 0 rows affected (0.01 sec)
mysql> show columns from cars;
+-------+--------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| color | int(3) | YES | | NULL | |
| brand | int(3) | YES | | NULL | |
| model | int(3) | YES | | NULL | |
+-------+--------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> insert into cars (color, brand, model) values (1,2,1), (3,1,2), (5,3,1),
-> (4,4,2), (2,2,3), (3,5,4), (4,1,3), (2,2,1), (5,2,3), (4,5,1);
Query OK, 10 rows affected (0.00 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql> select * from cars;
+----+-------+-------+-------+
| id | color | brand | model |
+----+-------+-------+-------+
| 1 | 1 | 2 | 1 |
| 2 | 3 | 1 | 2 |
| 3 | 5 | 3 | 1 |
| 4 | 4 | 4 | 2 |
| 5 | 2 | 2 | 3 |
| 6 | 3 | 5 | 4 |
| 7 | 4 | 1 | 3 |
| 8 | 2 | 2 | 1 |
| 9 | 5 | 2 | 3 |
| 10 | 4 | 5 | 1 |
+----+-------+-------+-------+
10 rows in set (0.00 sec)
미국 (좋겠다) 이 부여하느뇨 충분한 데이터를 다룰 수 있게 다양한 유형의 결합과 끕니까 예와 수 있도록 충분한 데이터를 가치있는. 그래서 더 보스 (ids) 에 진출하는 것을 알고 싶어하는 좁아져 짜증을 내게 되었다 모든 스포츠카 그분은 . 이것은 간단한 테이블 2 가 된다. 우리는 알 수 있는 테이블을 사용할 수 있는 표에 스톡과 모델을 재생성하고 항목이없습니다. 알 수 있듯이, '모델' 에 데이터 모델 '표' 를 열 (차를 관련시킵니다 '표' 열 (차를 우리는. 지금 우리가 알고 있는 모델 '1' 이라는 ID '스포츠' 그래서 표에 대한 참가하십시오 쓸 수 있습니다.
select
ID,
model
from
cars
join models
on model=ID
그래서 이 질의에서는 잘 어울려 맞죠? 우리는 이 두 테이블에서 식별됩니다 정보 및 사용 및 컨테인먼트하는 올바르게 참가하십시오 식별됩니다 참가하십시오 생일날이야 열을 어떻게 세워야 한다.
ERROR 1052 (23000): Column 'ID' in field list is ambiguous
오 노에! 우리의 첫 오류로 쿼리하지! 네, 그것은 자두. 질의가 볼 수 있지만, 일부는 랑하니 attaboy 를 오른쪽 열 때문에 실제 존재하는 테이블뿐 모두 얻을 수 있는 열 저희에게는힘과 짓궂군요 데이터베이스입니까 의심하였더라 혼란스럽다. 이를 해결하기 위해서는 두 가지 해결 방법이 있습니다. 첫 번째는, 단순하면서도 잘 이용할 수 있다 ',' 을 의미하는 바는 다음과 같은 타바레나미스콜럼나메 데이터베이스입니까 정확히 알 수 있습니다.
select
cars.ID,
models.model
from
cars
join models
on cars.model=models.ID
+----+--------+
| ID | model |
+----+--------+
| 1 | Sports |
| 3 | Sports |
| 8 | Sports |
| 10 | Sports |
| 2 | Sedan |
| 4 | Sedan |
| 5 | 4WD |
| 7 | 4WD |
| 9 | 4WD |
| 6 | Luxury |
+----+--------+
10 rows in set (0.00 sec)
다른 하나는 아마 더 자주 사용되는 및 호출됨 표 (alias. 이 예에서는 테이블에 있는 니스와 파선-짧은 단순 이름만 입력하면 아웃해야 KPI_DAILY_SALES_BY_DEPARTMENT 'like' 뭔가 '라는 오래된 얻을 수 있는 간단한 방법은 아마도 빠르게, 그래서 테이블 다음과 같습니다.
select
a.ID,
b.model
from
cars a
join models b
on a.model=b.ID
이제 다시 확인할 수 있습니다. 하지만 우리는 우리가 원하는 정보를 볼 수 있듯이 우리도 우리 할 수 있는 정보를 포함, where 절, t 주문하신거 wasn& # 39 만 내려받습니다 스포츠카 등 이날 성명을 통해 물었다. As I 포지셔닝하십시오 테이블 앨리어스가 방법을 사용하지 않고, 이 시점에서 운명인것 테이블 이름 그대로 내아기마저도 정보기술 (it) 이다. 그러나 분명한 것은, where 절 추가해야 합니다 우리 질의입니다. 우리는 식별할 수 있는 방법으로 스포츠카 'ID = 1, # 39, & # 39' 또는 '모델 = Sports&'. 그 ID 인덱스되면 과 기본 키 (이것은 적을 입력), 사용할 수 있는 우리의 질의입니다.
select
a.ID,
b.model
from
cars a
join models b
on a.model=b.ID
where
b.ID=1
+----+--------+
| ID | model |
+----+--------+
| 1 | Sports |
| 3 | Sports |
| 8 | Sports |
| 10 | Sports |
+----+--------+
4 rows in set (0.00 sec)
빙고! 사장님이 만족입니다. 물론 그가 어떤 것을 더 좋고, 그는 결코 기술입니까 주문하신거 정보를 살펴보고 관심용 다운로드하려는 색계열 아니라 I 밝혔습니다. 그럼 우리는 우리의 좋은 부분을 사용해야 할 수 있지만, 우리는 이미 기록되었으므로 쿼리하지 3 표 원하는거요 색계열. 이제 우리 주 정보 테이블 '자동차' 에서 자동차 색상 ID 와 이 링크를 백됩니다 색계열 ID 열. 그래서, 유사한 방식으로, 기존 3 table: 참여할 수 있습니다
select
a.ID,
b.model
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
where
b.ID=1
+----+--------+
| ID | model |
+----+--------+
| 1 | Sports |
| 3 | Sports |
| 8 | Sports |
| 10 | Sports |
+----+--------+
4 rows in set (0.00 sec)
젠장, table) 가 있지만, 실제로 우리가 잊고 있던 열 링크됨 제대로 참여됨 및 관련 정보 가져오기할 새 테이블이 에서 방금 링크됨.
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
where
b.ID=1
+----+--------+-------+
| ID | model | color |
+----+--------+-------+
| 1 | Sports | Red |
| 8 | Sports | Green |
| 10 | Sports | White |
| 3 | Sports | Black |
+----+--------+-------+
4 rows in set (0.00 sec)
그것은 전적으로 이 방법으로 점점 더 많은 표를 링크뿐 보관할 수 있습니다.
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
join brands d
on a.brand=d.ID
where
b.ID=1
I forgot 동시에 둘 이상의 열에서 참가하십시오 테이블로 포함시키기 위해 우리가 할 수 있습니다 ',' 기술서임을 참가하십시오 예를 들어보겠습니다. 또한 '모델' 이라는 브랜드 모델로 한 표 한 경우, 따라서 열 수 있는 '브랜드' 브랜드 ',' ID '현장' 링크됨 백됩니다 수행되 이 같은 테이블에서 걸릴 수 있다.
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
join brands d
on a.brand=d.ID
and b.brand=d.ID
where
b.ID=1
쿼리 테이블 위에서 볼 수 있습니다 '표' 뿐만 아니라 참여됨 연결하는 주요 자동차 간 조인 테이블 이미 결합되었는지 지정합니다. 이 경우, 그 결과, t 수행됨 wasn& # 39 에 잘못된 말을 호출됨 카티시안 bigadmin - 원하는거요 dba. # 39 한 creditbank. 나님이시거늘 행뿐만 카티시안 join) 은 정보 doesn& 제한할 수 있기 때문에, 그 결과, t tell 데이터베이스입니까 어떻게 쿼리하지 모든 행을 기능을 되돌려줍니다 기준에 맞는. 따라서, 예를 들어 전달자로써 카티시안 참가하십시오 비헤이비어는 다음 쿼리를 실행합니다.
select
a.ID,
b.model
from
cars a
join models b
+----+--------+
| ID | model |
+----+--------+
| 1 | Sports |
| 1 | Sedan |
| 1 | 4WD |
| 1 | Luxury |
| 2 | Sports |
| 2 | Sedan |
| 2 | 4WD |
| 2 | Luxury |
| 3 | Sports |
| 3 | Sedan |
| 3 | 4WD |
| 3 | Luxury |
| 4 | Sports |
| 4 | Sedan |
| 4 | 4WD |
| 4 | Luxury |
| 5 | Sports |
| 5 | Sedan |
| 5 | 4WD |
| 5 | Luxury |
| 6 | Sports |
| 6 | Sedan |
| 6 | 4WD |
| 6 | Luxury |
| 7 | Sports |
| 7 | Sedan |
| 7 | 4WD |
| 7 | Luxury |
| 8 | Sports |
| 8 | Sedan |
| 8 | 4WD |
| 8 | Luxury |
| 9 | Sports |
| 9 | Sedan |
| 9 | 4WD |
| 9 | Luxury |
| 10 | Sports |
| 10 | Sedan |
| 10 | 4WD |
| 10 | Luxury |
+----+--------+
40 rows in set (0.00 sec)
그럼 더 보스, 그는 더 많은 정보를 다시 뒤로를 하고 있다. I 다운로드하려는 동일한 목록에 포함할 뿐만 아니라 4WDs 항목이없습니다 . 그러나 그것은 우리를 보기입니다 숭배자들로부터도 명분으로 보면 두 가지 다른 방법으로 이를 위해. 우리는 이 조항을 추가할 수 있는 다른 조건을 다음과 같습니다.
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
join brands d
on a.brand=d.ID
where
b.ID=1
or b.ID=3
위의 완벽하게 사용할 수 있으며, 이 과정은 매우 잘 이것좀봐 표시하십시오 쿼리하지 노조의 주장은 '어떻게 다르게 작동합니다. 우리가 알고 있는 다음 반환되므로 모든 스포츠카.
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
join brands d
on a.brand=d.ID
where
b.ID=1
그리고 다음 돌아갈 것이라고 모든 4WDs:
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
join brands d
on a.brand=d.ID
where
b.ID=3
그래서 'union all' 조항을 추가하여 그들 사이에 두 번째 질의 결과를 덧붙여집니다 결과가 될 첫 번째 질의입니다.
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
join brands d
on a.brand=d.ID
where
b.ID=1
union all
select
a.ID,
b.model,
c.color
from
cars a
join models b
on a.model=b.ID
join colors c
on a.color=c.ID
join brands d
on a.brand=d.ID
where
b.ID=3
+----+--------+-------+
| ID | model | color |
+----+--------+-------+
| 1 | Sports | Red |
| 8 | Sports | Green |
| 10 | Sports | White |
| 3 | Sports | Black |
| 5 | 4WD | Green |
| 7 | 4WD | White |
| 9 | 4WD | Black |
+----+--------+-------+
7 rows in set (0.00 sec)
먼저 첫 결과는 알 수 있듯이, 그 뒤를 이어 두 번째 나님이시거늘 쿼리하지 결과 질의입니다. 물론 그동안 예제에서와 것이라는 노조의 쿼리를 실행할 수 있지만, 첫 번째 '를 사용하여 간단히 훨씬 쉽게 쿼리하지 멋지구리해요 구체적인 사건에 대한. 이들은 구체적인 성과가 나올 수 있는 좋은 방법을 반환되기를 테이블의 테이블, t # 39 에서 쉽게 결합되었는지 충족하거나 중에서도 - aren& 함께 완전히 연관해제된 표. 몇 가지 규칙을 따를 수 있다.
select
a.brand
from
brands a
+--------+
| brand |
+--------+
| Ford |
| Toyota |
| Nissan |
| Smart |
| BMW |
| Holden |
+--------+
6 rows in set (0.00 sec)
이 때, 우리는 이제 우리의 자동차 참가하십시오 테이블 우리 다음 결과:.
select
a.brand
from
brands a
join cars b
on a.ID=b.brand
group by
a.brand
+--------+
| brand |
+--------+
| BMW |
| Ford |
| Nissan |
| Smart |
| Toyota |
+--------+
5 rows in set (0.00 sec)
우리는 당연히 문제가 있는 것을 보고 '브랜드' 러블리 aren& # 39, 내가 홀든 언급하지 않는다 "고 덧붙였다.
select
a.brand
from
brands a
left outer join cars b
on a.ID=b.brand
group by
a.brand
+--------+
| brand |
+--------+
| BMW |
| Ford |
| Holden |
| Nissan |
| Smart |
| Toyota |
+--------+
6 rows in set (0.00 sec)
지금까지 우리는 할 수 있는 기능 등을 추가할 수 있으며, 우리 사장님이 너무 집계 결과를 얻기 위해 카운트입니다 오프하도록 잠시.
select
a.brand,
count(b.id) as countOfBrand
from
brands a
left outer join cars b
on a.ID=b.brand
group by
a.brand
+--------+--------------+
| brand | countOfBrand |
+--------+--------------+
| BMW | 2 |
| Ford | 2 |
| Holden | 0 |
| Nissan | 1 |
| Smart | 1 |
| Toyota | 5 |
+--------+--------------+
6 rows in set (0.00 sec)
그리고, 이로써 빼냅니다 사장님이 농땡이부리다. 이제 좀 더 자세히 설명할 수 있는 ',' 이 '또는' 오른쪽 왼쪽 외부 조인은 '유형:. 어떤 표) 는 왼쪽 또는 오른쪽 eventtest 완전히 포함되어 있습니다. 왼쪽 외부 조인 a '' 가 있는 테이블의 행은 모두 포함하고 있으며, 왼쪽 오른쪽과 왼쪽 외부 조인은 기능적으로 동일하다 '는' (rec.601 했겠어) 한 테이블에서 모든 결과가 오른쪽에 꽂으십시오 결과를 얻을 수 있습니다. 일부 데이터베이스는 외부 조인 '수' 있는 전체 그것을들추어 뒤로를 결과 (표시할지를 매칭됨 방관하겠나) 를 모두 , t 에서 isn& # 39 표, 하지만 이 모든) 이다. 그림, 아마 지금 이 시점에서 틀렸다니까 여부를 만날 수 있는 결합 형식에 병합할 수 있습니다 "예" 라고 대답한 nnt qeury - 및 수 있습니다.
select
b.brand,
c.color,
count(a.id) as countOfBrand
from
cars a
right outer join brands b
on b.ID=a.brand
join colors c
on a.color=c.ID
group by
a.brand,
c.color
+--------+-------+--------------+
| brand | color | countOfBrand |
+--------+-------+--------------+
| Ford | Blue | 1 |
| Ford | White | 1 |
| Toyota | Black | 1 |
| Toyota | Green | 2 |
| Toyota | Red | 1 |
| Nissan | Black | 1 |
| Smart | White | 1 |
| BMW | Blue | 1 |
| BMW | White | 1 |
+--------+-------+--------------+
9 rows in set (0.00 sec)
그럼, 왜 안 되는 결과가 에로남이네 그렇고여 걱정했던것? 이는 차량 외부 참가하십시오 wasn& # 39 에서 선택한 우리는 브랜드, 정보기술 (it), t - 그칠 수 있도록 지정된 특정 참가하십시오 뒤로를 재연됩니다 일치하는 결과를 참가하십시오 색계열 모두에서 표. 다음은 질의 결과를 얻을 수 있는 우리가 노력할 것으로 보인다.
select
a.brand,
c.color,
count(b.id) as countOfBrand
from
brands a
left outer join cars b
on a.ID=b.brand
left outer join colors c
on b.color=c.ID
group by
a.brand,
c.color
+--------+-------+--------------+
| brand | color | countOfBrand |
+--------+-------+--------------+
| BMW | Blue | 1 |
| BMW | White | 1 |
| Ford | Blue | 1 |
| Ford | White | 1 |
| Holden | NULL | 0 |
| Nissan | Black | 1 |
| Smart | White | 1 |
| Toyota | NULL | 1 |
| Toyota | Black | 1 |
| Toyota | Green | 2 |
| Toyota | Red | 1 |
+--------+-------+--------------+
11 rows in set (0.00 sec)
보듯, 우리는 두 개의 외부 조인을 쿼리하고 결과가 예상대로 지나갑니다. 이야기는 이제 어떻게 다른 유형의 조인 물어보세요? 교차 어때? 모든 것이 아니라 거의 모든 데이터베이스 데이터베이스 '를 지원할 수 있게 만드는 통해 교차' 교차 조인 (또는 최소한 잘 구조화된 creditbank. 기술서임을). 일종의 '노조의 유사한 참가하십시오 교차하는 다소 차이는 있지만 위에서 설명한 것이 - 만 행뿐만 되돌려줍니다 있는 데이터를 모두 동일해집니다 (및 나는한다 짓궂군요 동일해집니다) 사이의 다양한 개별 쿼리합니다 노조 동참했다. 모든 면에서 모두 동일해집니다 행 만 귀의하노라 다음과 같은 간단한 예를 약간만이라도
select
*
from
colors
where
ID>2
intersect
select
*
from
colors
where
id<4
반면 일반 '노조의 모든 쿼리하지 돌아갈 것이라고 테이블의 행 (첫 번째 쿼리하지 다시 그 위에 2' 와 ',' ID> ID< 아무것도 가진 두 번째, 4 ') 가 되는 완벽한 생길 수밖에 없다' 'id = 3 일치 쿼리하지 교차될 반품해야 행일 때문에 모두 충족합니다 기준은 다음과 같다. 이제 데이터베이스가 doesn& # 39 위, t 를 지원할 수 있도록 쉽게 '다음' 교차될 쿼리하지 마컴리시드 쿼리하지:
select
a.ID,
a.color,
a.paint
from
colors a
join colors b
on a.ID=b.ID
where
a.ID>2
and b.ID<4
+----+-------+----------+
| ID | color | paint |
+----+-------+----------+
| 3 | Blue | Metallic |
+----+-------+----------+
1 row in set (0.00 sec)
서로 다른 두 곳의 경우 분할됩니다 프로파일링하려는 리셋합니다 doesn& t # 39 를 지원할 수 있는 데이터베이스를 사용하여 테이블을 교차 조인, 본질적으로 쿼리하지 모든 열에 대한 테이블을 만들어야 합니다.
Ok, I found 이 포스트 작성에 대한 지식을 공유하고 싶다 내 매우 흥미로운 및 일부 질의입니다. 이 플루프레 주셔서 감사합니다. 이 있음을 느낄 수 있으며, 다른 사람들에게 읽을 수 있습니다 잘못된 I& # 39 만 101% 가 자유롭게 편집 및 흠잡다 my answer. ( 장난하는거아니고 내 잘못을 고치는 것 같아 기분이 매우 감사한다 %hsmb 제공합니다.)
그러나 이 같은 스키마에는
CREATE TABLE MovieList
(
ID INT,
MovieName VARCHAR(25),
CONSTRAINT ml_pk PRIMARY KEY (ID),
CONSTRAINT ml_uq UNIQUE (MovieName)
);
INSERT INTO MovieList VALUES (1, 'American Pie');
INSERT INTO MovieList VALUES (2, 'The Notebook');
INSERT INTO MovieList VALUES (3, 'Discovery Channel: Africa');
INSERT INTO MovieList VALUES (4, 'Mr. Bean');
INSERT INTO MovieList VALUES (5, 'Expendables 2');
CREATE TABLE CategoryList
(
MovieID INT,
CategoryName VARCHAR(25),
CONSTRAINT cl_uq UNIQUE(MovieID, CategoryName),
CONSTRAINT cl_fk FOREIGN KEY (MovieID) REFERENCES MovieList(ID)
);
INSERT INTO CategoryList VALUES (1, 'Comedy');
INSERT INTO CategoryList VALUES (1, 'Romance');
INSERT INTO CategoryList VALUES (2, 'Romance');
INSERT INTO CategoryList VALUES (2, 'Drama');
INSERT INTO CategoryList VALUES (3, 'Documentary');
INSERT INTO CategoryList VALUES (4, 'Comedy');
INSERT INTO CategoryList VALUES (5, 'Comedy');
INSERT INTO CategoryList VALUES (5, 'Action');
질문 *
솔루션 *
이 질문은 매우 까다로운 가끔씩요 수 있습니다. 앞으로 이와 같은 포지셔닝합니다 답변 쿼리하지 있는 것처럼 보일 수도 있습니다.
SELECT DISTINCT a.MovieName
FROM MovieList a
INNER JOIN CategoryList b
ON a.ID = b.MovieID
WHERE b.CategoryName = 'Comedy' AND
b.CategoryName = 'Romance'
이는 매우 잘못된 결과 없음 말해둘꼐요 얻을 수 있기 때문이다. 이 관계자의 설명을 하나 밖에 없는 것이 올바른 가치를 카테고리나미 '에' 각 행의 . 예를 들어, 두 번째 조건이 true , , 첫 번째 조건을 되돌려줍니다 항상 거짓값. 따라서 진정한 조건을 모두 사용하여 '와' 연산자입니다 합니다. 그렇지 않으면 거짓값. 이 같은 다른 질의입니다
SELECT DISTINCT a.MovieName
FROM MovieList a
INNER JOIN CategoryList b
ON a.ID = b.MovieID
WHERE b.CategoryName IN ('Comedy','Romance')
그 결과 여전히 기록할 수 있는 잘못된 일치하므로 적어도 한 경기를 카테고리나미 '에서'. 이 레코드를 통해 실질적인 해결책을 약간만이라도 편당 인스턴스입니다 수를 계산. 이 값은 인스턴스입니다 수는 총 공급 조건을 일치해야 합니다.
SELECT a.MovieName
FROM MovieList a
INNER JOIN CategoryList b
ON a.ID = b.MovieID
WHERE b.CategoryName IN ('Comedy','Romance')
GROUP BY a.MovieName
HAVING COUNT(*) = 2
[SQL 관계형 사단] (http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/)
주어진 스키마에는
CREATE TABLE Software
(
ID INT,
SoftwareName VARCHAR(25),
Descriptions VARCHAR(150),
CONSTRAINT sw_pk PRIMARY KEY (ID),
CONSTRAINT sw_uq UNIQUE (SoftwareName)
);
INSERT INTO Software VALUES (1,'PaintMe','used for photo editing');
INSERT INTO Software VALUES (2,'World Map','contains map of different places of the world');
INSERT INTO Software VALUES (3,'Dictionary','contains description, synonym, antonym of the words');
CREATE TABLE VersionList
(
SoftwareID INT,
VersionNo INT,
DateReleased DATE,
CONSTRAINT sw_uq UNIQUE (SoftwareID, VersionNo),
CONSTRAINT sw_fk FOREIGN KEY (SOftwareID) REFERENCES Software(ID)
);
INSERT INTO VersionList VALUES (3, 2, '2009-12-01');
INSERT INTO VersionList VALUES (3, 1, '2009-11-01');
INSERT INTO VersionList VALUES (3, 3, '2010-01-01');
INSERT INTO VersionList VALUES (2, 2, '2010-12-01');
INSERT INTO VersionList VALUES (2, 1, '2009-12-01');
INSERT INTO VersionList VALUES (1, 3, '2011-12-01');
INSERT INTO VersionList VALUES (1, 2, '2010-12-01');
INSERT INTO VersionList VALUES (1, 1, '2009-12-01');
INSERT INTO VersionList VALUES (1, 4, '2012-12-01');
각 소프트웨어에 대한 최신 버전 찾습니다. 디스플레이 열은 다음과 같습니다. '소프트바레나미', '설명', '', '다테레이스트 라테스트베르시온' ( 버지노 에서 열 )
일부 SQL 개발자 '실수로' MAX () 함수를 사용하여 집계. 이 같은 만드는 경향이 있습니다
SELECT a.SoftwareName, a.Descriptions,
MAX(b.VersionNo) AS LatestVersion, b.DateReleased
FROM Software a
INNER JOIN VersionList b
ON a.ID = b.SoftwareID
GROUP BY a.ID
ORDER BY a.ID
( 대부분의 RDBMS 생성하는지 구문 오류가 이 때문에 일부 조항이 없는 '에 열을 specifying 비사양 집선됨 그룹순' ) '이 아니라' 결과 '를 생산하는 수정하십시오 라테스트베르시온 다테레이스트' 이 각 소프트웨어 분명히 잘못된. mysql ',' 창 'doesn& # 39 표' 와 '아직' t 지원 기능을 일부 기업들은 이미 일반적인 RDBMS movd 표현식에서는. 이 문제에 대한 '가' 이 문제를 해결할 수 있는 최대 '' 를 만드는 것이 나중에 각 개별 서브케리 버지노 가입할 수 있는 소프트웨어 및 기타 테이블.
SELECT a.SoftwareName, a.Descriptions,
b.LatestVersion, c.DateReleased
FROM Software a
INNER JOIN
(
SELECT SoftwareID, MAX(VersionNO) LatestVersion
FROM VersionList
GROUP BY SoftwareID
) b ON a.ID = b.SoftwareID
INNER JOIN VersionList c
ON c.SoftwareID = b.SoftwareID AND
c.VersionNO = b.LatestVersion
GROUP BY a.ID
ORDER BY a.ID
그래서 이거라니까 # 39, 곧 다른 모든 FAQ 글을 i& as I 'll be 다른 재호출 태그이고, MySQL 의' 이 작은 글 읽어 주셔서 감사합니다. 이를 통해 얻을 수 있는지 전혀 알지 더 이상의 됐으면 좋겠다 "고 말했다.
주어진 스키마에는
CREATE TABLE userList
(
ID INT,
NAME VARCHAR(20),
CONSTRAINT us_pk PRIMARY KEY (ID),
CONSTRAINT us_uq UNIQUE (NAME)
);
INSERT INTO userList VALUES (1, 'Fluffeh');
INSERT INTO userList VALUES (2, 'John Woo');
INSERT INTO userList VALUES (3, 'hims056');
CREATE TABLE CONVERSATION
(
ID INT,
FROM_ID INT,
TO_ID INT,
MESSAGE VARCHAR(250),
DeliveryDate DATE
);
INSERT INTO CONVERSATION VALUES (1, 1, 2, 'hi john', '2012-01-01');
INSERT INTO CONVERSATION VALUES (2, 2, 1, 'hello fluff', '2012-01-02');
INSERT INTO CONVERSATION VALUES (3, 1, 3, 'hey hims', '2012-01-03');
INSERT INTO CONVERSATION VALUES (4, 1, 3, 'please reply', '2012-01-04');
INSERT INTO CONVERSATION VALUES (5, 3, 1, 'how are you?', '2012-01-05');
INSERT INTO CONVERSATION VALUES (6, 3, 2, 'sample message!', '2012-01-05');
2 명의 사용자 간의 대화를 최신값 찾습니다.
SELECT b.Name SenderName,
c.Name RecipientName,
a.Message,
a.DeliveryDate
FROM Conversation a
INNER JOIN userList b
ON a.From_ID = b.ID
INNER JOIN userList c
ON a.To_ID = c.ID
WHERE (LEAST(a.FROM_ID, a.TO_ID), GREATEST(a.FROM_ID, a.TO_ID), DeliveryDate)
IN
(
SELECT LEAST(FROM_ID, TO_ID) minFROM,
GREATEST(FROM_ID, TO_ID) maxTo,
MAX(DeliveryDate) maxDate
FROM Conversation
GROUP BY minFROM, maxTo
)
자, 이제 다시 내가 원하는 모든 우리 사장님이 버스트할 있다 - 바뀌엇어요 있는 자동차 브랜드로 총 가부키쇼 해당 브랜드에 우리는! 이 과정은 매우 가방아니에요! 의 자료 - SQL 을 사용할 수 있는 기회를 다음 트릭 서브케리. 이 용어는 서브케리 익숙하지 않은 경우, a 는 실행되는 쿼리하지 안에 다른 질의입니다. 여러 가지 다른 방법으로 이를 사용할 수 있습니다. 우리의 요청에 대한 간단한 쿼리를 할 수 있도록 각 차량 목록, 첫 번째 동일팔레트에 함께, 브랜드:
select
a.ID,
b.brand
from
cars a
join brands b
on a.brand=b.ID
지금, 우리가 받을 수 있습니다 물론 자동차 브랜드로 정렬할지 그들이성년에 단순히 카운트입니다 쓴:
select
b.brand,
count(a.ID) as countCars
from
cars a
join brands b
on a.brand=b.ID
group by
b.brand
+--------+-----------+
| brand | countCars |
+--------+-----------+
| BMW | 2 |
| Ford | 2 |
| Nissan | 1 |
| Smart | 1 |
| Toyota | 5 |
+--------+-----------+
그래서 우리는 수 있는 기능을 추가할 수 있어야 한다는 이전의 쿼리하지 맞죠?
select
a.ID,
b.brand,
count(a.ID) as countCars
from
cars a
join brands b
on a.brand=b.ID
group by
a.ID,
b.brand
+----+--------+-----------+
| ID | brand | countCars |
+----+--------+-----------+
| 1 | Toyota | 1 |
| 2 | Ford | 1 |
| 3 | Nissan | 1 |
| 4 | Smart | 1 |
| 5 | Toyota | 1 |
| 6 | BMW | 1 |
| 7 | Ford | 1 |
| 8 | Toyota | 1 |
| 9 | Toyota | 1 |
| 10 | BMW | 1 |
| 11 | Toyota | 1 |
+----+--------+-----------+
11 rows in set (0.00 sec)
안타깝게도, 아니, 우리는 can& # 39, 그렇게 할 수 없다. 그 이유는 추가 될 때 우리는 차에 ID (열 수 있습니다. 우리는 이제 그룹순 - id) 기능을 추가할 수 있도록 이를 때 단 하나의 ID, ID 당 작동됨 정합된. 그러나 우리 여기서 사용할 수 있는 다양한 유형의 서브케리 서브케리 - 사실 우리가 할 수 있는 2 개의 완전히 동일한 결과를 반환되므로 필요하다고 엔드입니다. 첫 번째 방법은 간단히 말해 '선택' 이 있는 서브케리 핵심이 되는 말이다. 즉, we get off, 서브케리 실행할 때마다 데이터를 행과 열을 확보하십시오 후 바로 우리의 행 데이터 팝 데이터.
select
a.ID,
b.brand,
(
select
count(c.ID)
from
cars c
where
a.brand=c.brand
) as countCars
from
cars a
join brands b
on a.brand=b.ID
+----+--------+-----------+
| ID | brand | countCars |
+----+--------+-----------+
| 2 | Ford | 2 |
| 7 | Ford | 2 |
| 1 | Toyota | 5 |
| 5 | Toyota | 5 |
| 8 | Toyota | 5 |
| 9 | Toyota | 5 |
| 11 | Toyota | 5 |
| 3 | Nissan | 1 |
| 4 | Smart | 1 |
| 6 | BMW | 2 |
| 10 | BMW | 2 |
+----+--------+-----------+
11 rows in set (0.00 sec)
이는 및 딱! do us. 하지만 잘 살펴보면, 모든 단일 데이터 행을 각 실행하십시오 이 쿼리하지 서브노드 할 것이라고 우리는 귀의하노라 이 작은 공간에서도 우리는 다양한 브랜드의 차량 5 개만 들어 있지만, 우리는 우리가 실행했음 서브케리 11 배 11 행 데이터 반품하는. 따라서 이 경우, 가장 효과적인 방법은 doesn& # 39, 코드를 작성하는 것처럼 보이는 것이다. 다른 외곽진입, 서브케리 및 치라구요 대한 비헤이비어는 실행하십시오 컴포지션이 table:
select
a.ID,
b.brand,
d.countCars
from
cars a
join brands b
on a.brand=b.ID
join
(
select
c.brand,
count(c.ID) as countCars
from
cars c
group by
c.brand
) d
on a.brand=d.brand
+----+--------+-----------+
| ID | brand | countCars |
+----+--------+-----------+
| 1 | Toyota | 5 |
| 2 | Ford | 2 |
| 3 | Nissan | 1 |
| 4 | Smart | 1 |
| 5 | Toyota | 5 |
| 6 | BMW | 2 |
| 7 | Ford | 2 |
| 8 | Toyota | 5 |
| 9 | Toyota | 5 |
| 10 | BMW | 2 |
| 11 | Toyota | 5 |
+----+--------+-----------+
11 rows in set (0.00 sec)
그럼 우리가 같은 결과 (순서정리된 약간 다른 - 어쩌면 우리가 주문한 자신의 첫 번째 열에 데이터베이스입니까 그들이성년에 반환되기를 결과 이 시간) - 그런데 같은 오른쪽맞춤 숫자임. 따라서 what& # 39 의 차이는 각 유형의 서브케리 사용할 때 2-소켓 및 하는가? 첫째, 우리는 어떻게 이해할 수 있는 smartupdate 쿼리하지 두 번째 작품. 우리가 선택한 다음 '에서 우리 테이블에서 2 항) 이란 것은 사실 쿼리하고 리즈한테 쿼리하지 데이터베이스 테이블 대신 - 어떤 데이터베이스입니까 완벽하게 만족하고 있다. 다소 혜택을 볼 수 있는데 이 방법을 사용하여 (물론 몇 가지 제한이 있다). 일단 가장 중요한 것은 이 서브케리 실행했음 . 만약 우리 방대한 양의 데이터가 될 수 있다고 v2.03-00 데이터베이스 및 개선, 상반기에 비해 메서드입니다. 그러나 우리는 우리가 가지고 있는 데이터 테이블, 이를 빌미로 추가 행뿐만 - 이 될 수 있도록 우리 행뿐만 뒤로를 결합되었는지 데이터. 또한, 지금부터 충분히 할 수 있는지 행뿐만 경우 데이터를 사용할 수 있는 등 간단한 참가하십시오 쿼리하지 명이다. 이 경우 데이터가 모두 일치하는 뒤로를 당기십시오 참가하십시오 재호출 그칠 수밖에 없는 행뿐만 참가하십시오 제안했다. 만약 우리가 aren& # 39, t 조심하세요, 이로 인해 자동차 협업공간이 wasn& # 39 표, t) 의 데이터를 사용할 수 없는 반환되었습니다 일치하는 행일 이 서브케리. 이제 보았으매 뒤로 서브케리, 처음 몇 가지 한계에는 잘 알려져 있다. , 전용 데이터를 다시 볼 수 있기 때문에 우리는 한 행 한 행이 뒤로를 당기십시오 데이터. 부질 매우 자주 사용되는 '선택' 조항 등 '합', '만 사용할 수 있는 하나의 통합된 기능을 쿼리하지 카운트입니다 맥스야' 또는 ',' 또 다른 유사한 집계 함수. T , # 39 를 쓰는 것이 아니라, 그들이 don& %s/dbase/ext_table. 방식을 씁니다. 그래서, 전에 우리가 나아갈 수 있는 서브케리 빠르게 확인할 수 있을 만한 곳을 이용할 수 있다. 우리는 여기서 '조' 에서 사용할 수 있는 것이 이 비유하사 나 - 이제 조금 더 나은 방법을 따라 데이터베이스에서 데이터를 얻는 것은 물론, 그 다음 몇 가지 예를 들면 투명지에 여바바 대해서만 볼 수 있습니다.
select
ID,
brand
from
brands
where
brand like '%o%'
+----+--------+
| ID | brand |
+----+--------+
| 1 | Ford |
| 2 | Toyota |
| 6 | Holden |
+----+--------+
3 rows in set (0.00 sec)
이 목록이 있습니다 되돌려줍니다 브랜드 침입탐지시스템 (ids) · 브랜드 이름 (두 번째 열은 국한됨 추가되도록 저희들을 브랜드를) 이 포함된 문자 'o' in the name. 이제 우리가 사용할 수 있는 이 질의에서는 이 결과를 where 절:
select
a.ID,
b.brand
from
cars a
join brands b
on a.brand=b.ID
where
a.brand in
(
select
ID
from
brands
where
brand like '%o%'
)
+----+--------+
| ID | brand |
+----+--------+
| 2 | Ford |
| 7 | Ford |
| 1 | Toyota |
| 5 | Toyota |
| 8 | Toyota |
| 9 | Toyota |
| 11 | Toyota |
+----+--------+
7 rows in set (0.00 sec)
알 수 있듯이, 비록 우리의 자동차 브랜드 id 가 돌아오고 서브케리, 테이블 항목에 대한 2 명은 3 만 있었다. 이 경우, 만약 우리가 이 일을 작성했습니까 서브케리 는 자세한 내용은 다음 코드:
select
a.ID,
b.brand
from
cars a
join brands b
on a.brand=b.ID
where
a.brand in (1,2,6)
+----+--------+
| ID | brand |
+----+--------+
| 1 | Toyota |
| 2 | Ford |
| 5 | Toyota |
| 7 | Ford |
| 8 | Toyota |
| 9 | Toyota |
| 11 | Toyota |
+----+--------+
7 rows in set (0.00 sec)
다시 볼 수 있습니다 돌아온 때 순서는 어떻게 서브케리 vs 수작업식 투입물 변경되었습니까 행뿐만 데이터베이스입니까. 우리는 우리가 뭘 할 수 있는지 설명할 수 있는 동안, 부질 서브케리:
추가해야 할 줄 알았는데, 요령을 대한 몇 가지 추가 비트를 가진 으으
내가 보고 한 질문에 올라와 있으며, 2 개의 테이블 얼마나 구입합니까) 에서 가장 공정한 약어입니다 일치하지 않는 내가 보고 가장 많이 수락됨 다음과 같은 답을 할 수도 있다 (바탕으로 자동차 및 브랜드 표 - 디스크입니다. diskid 나열되는지 비호환성의 나타나지 않지만, 홀덴 브랜드를 자동차 표):
select
a.ID,
a.brand
from
brands a
where
a.ID not in(select brand from cars)
+----+--------+
| ID | brand |
+----+--------+
| 6 | Holden |
+----+--------+
1 row in set (0.00 sec)
그러나 이는 일부 데이터베이스를다시 효율적인 없습니다. 이것은 [https://partner. microsoft. 스택 오버플로우 질문] (https://stackoverflow.com/questions/1179231/sql-efficiency-where-in-subquery-vs-join-then-group) 는 이에 대해 묻는 avamar [ui_policytable_java_spe_policy 뛰어난 심도 있는 문서] (http://explainextended.com/2009/06/16/in-vs-join-vs-exists/) 에 afaq 스케쳐내 서캐 투성이의 단호한.
이 경우, t # 39 는 단답형 최적화 doesn& 이를 효율적으로 처리할 수 있으며, 다음과 같은 쿼리하지 사용할 수 있는 내가 긁어줄게 afaq 비사양 매칭됨 행:
select
a.brand
from
brands a
left join cars b
on a.id=b.brand
where
b.brand is null
+--------+
| brand |
+--------+
| Holden |
+--------+
1 row in set (0.00 sec)
아, 좋아요, 하지만 다른 명곡 can& t & # 39 - 이전 # 39 표, # 39 brands& 대상 지정할 수 있습니다. 에서 업데이트 했다.
MySQL 실행할 수 있는 세부 선택 도구 않습니다 '업데이트하십시오.' 같은 컨트롤러상의 쿼리하지 한 표. 지금 고민해야 할 수 있도록 이를 왜안돼요 그냥 찰싹, where 절 맞죠? 하지만 와일드링이 행일 '만' 잊으십시오 데이트였어 업데이트하려는 a bunch of max () 와 다른 행뿐만? # 39 의 당근이지를 can& t where 절, 그렇게 할 수 있습니다.
update
brands
set
brand='Holden'
where
id=
(select
id
from
brands
where
id=6);
ERROR 1093 (HY000): You can't specify target table 'brands'
for update in FROM clause
그래서, 우리는 그렇게 can& t # 39, 어? 아니라 당근이지를. 의외로 많은 사용자를 don& 페인트하는 해결하십시오 교활한 있습니다 # 39, t know about - 않니다 포함시키십시오 표시되어도 일부 헤이커리 신경을 써야 할 수 있습니다.
이 안에 다른 차이가 있을 수 있습니다, 이로 인해 서브케리 서브케리 스틱 두 쿼리합니다 사용할 수 있다는 것입니다. 하지만 그대로 나올 수도 있을 것이라고 이 트랜잭션 내에서 가장 안전한 쿼리하지 - 이 것을 막을 수 있을 때 다른 테이블에 질의입니다 변경 사항이 있습니다.
update
brands
set
brand='Holden'
where id=
(select
id
from
(select
id
from
brands
where
id=6
)
as updateTable);
Query OK, 0 rows affected (0.02 sec)
Rows matched: 1 Changed: 0 Warnings: 0
키워드 질의를 통해 여러 总监和首席信息官完全了解 사용할 수 있습니다. 예를 들어 내가 보여줄게.
SELECT DISTINCT e.id,e.name,d.name,lap.lappy LAPTOP_MAKE,c_loc.cnty COUNTY
FROM (
SELECT c.id cnty,l.name
FROM county c, location l
WHERE c.id=l.county_id AND l.end_Date IS NOT NULL
) c_loc, emp e
INNER JOIN dept d ON e.deptno =d.id
LEFT JOIN
(
SELECT l.id lappy, c.name cmpy
FROM laptop l, company c
WHERE l.make = c.name
) lap ON e.cmpy_id=lap.cmpy
싶은 수만큼 테이블을 사용할 수 있습니다. # 39, & union 사용할 수 있는 외부 조인은 테이블, 심지어 인사이드라면 부질 판매업체에서 it& 필요한 것이다.
이를 통해 희망을 찾을 수 있는 건 you& # 39 표, re 판독값 통해 있다.
mysql> show columns from colors;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(3) | NO | PRI | NULL | auto_increment |
| color | varchar(15) | YES | | NULL | |
| paint | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+