230622 빠진 수업 내용 3 Oracle SQL [is null, IN, 논리연산자, 대소문자변환함수, 단일함수, 복수함수, substr, length, instr, replace, LPAD, RPAD, TRIM,

권주희·2023년 7월 13일
0

TIL

  1. 비교연산자 is null
  2. 비교연산자 in
  3. 논리연산자 AND, OR, NOT
  4. UPPER, LOWER, INITCAP 대소문자 변환 함수
  5. 문자에서 특정 철자 추출하기(SUBSTR)
  6. 문자열의 길이를 출력하기(LENGTH)
  7. 문자에서 특정 철자의 위치 출력하기(INSTR)
  8. 특정 철자를 다른 철자로 변경하기(REPLACE)
  9. 특정 철자를 n개만큼 채워넣기! (LPAD, RPAD)
  10. 특정 철자 잘라내기 (TRIM, RTRIM, LTRIM)

복습

어제 문제 풀이

SELECT ename,sal
from emp
where ename like '_m%m%%' escape 'm';

비교 연산자 배우기4 (IS NULL)

테이블에서 결측치 데이터를 데이터베이스에서는 null값이라고 호칭합니다.

null 값은
1. 데이터가 없는 상태
2. 알 수 없는 값 (unknown)

문제 48. 이름, 커미션을 출력하세요.

select ename, comm
 from emp;

문제 49. 이름, 커미션과 직업을 출력하세요
문제 50. 커미션이 null인 사원들의 이름, 커미션을 출력하세요.

select ename, comm
 from emp
 where comm is null;
  • null값은 =로 비교할 수 없다. null 값을 검색하기 위한 특별한 비교연산자가 필요한데
    이것이 is null !

▶ 다시 복습! 연산자 3가지
1. 산술 연산자: * / + -
2. 비교 연산자: >, <, >=, <=, =, !=, <>, !=

  • 기타 비교 연산자 4가지? (비교연산자에서 확장되어 더 자세하게 검색할 수 있게 함)
    1. between .. and
    2. like
    3. is null
    4. in
  1. 논리 연산자: and, or, not

문제 51. 커미션이 null이 아닌 사원들의 이름, 커미션 출력

select ename, comm
 from emp
 where comm is not null; // not 위치 !! , != 이런거 쓰면 안됨

문제 52. 관리자 번호(mgr)가 null이 아닌 사원들의 이름, 월급, 관리자번호를 출력하는데 월급이 높은 사원부터 출력하세요!

select ename, sal, mgr
 from emp
 where mgr is not null
 order by sal desc;

코딩순서 아닌 실행순서는 , from -> where -> select -> order by 순!!

비교연산자 배우기 5(IN)

= 연산자는 하나의 값만 검색할 수 있는데, in 연산자는 여러개의 값을 검색할 수 있다.

문제 53. 사원번호가 7788번인 사원의 사원번호와 이름을 출력

 select ename, empno 
  from emp
  where empno = 7788;

문제 54. 사원번호가 7788, 7902, 7369번인 사원의 사원번호와 이름 출력

 select ename, empno 
  from emp
  where empno in (7788, 7902, 7369);

문제 55. 직업이 salesman, analyst인 사원들의 이름, 월급, 직업 출력

 select ename, sal, job
  from emp
  where job in ('SALESMAN', 'ANALYST');

문제 56. 직업이 salesman, analyst가 아닌 사원들의 이름, 월급, 직업 출력

select ename, sal, job
 from emp
 where job not in ('SALESMAN', 'ANALYST');

not 위치가 가끔 달라도 쿼리를 리라이트 해서 데이터가 나오긴 하지만 리라이트 되는 시간도 드니까 정석대로 작성하는것이 좋다.

문제 57. 나이가 27, 29, 30인 학생들의 이름, 나이, 주소를 출력하는데 나이가 높은 학생부터 출력하세요.

select ename, age, address
 from emp17
 where age in (27, 29, 30)
 order by age desc;

문제 58. 우리반에서 성씨가 김씨인 학생들의 이름, 나이, 주소를 출력하는데 주소를 ascending하게 출력하시오!

select ename, age , address
 from emp17
 where ename like '김%'
 order by address asc;

문제 59. 우리반에서 송파구에 거주하지 않는 학생들의 이름, 나이, 주소 출력

select ename, age, address
 from emp17
 where address not like '%송파구%';
  • 복습! like는 중간에 문자열 검색할 때 사용 가능한 기타 비교 연산자. 이때 짝꿍은 % (와일드카드)
  • 복습! =은 하나의 값만 비교할 때 사용. in은 여러개의 값을 비교할 때 사용!

논리 연산자 배우기 (AND, OR, NOT)

select 컬럼명
from 테이블명
where 검색조건

일 때, 검색조건이 많을 때 where 검색조건1 and 검색조건2; 할 수 있는데
이 때 조건1, 조건2가 모두 true여야 한다 !!!

  • AND 는, 검색 조건이 전부 TRUE여야 검색이 된다!
  • OR는, 검색 조건이 TRUE OR FALSE 일 때 TRUE이다! 하나만 트루여도 트루임!!
    ex) where sal >= 1200 or job = 'salesma'; 여기서 job부분이 false인데 그럼에도 이건 연산자가 or 이라서 true임!
  • 정리: and는 검색 조건이 전부 다 true여야 검색이 된다. or 는 검색조건들중에 하나만 true여도 검색이 된다.

