본문 바로가기
SQL

순서가 중요한 SQL

by ernest45 2023. 5. 21.

 

안 궁금하다구요?.. 섭섭

 

나는 왼손잡이라서 항상 세상을 살면서 불편한 일들을 많이 겪었다.

스포츠들은 좋아해서 그럴 땐 유리하게 작용했지만,,  결국에는  보다 편하게 세상에 적응하려고

양손을 자유자재로 쓸 수 있게 되었다.

(어릴 때 많이 혼나서 그런 듯ㅠㅠ 살아남기 위해 생존형 양손잡이..)

 

 

 

우리는 세상 속을 살면서 자연스럽게 왼쪽과 오른쪽에 속성을 부여하고 있다.

시계 방향은 오른쪽으로 도는 것이 기준이고, 우측통행이며, 코딩을 할 때도 왼쪽에서 오른쪽으로 쓰고 읽는다.

또 영어만 해도 left는 약하다, right는 옳다고 표현하고 있으니까...

우리 인류는 90%가 오른손을 사용하고, 10%만 왼손잡이인데, 선사시대나 고대 유물들을 봐도 대부분이

오른손잡이용이었다는 거다..

(우리나라는 밥상머리 교육 때문에 2~5% 정도라고 알려져 있다.)

 

 

이렇게 왼쪽과 오른쪽이 가져오는 속성들은 우리에게  당연하게 여겨지고,

그 이유가 인류 대부분이 오른손잡이의 기준으로 세상이 만들어져서라고 말해도 과언이 아니라고 할 수 있다.

 

 

 

 

 

 

사실은 SQL관련 필기하다가 왼손잡이라서 손에 흑연이 너무 많이 묻어 개빡쳐 가지구

"왜 왼손잡이가 적은 거고 어떻게 왼손잡이가 발현되는 걸까?" 찾아보게 되었다...

 

 

 

먼저 좌뇌와 우뇌의 비대칭설이 제일 유력하다.

우리 몸에서 오른쪽은 좌뇌의 영향을 많이 받고, 왼쪽은 우뇌의 영향을 받는 비대칭적으로 이루어져 있다.

먼저 인류가 존속하고 번창하기 위해서 더 필요한 요소들은 좌뇌를 담당하는 언어적, 사회성, 계산적 판단들이

오른손을 통해 발현되는 거다..

(근데 좌뇌를 많이 써서 오른손이 발달했는지,, 아니면 오른손을 써서 좌뇌가 발달한 지는 모르겠다.)

 

 

닭이 먼저냐.. 달걀이 먼저냐.. 치킨이 더 맛있으니 아무튼 닭이다

 

 

두 번째로 유전적인 영향이 있는데,

주변 왼손잡이들에게 질문을 했을 때 대 다수가 부모님 중 왼손잡이가 있다고 했다.

부모님 둘 다 왼손일수록 더 크고 딸보단 아들이 더 확률이 크다.

나도 물론 아버지가 왼손잡이셔서 이 가설이 좀 더 신빙성이 있어 보였다.

 

 

많은 유전자 가설 중 하나를 설명하자면,

오른손만 결정하는 D유전자와 그에 대립하는 돌연변이 C유전자가 있는데,

D유전자를 엄마, 아빠에게 각각 D를 물려받아 DD형이 되면 100% 오른손잡이가 되지만,

C유전자를 엄마, 아빠에게 각각 C를 물려받아 CC형이 되면 그냥 반반의 확률로 왼손잡이거나 오른손잡이가 된다.

즉 C 유전자는 D와 대립 유전자지만, 왼손이나 오른손을 결정하지 못한다는 뜻이다..!

만약 DC를 받게 되면  75%로 ......

 

아 여튼 길어지니까 대충 왼손잡이가 발현할 확률이 C 저 자식이 나약해서 엄청 낮다고 알아두자..

(그리구 더 신기한 건 왼손잡이면 가마 방향이 시계 반대 방향일 확률이 높대.. 확인해 줄 사람?)

 

 

마지막으로 "세상이 오른 손잡이 위주라서" 그렇다는 가설도 있던데..

반박 논문을 보니까 태아가 엄지를 빨거나 주로 쓰는 팔을 확인한 결과 9대 1로 비슷하게 나왔다구 한다..

 

 

 

이러한 이유들로 왼손잡이가 발현한다는 것을 알았고, 배경이나 예외들을 자세히 알아보면 더 더ㅓ더 재밌으니까 찾아봐..