문제 60. 직업이 ANALYST인 사원들이고, 월급이 3000인 사원들의 이름, 월급, 직업 출력

select ename, sal, job
 from emp
 where job = 'ANALYST' and sal = 3000; // TRUE AND TRUE 임. 

문제 61. 월급이 1000 이상이거나, 부서번호가 20번인 사원들의 이름, 월급, 부서번호를 출력

select ename, sal, deptno
 from emp
 where sal >= 1000 or deptno = 20;

  • or을 사용했기 때문에 둘중 하나만 조건에 만족해도 출력이 된다.

문제 62. 이름의 성씨가 김씨 이거나 이씨인 학생들의 이름, 나이, 주소 출력하는데 나이가 높은 학생부터 출력

내가 쓴 오답

select ename, age, address
 from emp17
 where ename like '김%' or '이%'
 order by age desc;

정답

select ename, age, address
 from emp17
 where ename like '김%' or ename like '이%' // ename like 까지 잘 작성해야한다. 
 order by age desc;

여기서 and를 쓰면 안나온다! 왜냐하면 이름의 성씨가 동시에 이씨이고 김씨인 사람은 없으므로.

문제 63. 주소가 서울과 경기에서 거주하는 학생들의 이름, 나이, 주소 출력

select ename, age, address
 from emp17
 where address like '%서울%' 
    or address like '%경기%';

위 sql을 아래와 같이 쓸 수 있다. why? 그냥 나중에 복붙하기 편하려고!
and, or 많이쓰는 문장에서 자주 보인다. 1 = 1 은 별 의미없는 코드

select ename, age, address
 from emp17
 where 1 = 1
    or address like '%서울%' 
    or address like '%경기%';

문제 64. 우리반 학생들중에 naver 메일을 사용하고 나이가 30대인 학생들의 이름, 나이, 이메일 출력

나의 답

select ename, age, email
 from emp17
 where 1 = 1
  and age like '3%' 
  and email like '%naver%';

다른 사람들의 코드 (between.. and)사용하셨음!

SELECT ename, age, address
 FROM emp17
 WHERE email LIKE '%naver%'
 AND age BETWEEN 30 AND 39;

대소문자 변환 함수 배우기(UPPER, LOWER, INITCAP)

함수를 알면 조금 더 쉽게 SQL을 작성해서 데이터를 검색할 수 있다. 함수를 모르면 조금 힘들게 검색하거나, 검색을 못할 수도 있다! 잘 알기!!~~~

upper: 영문자를 대문자로 변환하는 함수
lower: 영문자를 소문자로 변환하는 함수
initcap: 첫번째 철자는 대문자, 나머지는 소문자로 변환하는 함수

  • 함수란(function)? 특정 역할을 하는 기능이 코딩되어있는 객체(object)

DATABASE 에서 함수?

  • 역할: 데이터 검색을 잘 하기 위해!!!!!!!!!!!
  • 종류
    (참고) 테이블(table)은 컬럼(column), 행(row)로 구성되어있다.
  1. 단일행 함수 (single row function)
    하나의 행(row)이 입력되어 --> 함수 --> 하나의 값을 출력
  2. 복수행 함수 (multiple row function)
    여러개의 행(row)이 입력되어 --> 함수 --> 하나의 값을 출력

1. 단일행 함수의 종류

문자, 숫자, 날짜, 변환, 일반

2. 복수행 함수의 종류

max(최대값), min(최소값), avg(평균값), sum(토탈값), count(갯수), 기타 통계관련 함수..

문제 65. 사원 이름을 출력하는데 대문자로 출력하고, 그 옆에 소문자로 출력하고 그옆에 첫번째는 대문자 나머지는 소문자로 출력

select upper(ename) , lower(ename), initcap(ename)
 from emp;

Oracle의 initcap 함수는 MySQL에서 지원하지 않아서, 여러 함수들을 조합해서 만들어주어야 한다.

문제 66. 서울에서 거주하지 않는 학생들의 이름, 나이, 주소를 출력 , 나이가 높은 학생부터!

select ename, age, address
 from emp17
 where address not like '%서울%'
 order by age desc;

문제 67. 통신사를 kt 사용하는 학생들의 이름, 통신사 출력!

MySQL은 대소문자 구분없이 나오지만, 오라클은 lower(telecom)을 해줘야한다.

select ename, telecom
 from emp17
 where lower(telecom) = 'kt'; // lower 하고 'kt'하던지
select ename, telecom
from emp17
where upper(telecom) = 'KT'; // upper 하고 'KT' 하던지!



첫번째는 mysql, 두번째는 오라클! 코드가 다릅니다.

  • 그런데! 이렇게 하는 것은 ㅇㅇㅇ 이라는 단어를 위해서 책을 첫장부터 끝까지 읽는것과 같다.(악성 SQL)
    차례를 보고서 바로 찾는것이 빠르기때문에 나중에 개발자가 이렇게 위 코드쩌럼 SQL을 짜면 튜닝해주는것이 좋다.

    explain plan for
    select *
    from emp17
    where upper(telecom) = 'KT';
    
    select * from table(dbms_xplan.display)


위 코드실행할 때 한번에 하지말고, explain쪽 먼저 하고 밑에 셀렉트문 실행하기.
오라클 명령어임!

문제 68. 통신사가 sk인 학생들의 이름, 통신사 출력

나의 답

select ename, telecom
 from emp17
 where lower(telecom) like '%sk%';

다른 답

select ename, telecom
 from emp17
 where lower(telecom) in ('sk', 'skt') and upper(telecom) in ('SK', 'SKT');
  • 데이터가 정확하게 검색되도록 쿼리를 작성하는것이 1순위이다.

문제 69. 우리반에서 통신사가 LG인 학생들 이름, 통신사 출력

select ename, telecom
 from emp17
 where lower(telecom) like '%lg%';
  • 와일드 카드를 양쪽에 두르는 것도 속도가 느려진다! 그치만 튜닝보다 일단은 데이터가 정확하게 검색되도록 하는것이 1순위.

문자에서 특정 철자 추출하기(SUBSTR)

문자열에서 특정 부분만 잘라내서 출력할 수 있다!

예제. 우리반 테이블에서 이름의 성씨만 출력하시오.

select substr (ename, 1, 1) // 1번째 부터 1개 짜르기. ename, 1, 2) 하면 1번째부터 2개 자르기. 
 from emp17;

문제 70. 우리반 테이블에서 이름의 끝 철자만 출력!

select substr (ename, 3, 1)
 from emp17;
  • 혹은 ! 성이 남궁 이어서 4자리 이름일수도있는데, 이런경우 끝자리 구할때는 음수로 쓰는게 좋
    다. 이름이 윤성해면 윤(1)성(2)해(3)
select substr (ename, -1, 1)
 from emp17;

문제 71. 이름을 윤*해 이렇게 가운데를 별로 출력

내 답 (오답)

select substr (ename, 1, 1) + '*' + substr(ename, -1, 1)
 from emp17;

정답

select substr (ename, 1, 1) || '*' || substr(ename, -1, 1)
 from emp17; // 연결연산자 사용 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  • 이름이 남궁길동 이면 ..??

insert into emp17(empno, ename, age)
values(9999, '남궁현민', 34);

commit;

select substr(ename,-4,1) || substr(ename,-3,1)|| '*' || substr(ename, -1,1) 
from emp17;

문제 72. 우리반 테이블에서 주소를 출력하는데, 앞에 3글자만 출력!

 select substr(address, 1,3)
  from emp17;

문제 73. 이름, 주소를 출력하는데 주소가 앞에 3글자만 출력하고, 출력되는 주소를 ascending하게 출력

select ename, substr(address, 1, 3) as 주소
 from emp17
 order by 주소 asc;

문자열의 길이를 출력하기(LENGTH)

문자열의 길이를 출력하는 함수!

예제. 이름과 이름의 철자의 길이를 출력하시오.

select ename, length(ename)
 from emp;