"왜 그럼 영국만 좌측핸들 및 통행이냐?" , "한자는 왜 오른쪽에서 왼쪽으로 쓰는 거냐?" 이런 것들 ..

결국은 또 오른손이 이유니까.. ㅎ

 

 

 

 

 

이제 드디어 공부로 돌아와서  SQL에서

 

 

모든 데이터를 출력

SELECT* FROM 테이블명;

 

데이터에서 특정 컬럼만을 출력

SELECT 컬럼명1,컬럼명2 ... FROM 테이블명;

 

데이터에서 특정 데이터를 출력

SELECT * FROM 테이블명 WHERE 조건식;

 

테이블 간의 결합

 

INNER JOIN 

 

기본 값으로 두 테이블을 조인할 때 두 테이블에서 모두 지정한 열의 데이터가 있어야 함. (NULL X)

SELECT * FROM 테이블1 INNER JOIN 테이블2 ON 테이블1.칼럼 = 테이블2.칼럼;

 

OUTER JOIN

 

두 테이블에서 한쪽의 열의 데이터만 있어도 출력됨.

 

  • LEFT OUTER JOIN: 왼쪽 테이블의 모든 값이 출력되는 조인
SELECT * FROM 테이블1 LEFT JOIN 테이블2 ON 테이블1.칼럼 = 테이블2.칼럼;

 

  • RIGHT OUTER JOIN: 오른쪽 테이블의 모든 값이 출력되는 조인
SELECT * FROM 테이블1 RIGHT JOIN 테이블2 ON 테이블1.칼럼 = 테이블2.칼럼;

 

 

 

 

 

실제로 SQL 쿼리의 문법 순서와 실행 순서는 차이가 있다.

SELECT 컬럼명 --------------------- 실행순서(5)    
     FROM 테이블명 ------------------- 실행순서(1)

    WHERE 테이블 조건 --------------- 실행순서(2)

GROUP BY 컬럼명 -------------------- 실행순서(3)

   HAVING 그룹 조건 ----------------- 실행순서(4)

 ORDER BY 컬럼명 -------------------- 실행순서(6)

 

 

보면 FROM이 SQL 구문에서 제일 첫 번째로 나오는데,

실제 실행 순서는 다르다.

 

 

 

 

역시 형님의 조언은 데이터 베이스 엔진은 쿼리를 최적화하고 제일

효율적인 방법을 사용하기 위해 이렇게 문법과 실행순서가 다르다고 한다..

 

 

 

마찬가지로 SQL에서는 순서가 진짜 중요한 거 같다.

 

 

책에 대한 데이터를 입력하는 sql 데이터베이스가 예시이고 그를 위해

 

TABLE을 추가할 때 먼저 `user` 테이블과 `content `테이블을 생성하였다.

user, content

 

 

 

후에 `role`테이블이 필요해져서 따로 추가해 줘서

외래 키를 사용해 두 테이블 간의 연관성을 정의해 주었는데,

role 추가

 

 

 

직접 `user` 테이블에 추가를 해주니 오류가 났다..

아무 이상 없어 보이지만 안되더라..

 

 

이유를 모르겠어서 이것저것 찾아보다가, 혹시나 싶어` role` 테이블을 맨 위로 그냥 올려 버리자!

라는 단순한 해결책으로 해결을 시도했고

 

주먹구구식 해결

 

결과는 실행도 잘되더라.. 키 값 연동도 잘 되고..

 

 

 

결국에는 찾아냈는데, java와 달리 sql은 입력 순서도 엄청 중요하다고 한다.

java에서는 내가 뒤에 추가해 줘도 알아서 연동되었지만, sql은 순서에 따라 내가  'role' 테이블을 추가해 주면

그 위에 이미 작성된 `user` 테이블이 서로 인식을 못한다고 한다.. 

(잘 표현하고 싶은데 내가 이해한 대로..)

 

그래서 내가 한대로 작성이 이미 끝난 TABLE인 `user`에다가 외래 키를 직접  다시 설정하지 않고,

ALTER TABLE을 사용해야 한다.

 

ALRER TABLE

 

마지막에 이런 식으로 ALTER TABLE을 이용해 외래 키를 직접  할당해 주니 에러도 없고

내가 `role` 테이블을 맨 위로 올리는 주먹구구식 해결도 안 해도 되니 좋았다..

 

(만약 주먹구구식 해결을 하나씩 다 했으면 진짜 미련한 짓이겠지..)