문제 74. 이름, 이메일, 이메일의 철자의 길이 출력

select ename, email, length(email) as maillength
 from emp17
 order by 3 desc;

문제 75. 위 결과 다시 출력하는데, 이메일의 철자의 길이가 8글자 이상인 학생들만 출력하세요.

select ename, email, length(email) as maillength
 from emp17
 where length(email) >= 8
 order by 3 desc;

문자에서 특정 철자의 위치 출력하기(INSTR)

문자열에서 특정 철자의 위치번호를 출력하는 함수
예제. 우리반 테이블에서 이메일을 출력하고, 이메일에서 @ 의 자리번호를 출력하세요.

select email ,instr(email,'@')
 from emp17;

문제 76. 우리반 테이블에서 이름에 '민' 자가 포함된 학생들의 이름을 출력하세요

select ename
 from emp17
 where ename like '%민%';
select ename, instr(ename, '민')
from emp17; // 이건 내가 쓴 오답
select ename
from emp17
where  instr(ename, '민') > 0;

특정 철자를 다른 철자로 변경하기(REPLACE)

문자열에서 특정 철자를 다른 철자로 변경하는 함수

예제. 이름과 월급을 출력하는데 월급을 출력할 때 숫자 0을 *로 출력!!

select ename, replace(sal, 0, '*')
 from emp;

문법: replace(컬럼, 변경 전 데이터, 변경 후 데이터)

  • 조금 더 업그레이드 해서 암호화를 하려면 !?
    정규 표현식을 사용해야 함! (뒤에서 다시배움)
    select ename, regexp_replace( sal, '[0-3]','*')
     from emp;

    설명: 월급을 출력할 때 숫자 0~3까지를 *로 변경해서 출력

문제 77. (substr문제) 이름, 나이를 출력하는데, 다음과 같이 출력하세요.
ex) 김정명 30대 / 김기찬 20대

내 답

select ename, substr(age,-3,1) || substr(age,-2,1) || 0 || '대' 
 from emp17;

다른 답

select ename, substr(age,-3,1) || substr(age,-2,1) || '0대' 
 from emp17;

문제 78. (복습문제) 90년도에 태어난 학생들의 이름, 나이, 생일을 출력하는데 생일을 ASCENDING 하게 출력

MySQL 은 년도가 1900/00/00 이런 형태라서 코드를 아래와 같이 해야하고

select ename , age, birth 
 from emp17
 where birth like '199%'
 order by birth asc;

오라클은 요로케.

select ename , age, birth 
 from emp17
 where birth like '9%/%%/%%'
 order by birth asc;

이름, 이메일을 출력하는데, 이메일에서 @ 앞에있는 글자의 길이가 8이상인 것들만 출력
1. 서브스트링으로 @ 앞 자르기

select ename, 
 substr(email, 1, instr(email,'@')-1) as "@앞 글자" ,
 substr(email, instr(email,'@')+1) as "@뒤 글자"
 -- length substr(email, 1, instr(email,'@')-1)
 from emp17
 where length (substr(email, 1, instr(email,'@')-1)) >= 10;

궁금한것.
1. instr 는 위치출력하기인데 숫자로 리턴되는게 아닌가요? where 절에서 쓰면 숫자로 리턴되는게 아닌가요?
2. @ 뒤글자 출력할 때 2번째 인자가 1이면..?
3. length 어떻게 구하징

특정 철자를 n개만큼 채워넣기! (LPAD, RPAD)

출력되는 숫자외에 다른 숫자를 집어넣지 못하도록 숫자를 출력할 때 *을 채워넣을 때 필요한 함수
LPAD(왼쪽으로 채워넣기), RPAD(오른쪽으로 채워넣기)

예제. 이름, 월급을 출력하는데 월급을 출력할 때 월급의 나머지 자리에 *를 채워넣으시오!

 select ename, lpad(sal, 10, '*') // 월급을, 10자리로, 나머지자리는 *
  from emp; 
  • 월급을 출력하는데 전체 자리를 10자리로 출력하고 나머지 빈 자리에 *을 채워넣어라.

특정 철자 잘라내기 (TRIM, RTRIM, LTRIM)

문자열에서 특정 철자를 잘라낼때 사용하는 함수. 주로 공백문자를 잘라낼 때 아주 많이 사용합니다!

문제 79. 이름이 JACK인 사원의 이름, 월급 출력

 select ename , sal
  from emp
  where  rtrim(ename) = 'JACK';
  • 얘도 악성 SQL.. 느려지지만 일단 데이터 뽑는것이 1순위.
  • 설명! RTRIM(ename)에서 오른쪽에 있는 공백을 잘라내겠다는 뜻.
    TRIM(ename)은 양쪽에 공백을 잘라내겠다는 뜻.
  • 개발자가 공백을 안들어가도록 하던지, 어쩔 수없다면 sql튜닝

문제 80. 우리반 테이블에서 이메일을 출력하는데, 이메일 끝에 .com을 잘라내서 출력

select rtrim(email, '.com' ) // 두번째를 비우고 그냥 이메일만 쓰면 공백을 잘라낸다는 뜻. 특정 문자는 이렇게 쓰면 됩니다!
 from emp17;

문제 81. (복습) 직업이 SALESMAN , ANALYST 가 아닌 사원들의 이름, 월급을 출력하는데 월급이 높은 사원부터 출력되게 하시오.

select ename, sal
 from emp
 where job not in ('SALESMAN', 'ANALYST')
 order by sal desc;

내부 실행순서는 프롬 -> 셀렉트 -> 웨어 -> 오더바이

문제 82. (복습) 우리반에서 통신사가 kt, lg인 학생들의 이름, 나이, 통신사를 출력하는데 나이가 높은 학생부터 출력하시오!

select ename, age, telecom
 from emp17
 where lower(telecom) like ('kt%') or lower(telecom) like ('lg%') 
 order by age desc;

  • 나는 여기서 연산자를 and 써서 안나왔다. 이거 약간 헷갈리는데. .. and 쓰면 한 사람이 kt,lg동시에 다 써야해서 안나오는 것 인듯.

문제 83. (복습)우리반 테이블에서 다음과 같이 결과 출력하세요
ex) 윤영민씨는 경기도에서 거주합니다. / 김정명씨는 서울시에서 거주합니다.

select ename || '씨는 ' ||substr(address,1,3) || '에서 거주합니다.'
 from emp17;

문제 83. (복습) 부서번호가 10번, 20번인 사원들의 이름, 입사일, 부서번호를 출력하는데 최근에 입사한 사원부터 출력하고 컬럼명을 한글로 이름, 입사일, 부서번호로 정해주어 출력하기.

select ename as 이름, hiredate as 입사일, deptno as 부서번호
 from emp
 where deptno in (10, 20)
 order by hiredate desc;

마지막 문제 !

오라클의 문자함수중에 initcap 함수가 mySQL 에 없어서 따로 여러 함수들을 가지고 구현해야 합니다.
오라클에서 먼저 inicap을 안쓰고 다른 함수로 뭄ㄴ자의 첫번째 철자는 대문자, 나머지는 소문자로 출력을 해야합니다.

문제 85. 아래의 SQL의 결과를 inicap쓰지 말고 수행하세요.(오라클에서)
hint! substr, upper, lower, || 를 이용해서 하기.

내 생각.
1. 이름에서 substr로 첫글짜만뽑고, upper로 대문자로 뽑아준다.
2. 이름에서 substr로 첫글짜 외 나머지를 뽑고, lower를 이용해 소문자를 뽑는다.
1, 2번을 연결연산자를 사용해서 이어준다.

  • 내 풀이
select upper(substr(ename,1,1)) || lower(substr(ename,2))
 from emp
 where ename not in ('A%%B', 'A%B');
  • 다른사람의 풀이
select upper(substr(ename,1,1)) || lower(substr(ename,2,length(ename)))
 from emp
 where ename not in ('A%%B', 'A%B');
select upper(substr(ename,1,1)) || lower(substr(ename,2,length(ename)-1)) // -1을 하면 총 길이에서 -1 하는것! 2번째부터 시작하니까 길이를 -1 해주신 것
 from emp
 where ename not in ('A%%B', 'A%B');

궁금한 것

  1. LPAD, RPAD할 때 누가 기준?
  2. instr은 위치를 출력하는건데 리턴값이 숫자가 아님?
    2-1. 아래 코드에서 왜 문자가 출력되는걸까? instr은 숫자로 리턴인데!?
 select ename
from emp17
where  instr(ename, '민') > 0;
  1. 이름, 이메일을 출력하는데, 이메일에서 @ 앞에있는 글자의 길이가 8이상인 것들만 출력
    서브스트링으로 @ 앞 자르기

    select ename, 
    substr(email, 1, instr(email,'@')-1) as "@앞 글자" ,
    substr(email, instr(email,'@')+1) as "@뒤 글자"
    -- length substr(email, 1, instr(email,'@')-1)
    from emp17
    where length (substr(email, 1, instr(email,'@')-1)) >= 10;

3번 풀이 궁금한것.
1. instr 는 위치출력하기인데 숫자로 리턴되는게 아닌가요? where 절에서 쓰면 숫자로 리턴되는게 아닌가요?
2. @ 뒤글자 출력할 때 2번째 인자가 1이면..?
3. length 어떻게 구하징

해결 한 것

1.LPAD, RPAD할 때 누가 기준? -> 컬럼명 기준
: RTRIM, LTRIM 은 그냥 내가 보는 ? 보이는 것 기준!
2. instr은 위치를 출력하는건데 리턴값이 숫자가 아님? -> 숫자가 맞음 ! '@' 출력도 @가 있는 위치를 숫자로 리턴해주고 있는거임
2-1. 아래 코드에서 왜 문자가 출력되는걸까? instr은 숫자로 리턴인데!?

 select ename
from emp17
where  instr(ename, '민') > 0;

: 위는 where절에 써서 select절에있는 이름을 출력하는거임. 숫자로 출력하고 싶으면
select절에 써주면 됨!!


3번 풀이 해결
2. @ 뒤글자 출력할 때 2번째 인자가 1이면..? -> 기준이 바뀐다.

이렇게 email컬럼 안에, 1번째 부터, @뒤+1 까지 나온다. 여기서 instr(email,'@')+2 하면 @xx 이렇게 두자리 출력됨.

이렇게 substr(email, instr(email,'@')+1) as "@뒤 글자" 라고 써야 @다음 한자리부터 끝까지 출력이 된다.
3. length 어떻게 구하징 -> 괄호 해주니 해결되었다.

 select ename as 이메일, 
 substr(email, 1, instr(email,'@')-1) as "@앞 글자" ,
 substr(email, instr(email,'@')+1) as "@뒤 글자",
 length (substr(email, 1, instr(email,'@')-1)) as "@앞 글자 길이"
 from emp17
 where length (substr(email, 1, instr(email,'@')-1)) >= 10;

스스로 시도해본 것

  • naver 메일을 쓰는 학생들을 출력해보았다.

Oracle

 SELECT ename as 이름, // 이름 출력할거고 별칭은 이름
    substr(email, 1, instr(email,'@')-1) as "@앞 글자" , //email에서 1번째 글짜부터 @가 있는 위치의 -1 (1개 전)까지 추출
    rtrim (substr(email, instr(email,'@')+1),'.com') as "@뒤 글자", // 오른쪽 자를건데 (@위치+1부터, '.com'전까지) => naver / gmail출력됨.
    substr(email, instr(email,'.com')) as ".com" , // email에서 , '.com'있는 위치부터 끝까지 추출! => .com만 나오겠지
    length (substr(email, 1, instr(email,'@')-1)) as "@앞 글자 길이"
 FROM emp17
    -- where length (substr(email, 1, instr(email,'@')-1)) >= 10;
 WHERE lower(rtrim(substr(email, instr(email,'@')+1),'.com')) like 'n%' // @뒤 글자 에서 n으로 시작하는 어쩌구 출력하는데, 대소문자 구분없이 출력하고 싶어서 lower 썼음.
 ORDER BY 5 asc; // 숫자 낮은 순으로 정렬

근데 위에꺼 MySQL에서 돌리면 안나옴! 바꿔줘야 한다.
substr, rtrim 이 쓰임새가 달라서 이고,
MySQL에서는 SUBSTRING_INDEX 함수를 사용하여 문자열을 자를 수 있으며, REPLACE 함수를 사용하여 문자열에서 특정 문자를 치환할 수 있다.

MySQL

SELECT
    ename AS 이름,
    SUBSTRING_INDEX(email, '@', 1) AS "@앞 글자",
    REPLACE(SUBSTRING_INDEX(email, '@', -1), '.com', '') AS "@뒤 글자",
    SUBSTRING_INDEX(email, '.com', -1) AS ".com",
    LENGTH(SUBSTRING_INDEX(email, '@', 1)) AS "@앞 글자 길이"
FROM
    emp17
-- WHERE LENGTH(SUBSTRING_INDEX(email, '@', 1)) >= 10;
WHERE LOWER(REPLACE(SUBSTRING_INDEX(email, '@', -1), '.com', '')) LIKE 'n%'
ORDER BY 5 ASC;
profile
열씨미하자

0개의 댓글