๋ฐฐ์ด ๋ด์ฉ
1. ์์ธ ์ฒ๋ฆฌ
- ์๋ฐ์์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ ๋, try ์ catch๋ฅผ ์ฌ์ฉํ๋ค.
- ๋จผ์ try ๋ธ๋ก ์์๋ ์์ธ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ์๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
- catch์๋ ๋ธ๋ก์์๋ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์คํํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
- ์ฌ๊ธฐ์ finally์ด๋ผ๋ ํค์๋๊ฐ ์๋๋ฐ, ์ด ๊ฒ์ ์์ธ ๋ฐ์ ์ฌ๋ถ์ ์๊ด์์ด ์คํํด์ผ ํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ณณ์ด๋ค.
public class TryCatchExample {
public static void main(String[] args) {
try {
// try ๋ธ๋ก์๋ ์์ธ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ์๋ ์ฝ๋๋ฅผ ๋ฐฐ์นํฉ๋๋ค.
} catch (Exception e) {
// catch ๋ธ๋ก์๋ try์์ ์ค์ ์์ธ๊ฐ ๋ฐ์ํ์ ์
// ์คํํ ๋ด์ฉ์ ์์ฑํฉ๋๋ค.
e.printStackTrace(); // ์์ธ ์์ธ์ ์๊ณ ์ถ๋ค๊ณ ํ ๋ (๊ฐ๋ฐ์๊ฐ ์ด๋๊ฐ ์์ธ์ธ์ง ์๊ณ ์ถ์๋)
} finally {
// ์์ธ ์ฒ๋ฆฌ์ ์๊ด์์ด ์ถ๋ ฅํ ์ฝ๋
}
}
}
- ํ๋์ try ๋ธ๋ก ์์ ์ฝ๋๋ ๋ค์ํ ์์ธ๊ฐ ๋ฐ์ํ ์ ์๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์ธ ์ข ๋ฅ๋ง๋ค ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ์ถ๋ค๋ฉด, ๋ค์ค catch ๋ฌธ์ ์์ฑํ์ฌ ์ฒ๋ฆฌํด์ฃผ๋ฉด ๋๋ค.
public class TryCatchExample2 {
public static void main(String[] args) {
int[] arr = new int[5];
try {
System.out.println("์ ์: ");
int num = sc.nextInt();
int result = 100 / num;
System.out.println(arr[result]);
String s = null;
s.equals("๋ฉ๋กฑ");
/*
- ๋ค์ค catch๋ฌธ์ ์ค์ ๋ก ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด
์์์๋ถํฐ ์์๋๋ก catch๋ฌธ์ ๊ฒ์ํ๋ฉด์ ๋ด๋ ค์ค๊ธฐ ๋๋ฌธ์
๋ถ๋ชจ ํ์
์ ์์ธ๋ฅผ ์์ ํ์
์ ์์ธ๋ณด๋ค ์์ ์์ฑํ์๋ฉด ์๋ฉ๋๋ค.
- catch ์์ ๊ดํธ์ ์์ธ ํ์
์ ์ฌ๋ฌ ๊ฐ ์์ฑํ๊ณ ์ถ์ ๊ฒฝ์ฐ๋
| ๊ธฐํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ์
์ ๋์ดํด ์ฃผ์๋ฉด, ํ๋์ catch ๋ธ๋ก์ผ๋ก
์ฌ๋ฌ ํ์
์ ์์ธ๋ฅผ ๋์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
(java 7๋ฒ์ ๋ถํฐ ๊ฐ๋ฅํ ๋ฌธ๋ฒ)
*/
} catch (InputMismatchException | ArithmeticException e) {
System.out.println("์๋ชป๋ ์
๋ ฅ๊ฐ์
๋๋ค.");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("์ธ๋ฑ์ค ๋ฒ์๋ฅผ ๋ฒ์ด๋ฌ์ด์.");
} catch (NullPointerException e) {
System.out.println("์ฃผ์๊ฐ null ์
๋๋ค!");
} catch (Exception e) {
System.out.println("์ ์ ์๋ ์์ธ ๋ฐ์!");
} finally {
System.out.println("์์ธ ๋ฐ์ ์ฌ๋ถ์ ์๊ด ์์ด ํญ์ ์คํ๋๋ ๋ฌธ์ฅ!");
}
}
}
- ๋ง์ฝ ๋ฉ์๋ ๋๋ ์์ฑ์๋ฅผ ํธ์ถํ ๊ณณ์ผ๋ก ์์ธ๋ฅผ ๋ ๋๊ธฐ๊ณ ์ถ์ผ๋ฉด throws๋ฅผ ์ฌ์ฉํ๋ค.
- ๊ทธ๋ ๊ฒ ๋๋ฉด ํธ์ถ์๋ ๊ผญ try/catch๋ฅผ ์ฌ์ฉํ์ฌ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค.
- throws๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ์ ์ฅ์์ ๋งค๊ฐ๊ฐ์ด ์๋ชป๋ ๊ฒฝ์ฐ, ์์ธ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค๋ ์ผ์ข ์ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์์.
- ๋ฉ์๋๋ง๋ค ์ผ์ผํ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ๋ ๊ฒ ๋ณด๋จ, ํธ์ถ ํ์๊ฐ ๋ง์ ๊ณณ์์ ํ๋ฒ์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ๋ ๊ฒ์ด ์ฝ๋์ ๊ฐ๋ ์ฑ ๋ฐ ์์ฑํ๊ธฐ์ ์ข์.
public class ThrowsExample {
static String[] greeting = {"์๋
", "hello", "๋ํ์ค"};
/*
# throws
- throws๋ ์์ธ์ ์์ธ์ด ๋ฉ์๋ ์ ์ธ๋ถ๊ฐ ์๋ ํธ์ถ๋ถ์ ์์ ๊ฒฝ์ฐ
์์ธ ์ฒ๋ฆฌ๋ฅผ ๋ฉ์๋์ ํธ์ถ๋ถ๋ก ๋ ๋๊ธฐ๋ ๋ฐฉ์์
๋๋ค.
- throws๋ ์์ฑ์์์๋ ์ ์ธ์ด ๊ฐ๋ฅํ๋ฉฐ, ๋ฉ์๋๋ ์์ฑ์๋ฅผ ํธ์ถ ์
์์ธ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํฉ๋๋ค.
- ๋ํ, ์ํ๋ ์์ญ์ผ๋ก ์์ธ๋ฅผ ๋ชจ์์ ํ๋ฒ์ ์ฒ๋ฆฌํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
*/
static void greet(int idx) throws Exception {
System.out.println(greeting[idx]);
}
public static void main(String[] args) {
try {
greet(3);
} catch (Exception e) {
System.out.println("๋ฉ์๋์ ๋งค๊ฐ๊ฐ์ด ์๋ชป๋์์ด์!");
}
}
}
- ๋ฌผ๋ก main์๋ throws๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ํ์ง๋ง ์ด ๊ฒ์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ํ๊ฒ ๋ค๋ ๊ฒ๊ณผ ๋์ผํ๊ธฐ ๋๋ฌธ์, ์์ธ ์ผ์ด์ค๊ฐ ์๋ ์ด์, ์๋ถ์ด๋๊ฒ ์ข๋ค.
- ์์ธ ์ฒ๋ฆฌ ๋ฟ๋ง ์๋๋ผ, ์์ธ ๊ฐ์ฒด๋ฅผ ์ผ๋ถ๋ฌ ์์ฑํ์ฌ ์์ธ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค.
public static int calcTotal(int n) {
int sum = 0;
for(int i=1; i<=n; i++) {
sum += i;
}
return sum;
}
public static void main(String[] args) {
int result1 = calcTotal(100);
int result2 = calcTotal(-120);
}
- ๋ง์ฝ ์์๋ฅผ ์ค๋ค๋ฉด, ์์ธ๊ฐ ๋ฐ์ํ์ง ์๊ณ ๋ฆฌํด๊ฐ์ ๋ฐ๊ฒ๋๋ค. ํ์ง๋ง ์ฌ์ฉ์๋ 0 ๋๋ 0๋ณด๋ค ์์ ๊ฐ์ ๋ณด๋ธ๋ค๋ฉด ๊ฐ์ ๋ก ์ข ๋ฃํ๊ณ ์ถ๋ค. ๊ทธ๋ฌ๋ ๋ฆฌํด๊ฐ์ด int์ด๊ธฐ ๋๋ฌธ์ return ๋ฉ์๋๋ก๋ ๊ฐ์ ์ข ๋ฃ๋ฅผ ํ ์ ์๋ค. ์ด ๊ฒ์ ํด๊ฒฐํ๊ธฐ ์ํด ์์ธ ์ฒ๋ฆฌ๋ฅผ ๋ง๋ค์ด ์ค์ผ ํ๋ค.
public static int calcTotal(int n) throws Exception {
if(n <= 0) {
throw new Exception(); //์ด ์์ ์์ ๊ฐ์ ๋ก ์์ธ๋ฅผ ๋ฐ์์ํด!
}
int sum = 0;
for(int i=1; i<=n; i++) {
sum += i;
}
return sum;
}
public static void main(String[] args) {
try {
int result1 = calcTotal(100);
int result2 = calcTotal(-120);
} catch (Exception e) {
System.out.println("๋งค๊ฐ๊ฐ์ ๋ฐ๋์ ์์๋ก ์ฃผ์
์ผ ํฉ๋๋ค!");
}
}
- ๊ฐ๋ฐ์๊ฐ ๋ง๋ ์ดํ๋ฆฌ์ผ์ด์ ์์ ์์ฒด์ ์ผ๋ก ์๊ธธ ์ ์๋ ์์ธ๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ์์ธ ํด๋์ค๋ฅผ ์ ์ํด์ ๋ง๋ค ์ ์๋ค.
- ์ฌ์ฉ์ ์ ์ ์์ ํด๋์ค๋ Exception ํด๋์ค๋ฅผ ์์ํ์ฌ ์ ์.
- ์ด๋ฆ์ Exception์ผ๋ก ๋๋๊ฒ ์ง์ด์ฃผ๋ฉด ๋จ.
public class MyException extends Exception {
public MyException() {}
public MyException(String message) {
super(message);
}
...
}
2. ์๋ฐ ํ์ค API
import java.util.Objects;
// clone ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ๋ค๋ฉด Cloneable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.
public class Person implements Cloneable{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
// toString(): ๊ฐ์ฒด์ ์ ๋ณด(ํ๋)๋ฅผ ๋ฌธ์์ด ํํ๋ก ๋ฆฌํด.
// Object๊ฐ ๋ค๋ ค์ฃผ๋ toString์ ํจํค์ง + ํด๋์ค ์ด๋ฆ + ์ฃผ์๊ฐ -> ์ธ ์ผ์ด ์ ์๋ค.
// ๋๋ถ๋ถ ์ค๋ฒ๋ผ์ด๋ฉ ํด์ ์ฌ์ฉํ๋ ํธ.
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
// ๊ฐ์ ๊ฐ์ฒด์ ์์ฑ์ ๋น๊ตํด์ ๋๋ฑ ๊ฐ์ฒด์ธ์ง๋ฅผ ๋
ผ๋ฆฌ๊ฐ์ผ๋ก ๋ฆฌํดํ๋ ๋ฉ์๋
@Override
public boolean equals(Object obj) {
if (this == obj) return true; // ์ฃผ์๊ฐ์ด ๊ฐ๋ค๋ฉด ๊ฐ์ ๊ฐ์ฒด์
if (obj instanceof Person) {
Person p = (Person) obj;
if (p.age == this.age && this.name.equals(p.name)); return true;
}
return false; // Person ํ์
์ ๊ฐ์ง ์ ์๋ค๋ฉด ๋๋ฑ ๋น๊ต ์๋ฏธ๊ฐ ์์.
}
//equals๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ ๋๋ hashCode๋ ํจ๊ป ์ค๋ฒ๋ผ์ด๋ฉ์ ์งํํด ์ฃผ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
//equals๋ฅผ ์ฌ ์ ์ํ๋ค๋ ๊ฒ์ ๋ด๊ฐ ์ํ๋ ๋ฐฉ์์ ๋๋ฑ ๋น๊ต๋ฅผ ํ๊ฒ ๋ค๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
//hashcode์ ๊ฐ๋ ๊ทธ์ ๋ง๊ฒ ๊ฐ์ด ์ฌ ์ ์๊ฐ ๋์ด์ผ ํฉ๋๋ค. (hash ์ฃผ์๋ฅผ equals์ ๋ง๊ฒ ์ ์)
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
protected void finalize() throws Throwable {
// ์์ฑ๋ ๊ฐ์ฒด๊ฐ ์๋ช
๋ ๋ ์๋์ผ๋ก ํธ์ถ๋๋ ๋ฉ์๋ (gc๊ฐ ์คํ๋ ๋)
// garbage collector ํธ์ถ๋๋ ์์๋ฅผ ๋ณด์ฅํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ ๊ถ์ฅํ์ง ์์.
super.finalize();
}
@Override
protected Object clone() throws CloneNotSupportedException {
// ๊ฐ์ฒด ๋ณต์ฌ ๋ฉ์๋
return super.clone();
}
}
public class Main {
public static void main(String[] args) {
Person kim = new Person("๊น์ถ์", 30);
Person hong = new Person("๊น์ถ์", 30);
// ๊ฐ์ฒดํ์
์ ๋ณ์๋ฅผ ์ถ๋ ฅํ๊ฑฐ๋ ๊ฐ์ ์ป์ ๋๋
// ๋ค์ ์๋์ผ๋ก .toString()์ด ๋ถ์ด์ ์งํ๋ฉ๋๋ค. (Object ๋ฌผ๋ ค์ฃผ๋ ๋ฉ์๋)
System.out.println(kim);
System.out.println(hong);
System.out.println(kim.equals(hong));
// equals์์ ๋๋ฑํ ๊ฐ์ฒด๋ผ๊ณ ํ๋ช
์ด ๋์๋ค๋ฉด, ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋๋ผ๋
// ๊ฐ์ฒด์ ๊ณ ์ ํ ์ฃผ์๋ฅผ ๋์ผํ๊ฒ ์ฒ๋ฆฌํด์ ์๋ก ๊ฐ์ ๊ฐ์ฒด์์ ๋ช
ํํ ํด์ผ ํฉ๋๋ค.
// ๊ทธ๋์ผ, ์๋ฐ์์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ ํด๋์ค ์ค์ hash๋ฅผ ๋น๊ตํด์ ๋๋ฑ ๊ฐ์ฒด์ธ์ง ์๋์ง๋ฅผ
// ํ๋ณํ๋ ์๋ฃ๊ตฌ์กฐ(HashSet, HashMap)๋ค์ด ์ ์์ ์ผ๋ก ๋์ํ ์ ์์ต๋๋ค.
System.out.println(kim.hashCode());
System.out.println(hong.hashCode());
Person park = new Person("๋ฐ์ํฌ", 100);
try {
Person clonePerson = (Person) park.clone();
System.out.println("๋ณต์ฌ๋ ๊ฐ์ฒด ์ ๋ณด: " + clonePerson);
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
}
- Object ํด๋์ค๋ ์๋ฐ์ ์ต์์ ํด๋์ค. ์ฆ, ์๋ฐ์ ๋ชจ๋ ํด๋์ค๋ Object ๋ฉ์๋๋ฅผ ์์๋ฐ๊ณ ์๋ค๋ ๋ป.
- equals(Object obj) : ๋ ๊ฐ์ฒด๊ฐ ๊ฐ์์ง ๋น๊ตํจ.
- hashcode() : ๊ฐ์ฒด์ ํด์ ์ฃผ์๊ฐ์ ๋ฐํ.
- toString() : ๊ฐ์ฒด๋ฅผ ๋ฌธ์์ด๋ก ๋ฐํํ์ฌ ๋ฐํํ๋ค. ๊ธฐ๋ณธ์ ๋จ์ ํจํค์ง ๊ฒฝ๋ก ๋ฐ ํด๋์ค ์ด๋ฆ, 16์ง์์ ์ฃผ์๊ฐ์ด ๋ํ๋จ.
- clone() : ๊ฐ์ฒด๋ฅผ ๋ณต์ ํ์ฌ ๋ฐํ.
- getClass() : ๊ฐ์ฒด์ ํด๋์ค๋ฅผ ๋ฐํ.
package etc.api.lang.system;
public class SystemTime {
public static void main(String[] args) {
// 1970๋
1์ 1์ผ ์์ ์ ๊ธฐ์ค์ผ๋ก ํ์ฌ๊น์ง ์์๋ ์๊ฐ์ ๋ฐ๋ฆฌ์ด๋ก ๋ฆฌํด (long)
long start = System.currentTimeMillis();
int total = 0;
for (int i = 0; i < 2000000000; i++) {
total += i;
}
long end = System.currentTimeMillis();
System.out.println("์คํ ์์์๊ฐ: " + (end - start) * 0.001 + "์ด");
System.out.println(System.getProperties());
}
}
- exit() : ํ์ฌ ์คํํ๊ณ ์๋ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ์ข ๋ฃ. ์ ์ ์ข ๋ฃ์ผ ๊ฒฝ์ฐ ๋งค๊ฐ๊ฐ์ผ๋ก 0, ๋น์ ์ ์ข ๋ฃ๋ 0์ธ์ ๋ค๋ฅธ ๊ฐ์ ์ค๋ค.
- currentTimeMillis() / nanoTime() : 1970๋ 1์ 1์ผ ์์ ์ ๊ธฐ์ค์ผ๋ก ํ์ฌ๊น์ง ํ๋ฅธ ์ ๋์ค ์๊ฐ์ ๋ฐ๋ฆฌ์ธ์ปจ๋ ๋๋ ๋๋ ธ์ธ์ปจ๋ ๋จ์์ long๊ฐ์ผ๋ก ๋ฆฌํด. ์ฃผ๋ก ํ๋ก๊ทธ๋จ์ ์คํ ์์ ์๊ฐ ์ธก์ ์ผ๋ก ์ฌ์ฉ๋๋ค.
import java.util.Arrays;
public class StringMethod {
public static void main(String[] args) {
String str = "Hello Java";
// charAt(index): ๋ฌธ์์ด ์ธ๋ฑ์ค์ ๋ฐ๋ฅธ ๋จ์ผ ๋ฌธ์๋ฅผ ๋ฐํ.
char c = str.charAt(4);
System.out.println("4๋ฒ ์ธ๋ฑ์ค = " + c);
// subString(begin, end): ๋ฌธ์์ด์ ๋ฒ์๋ฅผ ์ง์ ํด์ ๋ถ๋ถ ์ถ์ถ.
String ss1 = str.substring(1, 5); // 1๋ฒ ์ด์ 5๋ฒ ๋ฏธ๋ง.
System.out.println("ss1 = " + ss1);
String ss2 = str.substring(6); // 6๋ฒ๋ถํฐ ๋๊น์ง ์ถ์ถ.
System.out.println("ss2 = " + ss2);
// length(): ๋ฌธ์์ด์ ์ด ๊ธธ์ด ๋ฐํ.
int len = str.length();
System.out.println("len = " + len);
// indexOf(str): ํด๋น ๋ฌธ์๊ฐ ์๋ ์ธ๋ฑ์ค๋ฅผ ๋ฐํ
// ํด๋น ๋ฌธ์๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด -1์ ๋ฆฌํด.
int idx1 = str.indexOf("l"); // ์์์๋ถํฐ ํ์
System.out.println("idx1 = " + idx1);
int idx2 = str.lastIndexOf("l"); // ๋ค์์๋ถํฐ ํ์
System.out.println("idx2 = " + idx2);
// ์ฌ๋ฌ ๋ฌธ์๋ฅผ ์ ๋ฌํ๋ฉด ์์ ์ธ๋ฑ์ค๋ฅผ ์๋ ค์ค๋๋ค.
int idx3 = str.indexOf("Java");
System.out.println("idx3 = " + idx3);
String str2 = "HeLLo WoRLd";
String lower = str2.toLowerCase(); // ์ผ๊ด ์๋ฌธ์ ๋ณ๊ฒฝ
System.out.println("lower = " + lower);
String upper = str2.toUpperCase(); // ์ผ๊ด ๋๋ฌธ์ ๋ณ๊ฒฝ
System.out.println("upper = " + upper);
// trim(): ๋ฌธ์์ด์ ์, ๋ค ๊ณต๋ฐฑ์ ์ ๊ฑฐ.
String name = " ํ๊ธธ๋ ";
System.out.println(name.trim() + "๋ ์๋
ํ์ธ์~!");
// replace(old, new): ๊ธฐ์กด ๋ฌธ์์ด ๋ด๋ถ์ old๊ฐ์ ๋ชจ๋ ์ฐพ์์ new ๋ฌธ์์ด๋ก ์ผ๊ด ๋ณ๊ฒฝ
String java = "์๋ฐ๋ ์ฌ๋ฐ์ต๋๋ค. ์๋ฐ ์ปคํผ๋ ๋ง์์ต๋๋ค.";
System.out.println(java.replace("์๋ฐ", "java"));
System.out.println(java.replace("์ต๋", ""));
// split(๊ตฌ๋ถ์): ๋ฌธ์์ด์ ๊ตฌ๋ถ์๋ก ๊ตฌ๋ถํ์ฌ ๋ถํ .
// ๋ถํ ๋ ๋ฌธ์๋ค์ String ๋ฐฐ์ด์ ๋ด๊ฒจ์ ๋ฆฌํด.
String phone = "010-1234-5678";
String[] numbers = phone.split("-");
System.out.println(Arrays.toString(numbers));
String pet = "๋ฉ๋ฉ์ด, ์ผ์น์ด, ์งน์งน์ด";
String[] pets = pet.split(", ");
System.out.println(Arrays.toString(pets));
System.out.println("------------------------------------------------");
// ๋ฌธ์์ด์ ์ ์/์ค์ ๋ณํ
// ์์ํ ์ ์ or ์ค์๊ฐ ์๋๋ผ๋ฉด ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
String s1 = "100";
int s1num = Integer.parseInt(s1);
String s2 = "3.14";
double s2num = Double.parseDouble(s2);
System.out.println(s1num + s2num);
// ๊ธฐ๋ณธ ํ์
์ ๋ฌธ์์ด๋ก ๋ณ๊ฒฝ
String s3 = String.valueOf(s1num);
System.out.println("s3 = " + s3);
}
}
public class StrBuliderExample {
public static void main(String[] args) {
String str = "Hello";
System.out.println(str.hashCode());
str = "Hello world!";
System.out.println(str.hashCode());
str = "hello~";
System.out.println(str.hashCode());
System.out.println("=============================");
StringBuilder sb = new StringBuilder("hello");
System.out.println(sb);
System.out.println("sb์ ์ฃผ์๊ฐ = " + sb.hashCode());
// ๋ฌธ์์์ ๋งจ ๋์ ์ถ๊ฐํ๋ ๋ฉ์๋ : append (๋ฌธ์์ด)
sb.append(" world");
System.out.println(sb);
System.out.println("sb์ ์ฃผ์๊ฐ = " + sb.hashCode());
// ๋ฌธ์์ด์ ํน์ ์ธ๋ฑ์ค์ ์ฝ์
ํ๋ ๋ฉ์๋: insert(์ธ๋ฑ์ค, ๋ฌธ์์ด)
sb.insert(6, "my");
System.out.println(sb);
System.out.println("sb์ ์ฃผ์๊ฐ = " + sb.hashCode());
// ํน์ ์ธ๋ฑ์ค ๋ฒ์์ ๋ฌธ์์ด์ ๊ต์ฒดํ๋ ๋ฉ์๋: replace(begin, end, ๋ฌธ์์ด)
sb.replace(6, 8, "your");
System.out.println(sb);
System.out.println("sb์ ์ฃผ์๊ฐ = " + sb.hashCode());
// ๋ฌธ์์ด ๋ด์ ํน์ ๋จ์ด๋ฅผ ์ญ์ ํ๋ ๋ฉ์๋ delete(begin, end)
sb.delete(6, 11);
System.out.println(sb);
System.out.println("sb์ ์ฃผ์๊ฐ = " + sb.hashCode());
// ๋ฌธ์์ด์ ์ญ์์ผ๋ก ๋ฐฐ์น
sb.reverse();
System.out.println(sb);
}
}
- String ํด๋์ค๋ ์์ฃผ ๋ง์ด ์ฌ์ฉํ์ง๋ง, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณผ์๋น ํ๋ค๋ ๋จ์ ์ด ์กด์ฌ.
- ์ด๋ฅผ ๋ณด์ํ๋ StringBuilder๊ฐ ๋ฑ์ฅํ๊ฒ ๋จ.
- StringBuilder ๊ฐ์ฒด๋ ๋ฉ์๋๋ฅผ ํตํด ๋ฌธ์์ด์ ๋ณํ๋ฅผ ์ผ๋ง๋ ์ง ์ฃผ๋๋ผ๋, ๊ฐ์ฒด๊ฐ ๋ค์ ์์ฑ๋์ง ์๊ณ ๊ธฐ์กด ๊ฐ์ฒด๊ฐ ์ ์ง๋๊ธฐ ๋๋ฌธ์ ์๋ ์ธก๋ฉด์์ String๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๋ค.
- Math ํด๋์ค
- abs() : ์ ๋๊ฐ์ ๊ตฌํจ.
- ceil() : ์ฌ๋ฆผ๊ฐ์ ๊ตฌํจ.
- floor() : ๋ด๋ฆผ๊ฐ์ ๊ตฌํจ.
- max() : ์๋ฅผ ๋น๊ตํ์ฌ ์ต๋๊ฐ์ ๊ตฌํจ.
- min() : ์๋ฅผ ๋น๊ตํ์ฌ ์ต์๊ฐ์ ๊ตฌํจ.
- random() : ๋๋ค๊ฐ์ ๊ตฌํจ(0.0 <= ๊ฐ < 1.0)
- round() : ๋ฐ์ฌ๋ฆผ๊ฐ์ ๊ตฌํจ.
public class WrapperExample {
public static void main(String[] args) {
int a = 100;
boolean b = false;
char c = 'A';
double d = 3.14;
// boxing: ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์
์ ๊ฐ์ฒด ํ์
์ผ๋ก ๋ณํ
Integer a2 = Integer.valueOf(a);
Boolean b2 = Boolean.valueOf(b);
Character c2 = Character.valueOf(c);
Double d2 = Double.valueOf(d);
// autoboxing: ๊ธฐ๋ณธ ํ์
์ ์๋์ผ๋ก ๊ฐ์ฒดํ์ผ๋ก ๋ณํ
Integer a1 = a;
Boolean b1 = b;
Character c1 = c;
Double d1 = d;
// unboxing: ๊ฐ์ฒด ํ์
์ผ๋ก ํฌ์ฅ๋ ๊ฐ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์
์ผ๋ก ํ์ด๋ด๋ ๊ณผ์ .
int i = a1;
boolean i1 = b1;
char i2 = c1;
double i3 = d1;
}
}
- ์๋ฐ์ ์๋ฃํ์ ํฌ๊ฒ ๊ธฐ๋ณธํ / ์ฐธ์กฐํ์ผ๋ก ๋๋์ด์ง๋ค.
- ํ๋ก๊ทธ๋๋ฐ์ ํ๋ค ๋ณด๋ฉด, ๊ธฐ๋ณธํ์ ๊ฐ์ฒด๋ก ํํํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๋๋ฐ, ์ด ๋ ๋ํผ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;
public class DateExample {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date);
System.out.println("=========================");
LocalDate now = LocalDate.now();
System.out.println(now);
LocalTime lt = LocalTime.now();
System.out.println(lt);
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
LocalDateTime localDateTime = LocalDateTime.of(2022, 7, 1, 9, 0, 0);
System.out.println("localDateTime = " + localDateTime);
int year = localDateTime.getYear();
System.out.println("year = " + year);
// ๋ฌธ์ ํํ์ ์ ๋ฆฌํด (Month๋ผ๋ ์ด๊ฑฐํ ํ์
์ด ๋ฆฌํด)
Month month = localDateTime.getMonth();
System.out.println("month = " + month);
int monthValue = localDateTime.getMonthValue();
System.out.println("monthValue = " + monthValue);
int day = localDateTime.getDayOfMonth();
System.out.println("day = " + day);
DayOfWeek week = localDateTime.getDayOfWeek();
System.out.println("week = " + week);
int dayOfYear = localDateTime.getDayOfYear();
System.out.println("dayOfYear = " + dayOfYear);
LocalDateTime d3 = localDateTime.plusDays(3);
System.out.println("d3 = " + d3);
LocalDateTime localDateTime1 = localDateTime.plusYears(1).plusMonths(2).plusDays(7);
System.out.println("localDateTime1 = " + localDateTime1);
LocalDateTime localDateTime2 = localDateTime.minusMonths(9).minusDays(23);
System.out.println("localDateTime2 = " + localDateTime2);
LocalDate start = LocalDate.of(2020, 12, 30);
LocalDate end = LocalDate.of(2022, 9, 14);
long between1 = ChronoUnit.DAYS.between(start, end);
System.out.println("between1 = " + between1);
long between2 = ChronoUnit.WEEKS.between(start, end);
System.out.println("between2 = " + between2);
System.out.println("===============================================");
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy๋
MM์ dd์ผ E์์ผ a hh์ mm๋ถ ss์ด");
// ์ค๋นํ DateTimeFormatter ๊ฐ์ฒด๋ฅผ format()์ ๋งค๊ฐ๊ฐ์ผ๋ก ์ ๋ฌ.
String format = localDateTime.format(pattern);
System.out.println("format = " + format);
}
}
3. SQL - 1(์ฝ๋ ์์ ๋ฐ๋ก ์ ๋ฆฌ)
- ๋ฐ์ดํฐ๋ฒ ์ด์ค : ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ค์ ์ฒด๊ณ์ ์ผ๋ก ์ ์ฅํ๊ณ ๊ด๋ฆฌํ ์ ์๋๋ก ๊ตฌ์ฑ๋ ๋ฐ์ดํฐ์ ์งํฉ.
- DBMS : ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ํํธ์จ์ด ์์คํ . ์ด ๊ฒ์ ์ฌ์ฉ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ์ธํฐํ์ด์ค ์ญํ ์ ํ๋ฉฐ, ๋ฐ์ดํฐ์ ์ ์ฅ / ๊ฒ์ / ์์ / ์ญ์ ๋ฑ์ ์ํ.
- SQL : ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ ์์ ๋ฐ์ดํฐ ์กฐ์, ์ ์, ์ ์ดํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํ์คํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด.
- DDL : ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ์์ฑ, ๋ณ๊ฒฝ, ์ญ์ ํ๊ธฐ ์ํ ๋ช ๋ น์ด
- DML : ๋ฐ์ดํฐ๋ฅผ ๊ฒ์, ์ฝ์ , ์์ , ์ญ์ ํ๊ธฐ ์ํ ๋ช ๋ น์ด
- DCL : ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ์์ ๊ถํ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ช ๋ น์ด
- TCL : ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ช ๋ น์ด
-- ์ค๋ผํด์ ์ฃผ์์
๋๋ค.
/*
์ฌ๋ฌ ์ค ์ฃผ์์
๋๋ค.
!!
*/
-- SELECT [์ปฌ๋ผ๋ช
(์ฌ๋ฌ ๊ฐ ๊ฐ๋ฅ)] FROM [ํ
์ด๋ธ ์ด๋ฆ]
SELECT * FROM employees;
SELECT employee_id, first_name, last_name FROM employees;
-- ์ปฌ๋ผ์ ์กฐํํ๋ ์์น์์ ์ฐ์ ์ฐ์ฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
SELECT
employee_id,
first_name,
last_name,
salary,
salary + salary * 0.1 AS ์ฑ๊ณผํฌํจ๊ธ์ฌ
FROM employees;
-- alias (์ปฌ๋ผ๋ช
, ํ
์ด๋ธ๋ช
์ ์ด๋ฆ์ ๋ณ๊ฒฝํด์ ์กฐํํฉ๋๋ค.)
SELECT
first_name AS ์ด๋ฆ,
last_name AS ์ฑ,
salary AS ๊ธ์ฌ
FROM employees;
-- NULL๊ฐ์ ํ์ธ (์ซ์ 0์ด๋ ๊ณต๋ฐฑ๊ณผ๋ ๋ค๋ฅธ ๊ฐ๋
์
๋๋ค.)
SELECT
department_id, commission_pct
FROM employees;
/*
์ค๋ผํด์ ํ๋ฐ์ดํ๋ก ๋ฌธ์๋ฅผ ํํํ๊ณ , ๋ฌธ์์ด ์์ ํ๋ฐ์ดํ ํน์๊ธฐํธ๋ฅผ
ํํํ๊ณ ์ถ๋ค๋ฉด ''๋ฅผ ๋ ๋ฒ ์ฐ์์ผ๋ก ์ฐ์๋ฉด ๋ฉ๋๋ค.
๋ฌธ์์ด ์ฐ๊ฒฐ๊ธฐํธ๋ || ์
๋๋ค. ๋ฌธ์์ด์ ๋ง์
์ฐ์ฐ์ ํ์ฉํ์ง ์์ต๋๋ค.
*/
SELECT
first_name || '' || last_name || '''s salary is $' || salary AS full_name
FROM employees;
SELECT DISTINCT -- ์ค๋ณตํ ์ ๊ฑฐ
department_id
FROM employees;
-- WHERE์ ๋น๊ต (๋ฐ์ดํฐ ๊ฐ์ ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค.)
SELECT
first_name, last_name, job_id
FROM employees
WHERE job_id = 'IT_PROG';
SELECT
*
FROM employees
WHERE last_name = 'king';
SELECT
*
FROM employees
WHERE department_id = 50;
SELECT
*
FROM employees
WHERE salary >= 15000
AND salary < 20000;
SELECT
*
FROM employees
WHERE hire_date = '04/01/30';
-- ๋ฐ์ดํฐ์ ํ ์ ํ (BETWEEN, IN, LIKE)
SELECT
*
FROM employees
WHERE salary BETWEEN 15000 AND 20000;
SELECT
*
FROM employees
WHERE hire_date BETWEEN '03/01/01' AND '03/12/31';
-- IN ์ฐ์ฐ์ (ํน์ ๊ฐ๋ค๊ณผ ๋น๊ตํ ๋ ์ฌ์ฉ)
-- %๋ ์ด๋ ํ ๋ฌธ์๋ , _๋ ๋ฐ์ดํฐ์ ์๋ฆฌ (์์น)๋ฅผ ํํํ ๋.
SELECT
*
FROM employees
WHERE manager_id IN (101, 102, 103);
SELECT
*
FROM employees
WHERE job_id IN ('IT_PROG', 'AD_VP');
-- LIKE ์ฐ์ฐ์ (์ง์ ๋ฌธ์์ด ํฌํจ ์ฌ๋ถ)
SELECT
first_name,
last_name,
hire_date
FROM employees;
WHERE hire_date LIKE '03%'; -- 03์ผ๋ก ์์๋๋ ๊ฒ ์กฐํ
SELECT
first_name,
last_name,
hire_date
FROM employees;
WHERE hire_date LIKE '%15'; -- 15๋ก ๋๋๋ ๊ฒ ์กฐํ
SELECT
first_name,
last_name,
hire_date
FROM employees;
WHERE hire_date LIKE '%05%'; -- 05๊ฐ ์กด์ฌํ๋ ๋ชจ๋ ๊ฐ์ ์กฐํ
SELECT
first_name,
last_name,
hire_date
FROM employees;
WHERE hire_date LIKE '___05%'; -- ์์ 3๊ธ์๊ฐ ์์ผ๋ฉด์ 05๋ก ์์๋๋ ๊ฒ ์กฐํ
-- IS NULL : null ๊ฐ์ ์ฐพ์
SELECT
*
FROM employees;
WHERE commission_pct IS NULL;
SELECT
*
FROM employees;
WHERE commission_pct IS NOT NULL;
-- AND, OR
-- AND๊ฐ OR๋ณด๋ค ์ฐ์ฐ ์๋๊ฐ ๋น ๋ฆ.
SELECT
*
FROM employees
WHERE job_id = 'IT_PROG'
OR job_id = 'FI_MGR'
AND salary >= 6000;
SELECT
*
FROM employees
WHERE (job_id = 'IT_PROG'
OR job_id = 'FI_MGR')
AND salary >= 6000;
-- ๋ฐ์ดํฐ์ ์ ๋ ฌ (SELECT ๊ตฌ๋ฌธ์ ๊ฐ์ฅ ๋ง์ง๋ง์ ๋ฐฐ์น๋ฉ๋๋ค.)
-- ASC : ์ค๋ฆ์ฐจ (ascending)
-- DESC : ๋ด๋ฆผ์ฐจ (descending)
SELECT
*
FROM employees
ORDER BY hire_date;
SELECT
*
FROM employees
WHERE job_id = 'IT_PROG'
ORDER BY hire_date DESC;
SELECT
first_name,
salary * 12 AS pay
FROM employees
ORDER BY pay DESC;
-- lower(์๋ฌธ์), initcap(์๊ธ์๋ง ๋๋ฌธ์), upper(๋๋ฌธ์)
/*
dual์ด๋ผ๋ ํ
์ด๋ธ์ sys๊ฐ ์์ ํ๋ ์ค๋ผํด์ ํ์ค ํ
์ด๋ธ๋ก์,
์ค์ง ํ ํ์ ํ ์ปฌ๋ผ๋ง ๋ด๊ณ ์๋ dummy ํ
์ด๋ธ ์
๋๋ค.
์ผ์์ ์ธ ์ฐ์ ์ฐ์ฐ์ด๋ ๋ ์ง ์ฐ์ฐ ๋ฑ์ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
๋ชจ๋ ์ฌ์ฉ์๊ฐ ์ ๊ทผํ ์ ์์ต๋๋ค.
*/
SELECT
'abcdef',
LOWER('abcDEF'),
INITCAP('abcDEF'),
UPPER('abcDEF')
FROM dual;
SELECT
last_name,
LOWER(last_name),
INITCAP(last_name),
UPPER(last_name)
FROM employees;
SELECT
salary
FROM employees
WHERE LOWER(last_name) = 'austin';
-- length(๊ธธ์ด), instr(๋ฌธ์ ์ฐพ๊ธฐ, ์์ผ๋ฉด 0์ ๋ฐํ, ์์ผ๋ฉด ์ธ๋ฑ์ค ๊ฐ)
SELECT
'abcdef', LENGTH('abcdef'), INSTR('abcdef', 'b')
FROM dual;
SELECT
first_name,
LENGTH(first_name),
INSTR(first_name, 'a')
FROM employees;
-- SUBSTR(์๋ฅผ ๋ฌธ์์ด, ์์ ์ธ๋ฑ์ค, ๊ธธ์ด)
-- CONCAT(๋ฌธ์ ์ฐ๊ฒฐ)
SELECT
first_name,
SUBSTR(first_name, 1, 3),
CONCAT(first_name, last_name)
FROM employees;
-- LTRIM(), RTRIM()
-- TRIM() -> ์์ชฝ ๊ณต๋ฐฑ ์ ๊ฑฐ
-- LTRIM(param1, param2) -> param2์ ๊ฐ์ param1์์ ์ฐพ์์ ์ ๊ฑฐ (์ผ์ชฝ๋ถํฐ)
-- RTRIM(param1, param2) -> param2์ ๊ฐ์ param1์์ ์ฐพ์์ ์ ๊ฑฐ (์ค๋ฅธ์ชฝ๋ถํฐ)
SELECT
LTRIM('javascript_java', 'java'),
RTRIM('javascript_java', 'java')
FROM dual;
-- LPAD(), RPAD(): ์ข, ์ฐ์ธก์ ์ง์ ํ ๋ฌธ์์ด๋ก ์ฑ์ฐ๊ธฐ
SELECT
LPAD('abc', 10, '*'),
RPAD('abc', 10, '#')
FROM dual;
-- REPLACE(str, old, new)
SELECT
REPLACE('my dream is a president', 'president', 'programmer')
FROM dual;
SELECT
REPLACE(REPLACE('my dream is a president', 'president', 'programmer'), ' ', '')
FROM dual;
-- ์ซ์ํจ์
-- ROUND(๋ฐ์ฌ๋ฆผ)
-- ์ํ๋ ๋ฐ์ฌ๋ฆผ ์์น๋ฅผ ๋งค๊ฐ๊ฐ์ผ๋ก ์ง์ . ์์๋ฅผ ์ฃผ๋ ๊ฒ๋ ๊ฐ๋ฅ.
SELECT
ROUND(3.1415, 3), ROUND(45.923, 0), ROUND(45.923, -1)
FROM dual;
-- TRUNC(์ ์ฌ)
-- ์ ํด์ง ์์์ ์๋ฆฌ์๊น์ง ์๋ผ๋
๋๋ค.
SELECT
TRUNC(3.1415, 3), TRUNC(45.923, 0), TRUNC(45.923, -1)
FROM dual;
-- ABS (์ ๋๊ฐ)
SELECT ABS(-34) FROM dual;
-- CEIL(์ฌ๋ฆผ), FLOOR(๋ด๋ฆผ)
SELECT CEIL(3.14), FLOOR(3.14)
FROM dual;
-- MOD(๋๋จธ์ง ๋๋์
์ฐ์ฐ)
SELECT
10 / 4, MOD(10, 4)
FROM dual;
-------------------------------------------------------------
-- ๋ ์ง ํจ์
-- sysdate: ์ปดํจํฐ์ ํ์ฌ ๋ ์ง, ์๊ฐ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์์ ์ ๊ณตํ๋ ํค์๋ ํจ์ -> ์๊ฐ ์์!
SELECT sysdate FROM dual;
SELECT systimestamp FROM dual; -- ๋ ์ธ๋ฐํ ์๊ฐ๊ณผ ํ์ค์ ์ ๋ณด๊น์ง ์ ๊ณต.
-- ๋ ์ง ์ฐ์ฐ
SELECT sysdate + 1 FROM dual; -- ์ผ์ ๋ง์
์ฐ์ฐ์ด ๊ฐ๋ฅ.
-- ๋ ์ง ํ์
๊ณผ ๋ ์ง ํ์
์ ์๋ก ๋บ์
์ฐ์ฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
-- ๋ง์
์ ํ์ฉํ์ง ์์ต๋๋ค.
SELECT
first_name,
sysdate - hire_date
FROM employees; -- ์ผ์
SELECT
first_name,
(sysdate - hire_date) / 365
FROM employees; -- ๋
์
-- ๋ ์ง ๋ฐ์ฌ๋ฆผ, ์ ์ฌ
SELECT ROUND(sysdate) FROM dual;
SELECT ROUND(sysdate, 'year') FROM dual; -- ๋
๊ธฐ์ค ๋ฐ์ฌ๋ฆผ
SELECT ROUND(sysdate, 'month') FROM dual; -- ์ ๊ธฐ์ค ๋ฐ์ฌ๋ฆผ
SELECT ROUND(sysdate, 'day') FROM dual; -- ์ฃผ ๊ธฐ์ค ๋ฐ์ฌ๋ฆผ (ํด๋น ์ฃผ์ ์ผ์์ผ ๋ ์ง)
SELECT TRUNC(sysdate) FROM dual;
SELECT TRUNC(sysdate, 'year') FROM dual; -- ๋
๊ธฐ์ค ๋ฐ์ฌ๋ฆผ
SELECT TRUNC(sysdate, 'month') FROM dual; -- ์ ๊ธฐ์ค ๋ฐ์ฌ๋ฆผ
SELECT TRUNC(sysdate, 'day') FROM dual; -- ์ฃผ ๊ธฐ์ค ๋ฐ์ฌ๋ฆผ (ํด๋น ์ฃผ์ ์ผ์์ผ ๋ ์ง)
-- ํ๋ณํ ํจ์ TO_CHAR, TO_NUMBER, TO_DATE
-- ๋ ์ง๋ฅผ ๋ฌธ์๋ก TO_CHAR(๊ฐ, ํ์)
-- ๋ ์ง๋ฅผ ๋ฌธ์๋ก ํ ๋ณํํ ๋ ์ํ๋ ํ์์ผ๋ก ๋ ์ง๋ฅผ ํํํ ์ ์์ต๋๋ค.
-- ๋ ์ง ํฌ๋งทํ์: Y - ์ฐ๋, MM - ๋์๋ฆฌ ์, D - ์ผ์ DY - ์์ผ
-- ์๊ฐ ํฌ๋งทํ์: HH12 - ์(1~12), HH24 (0-23), MI - ๋ถ, SS - ์ด
SELECT TO_CHAR(sysdate) FROM dual;
SELECT TO_CHAR(sysdate, 'YYYY-MM-DD DY PM HH:MI:SS') FROM dual;
-- ์์ ๋ฌธ์์ ํจ๊ป ์ฌ์ฉํ๊ณ ์ถ์ ์ผ๋ฐ ๋ฌธ์๋ ""๋ก ๊ฐ์ธ์ ์ ๋ฌ.
SELECT
TO_CHAR(sysdate, 'YY"๋
" MM"์" DD"์ผ"')
FROM dual;
-- ์ซ์๋ฅผ ๋ฌธ์๋ก TO_CHAR(๊ฐ, ํ์)
-- ํ์์์ ์ฌ์ฉํ๋ '9'๋ ์ค์ ์ซ์ 9๊ฐ ์๋๋ผ ์๋ฆฌ์๋ฅผ ํํํ๊ธฐ ์ํ ๊ธฐํธ์
๋๋ค.
SELECT TO_CHAR(20000, '99,999') FROM dual;
SELECT TO_CHAR(20000, 'L99,999') FROM dual;
SELECT TO_CHAR(20000.29, '99,999.9') FROM dual; -- ๋ฐ์ฌ๋ฆผ ์ง์
SELECT
first_name,
TO_CHAR(salary, '$99,999') AS salary
FROM employees;
-- ๋ฌธ์๋ฅผ ์ซ์๋ก ๋ณํ TO_NUMBER(๊ฐ, ํ์)
SELECT '2000' + 2000 FROM dual; -- ์๋ ๋ณํ
SELECT '$3,300' + 2000 FROM dual; -- ์๋ฌ
-- ๋ณํํ๋ ค๋ ๋ฌธ์๊ฐ ๊น๋ํ ์ซ์ ํํ๊ฐ ์๋๋ผ๋ฉด, ์์๋ฌธ์๋ฅผ ์ด์ฉํด์ ์๋ ค์ฃผ์ธ์.
SELECT TO_NUMBER('$3,300', '$9,999') + 2000 FROM dual;
-- ๋ฌธ์๋ฅผ ๋ ์ง๋ก TO_DATE(๊ฐ, ํ์)
SELECT TO_DATE('2023-04-13') + 1 FROM dual;
-- ์ฃผ์ด์ง ๋ฌธ์์ด์ ๋ชจ๋ ๋ณํํด์ผ ํฉ๋๋ค. ์ผ๋ถ๋ง ๋ณํํ ์ ์์ต๋๋ค.
SELECT TO_DATE('2023-04-13 12:23:50', 'YY-MM-DD HH:MI:SS') FROM dual;
SELECT TO_DATE('2023๋
04์ 13์ผ', 'YYYY"๋
" MM"์" DD"์ผ"') FROM dual;
--------------------------------------------------------------------------------
-- NULL ํํ๋ฅผ ๋ณํํ๋ ํจ์ NVL(์ปฌ๋ผ ํน์ ๊ฐ, ๋ณํํ ํ๊ฒ๊ฐ)
SELECT
first_name,
NVL(commission_pct, 0) AS comm_pct
FROM employees;
-- NULL ํํ๋ฅผ ๋ณํํ๋ ํจ์ NVL2(ํ๊ฒ, null์ด ์๋ ๊ฒฝ์ฐ, null ๊ฒฝ์ฐ)
-- ์ฐ์ฐ ์ค๊ฐ์ NULL์ด ์์ผ๋ฉด ์ ์ฒด ๊ฒฐ๊ณผ๊ฐ NULL์ด ๋ฉ๋๋ค!
SELECT
first_name,
salary,
NVL2(
commission_pct,
salary + (salary * commission_pct),
salary
) AS ๊ธ์ฌ
FROM employees;
-- COALESCE(expr1, ...)
-- ์ ๋ฌ๋ ํํ์ ์ค NULL์ด ์๋ ๊ฐ์ด ์ต์ด๋ก ๋ฐ๊ฒฌ๋๋ฉด ๊ทธ ๊ฐ์ ๋ฆฌํด
SELECT
COALESCE(3000, NULL, NULL, 4000)
FROM dual;
-- comm_pct๊ฐ null์ธ ์ ๋ค์ 0์ ์ ์ฉ, null์ด ์๋ ์ ๋ค์ ์์ ์ comm_pct๋ฅผ ์ ์ฉ
SELECT
first_name,
salary,
salary + (salary * COALESCE(commission_pct, 0)) AS ๊ธ์ฌ
FROM employees;
-- DECODE(์ปฌ๋ผ ํน์ ํํ์, ํญ๋ชฉ1, ๊ฒฐ๊ณผ1, ํญ๋ชฉ2, ๊ฒฐ๊ณผ2 ... default)
-- ์ค๋ผํด ์ ์ฉ ํจ์. ๋๋ฑ ๋น๊ต๋ง ๊ฐ๋ฅ.
SELECT
first_name,
job_id,
salary,
DECODE(
job_id,
'IT_PROG', salary * 1.1,
'FI_MGR', salary * 1.2,
'AD_VP', salary * 1.3,
0
) AS result
FROM employees;
-- CASE๋ฌธ WHEN THEN END
-- ANSI ํ์ค ๊ตฌ๋ฌธ
SELECT
first_name,
job_id,
salary,
(CASE job_id
WHEN 'IT_PROG' THEN salary*1.1
WHEN 'FI_MGR' THEN salary*1.2
WHEN 'AD_VP' THEN salary*1.3
ELSE 0
END) AS result
FROM employees;
-- ์งํฉ ์ฐ์ฐ์
-- ์๋ก ๋ค๋ฅธ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ํ๋ค์ ํ๋๋ก ๊ฒฐํฉ, ๋น๊ต, ์ฐจ์ด๋ฅผ ๊ตฌํ ์ ์๊ฒ ํด ์ฃผ๋ ์ฐ์ฐ์
-- UNION(ํฉ์งํฉ ์ค๋ณตx), UNION ALL(ํฉ์งํฉ ์ค๋ณต o), INTERSECT(๊ต์งํฉ), MINUS(์ฐจ์งํฉ)
-- ์ ์๋ column ๊ฐ์์ ๋ฐ์ดํฐ ํ์
์ด ์ ํํ ์ผ์นํด์ผ ํฉ๋๋ค.
-- UNION -> ์ค๋ณต ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ์ง ์์. ์๋์ผ๋ก ์ ๋ ฌ์ด ์ผ์ด๋จ (์ฒซ ๋ฒ์งธ ์ปฌ๋ผ ์ค๋ฆ์ฐจ๊ฐ default)
SELECT
employee_id, first_name
FROM employees
WHERE hire_date LIKE '04%'
UNION
SELECT
employee_id, first_name
FROM employees
WHERE department_id = 20;
-- UNION ALL -> ์ค๋ณต์ ํ์ฉ
SELECT
employee_id, first_name
FROM employees
WHERE hire_date LIKE '04%'
UNION ALL
SELECT
employee_id, first_name
FROM employees
WHERE department_id = 20;
SELECT
employee_id, first_name
FROM employees
WHERE hire_date LIKE '04%'
INTERSECT
SELECT
employee_id, first_name
FROM employees
WHERE department_id = 20;
SELECT
employee_id, first_name
FROM employees
WHERE hire_date LIKE '04%'
MINUS
SELECT
employee_id, first_name
FROM employees
WHERE department_id = 20;
SELECT
employee_id, first_name
FROM employees
WHERE department_id = 20
MINUS
SELECT
employee_id, first_name
FROM employees
WHERE hire_date LIKE '04%';
-- ์ง๊ณํจ์ AVG, MAX, MIN, SUM, COUNT
-- ์ฌ๋ฌ ํ์ ๋ฌถ์ด์ ํ ๋ฒ์ ํจ์๋ฅผ ์ ์ฉ
-- ๊ทธ๋ฃนํ๋ฅผ ๋ฐ๋ก ํ์ง ์์ผ๋ฉด ๊ทธ๋ฃน์ ํ
์ด๋ธ ์ ์ฒด๊ฐ ๋ฉ๋๋ค.
SELECT
AVG(salary),
MAX(salary),
MIN(salary),
SUM(salary),
COUNT(salary)
FROM employees;
SELECT COUNT(*) FROM employees; -- ์ด ํ์ ๋ฐ์ดํฐ ์
SELECT COUNT(first_name) FROM employees;
SELECT COUNT(commission_pct) FROM employees; -- null์ด ์๋ ํ์ ์
SELECT COUNT(manager_id) FROM employees; -- null์ ์นด์ดํ
๋์ง ์์ต๋๋ค.
-- ๋ถ์๋ณ๋ก ๊ทธ๋ฃนํ, ์ง๊ณํจ์ ์ฌ์ฉ
SELECT
department_id,
AVG(salary),
COUNT(*)
FROM employees
GROUP BY department_id;
-- ๊ทธ๋ฃน ํจ์๋ ๋จ๋
์ ์ผ๋ก ์ฌ์ฉํ ๋๋ ํ
์ด๋ธ ์ ์ฒด๊ฐ ๊ทธ๋ฃน์ ๋์์ด ๋์ง๋ง
-- ์ผ๋ฐ ์ปฌ๋ผ๊ณผ ๋์์ ์ถ๋ ฅํ ์ ์์ต๋๋ค. ์ผ๋ฐ ์ปฌ๋ผ์ ๊ทธ๋ฃนํ ํด์ผ ํฉ๋๋ค.
SELECT
department_id,
AVG(salary),
COUNT(*)
FROM employees; -- ์๋ฌ
-- GROUP BY์ ์ ์ฌ์ฉํ ๋, GROUP์ ์ ๋ฌถ์ด์ง ์์ ์ปฌ๋ผ์ ์กฐํํ ์ ์์ต๋๋ค.
SELECT
job_id,
department_id,
AVG(salary),
COUNT(*)
FROM employees
GROUP BY department_id;
-- GROUP BY์ 2๊ฐ ์ด์ ์ฌ์ฉ
SELECT
job_id,
department_id,
AVG(salary),
COUNT(*)
FROM employees
GROUP BY department_id, job_id;
-- GROUP BY๋ฅผ ํตํด ๊ทธ๋ฃนํ ํ ๋, ์กฐ๊ฑด์ ์ง์ ํ ๊ฒฝ์ฐ HAVING์ ์ฌ์ฉ.
-- WHERE์ ์ผ๋ฐ ์กฐ๊ฑด์ . GROUP BY๋ณด๋ค ๋จผ์ ์งํ๋ฉ๋๋ค.
SELECT
department_id,
SUM(salary),
AVG(salary)
FROM employees
GROUP BY department_id
HAVING SUM(salary) > 100000;
-- ๋ถ์ ์์ด๋๊ฐ 50 ์ด์์ธ ์ธ์๋ง ๊ทธ๋ฃนํ ์ํค๊ณ , ๊ทธ๋ฃน ๊ธ์ฌ ํ๊ท ์ด
-- 5000 ์ด์๋ง ์กฐํ
SELECT
department_id,
AVG(salary) AS ํ๊ท ๊ธ์ฌ
FROM employees
WHERE department_id >= 50
GROUP BY department_id
HAVING AVG(salary) >= 5000
ORDER BY ํ๊ท ๊ธ์ฌ DESC;
/*
# ์กฐ์ธ์ด๋?
- ์๋ก ๋ค๋ฅธ ํ
์ด๋ธ ๊ฐ์ ์ค์ ๋ ๊ด๊ณ๊ฐ ๊ฒฐํฉํ์ฌ
1๊ฐ ์ด์์ ํ
์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ธฐ ์ํด์ ์ฌ์ฉํฉ๋๋ค.
- SELECT ์ปฌ๋ผ๋ฆฌ์คํธ FROM ์กฐ์ธ๋์์ด ๋๋ ํ
์ด๋ธ (1๊ฐ ์ด์)
WHERE ์กฐ์ธ ์กฐ๊ฑด (์ค๋ผํด ์กฐ์ธ ๋ฌธ๋ฒ)
*/
-- employees ํ
์ด๋ธ์ ๋ถ์ id์ ์ผ์นํ๋ departments ํ
์ด๋ธ์ ๋ถ์ id๋ฅผ ์ฐพ์
-- ๋ถ์ ์ด๋ฆ์ ์กฐํํ์.
SELECT
e.first_name,
e.department_id,
d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id;
/*
๊ฐ๊ฐ์ ํ
์ด๋ธ์ ๋
๋ฆฝ์ ์ผ๋ก ์กด์ฌํ๋ ์ปฌ๋ผ์ ๊ฒฝ์ฐ์๋
ํ
์ด๋ธ ์ด๋ฆ์ ์๋ตํด๋ ๋ฌด๋ฐฉํฉ๋๋ค. ๊ทธ๋ฌ๋, ํด์์ ๋ช
ํ์ฑ์ ์ํด
ํ
์ด๋ธ ์ด๋ฆ์ ์์ฑํ์
์ ์์์ ํํํด ์ฃผ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค.
ํ
์ด๋ธ ์ด๋ฆ์ด ๋๋ฌด ๊ธธ ์์๋ ALIAS๋ฅผ ์์ฑํ์ฌ ์นญํฉ๋๋ค.
๋ ํ
์ด๋ธ ๋ชจ๋ ๊ฐ์ง๊ณ ์๋ ์ปฌ๋ผ์ ๊ฒฝ์ฐ ๋ฐ๋์ ๋ช
์ํด ์ฃผ์
์ผ ํฉ๋๋ค.
*/
-- 3๊ฐ์ ํ
์ด๋ธ์ ์ด์ฉํ ๋ด๋ถ ์กฐ์ธ (INNER JOIN)
-- ๋ด๋ถ ์กฐ์ธ: ์กฐ์ธ ์กฐ๊ฑด์ ์ผ์นํ๋ ํ๋ง ๋ฐํํ๋ ์กฐ์ธ
-- ์กฐ์ธ ์กฐ๊ฑด์ ์ผ์นํ์ง ์๋ ๋ฐ์ดํฐ๋ ์กฐํ ๋์์์ ์ ์ธ
SELECT
e.first_name,
e.department_id,
d.department_name,
j.job_title
FROM employees e, departments d, jobs j
WHERE e.department_id = d.department_id
AND e.job_id = j.job_id;
-- 4๊ฐ์ ํ
์ด๋ธ ์กฐ์ธ
SELECT
e.first_name,
e.department_id,
d.department_name,
j.job_title,
loc.city
FROM employees e, departments d, jobs j, locations loc
WHERE e.department_id = d.department_id
AND e.job_id = j.job_id
AND d.location_id = loc.location_id
AND loc.state_province = 'California'; -- ์ผ๋ฐ ์กฐ๊ฑด์ ์กฐ์ธ ์กฐ๊ฑด ์ดํ์ ์์ฑ.
-- ์ธ๋ถ ์กฐ์ธ (OUTER JOIN)
/*
์ํธ ํ
์ด๋ธ๊ฐ์ ์ผ์น๋๋ ๊ฐ์ผ๋ก ์ฐ๊ฒฐ๋๋ ๋ด๋ถ ์กฐ์ธ๊ณผ๋ ๋ค๋ฅด๊ฒ
์ด๋ ํ ํ
์ด๋ธ์ ๊ณตํต ๊ฐ์ด ์๋๋ผ๋ ํด๋น row๋ค์ด ์กฐํ ๊ฒฐ๊ณผ์
๋ชจ๋ ํฌํจ๋๋ ์กฐ์ธ์ ๋งํฉ๋๋ค.
*/
SELECT
e.first_name,
d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id(+);
-- ์ธ๋ถ ์กฐ์ธ ์งํ ์ ๋ชจ๋ ์กฐ๊ฑด์ (+)๋ฅผ ๋ถ์ฌ์ผ ํ๋ฉฐ
-- ์ผ๋ฐ ์กฐ๊ฑด์๋ (+)๋ฅผ ๋ถ์ด์ง ์์ผ๋ฉด ๋ฐ์ดํฐ๊ฐ ๋๋ฝ๋๋ ํ์์ด ๋ฐ์.
SELECT
e.employee_id, e.first_name, e.department_id,
jh.start_date, jh.end_date, jh.job_id
FROM employees e, job_history jh
WHERE e.employee_id = jh.employee_id(+)
AND jh.department_id(+) = 80;
-- ์ด๋(๋ด๋ถ) ์กฐ์ธ
SELECT
e.first_name,
e.department_id,
d.department_name
FROM employees e
JOIN departments d -- JOIN์ด๋ผ๊ณ ๋ง ์จ๋ INNER JOIN
ON e.department_id = d.department_id
WHERE e.department_id = 50;
-- ์์ฐํฐ(์ธ๋ถ) ์กฐ์ธ
SELECT
e.first_name,
d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.department_id;
-- ํ ์์ฐํฐ ์กฐ์ธ(์ข์ธก ํ
์ด๋ธ๊ณผ ์ฐ์ธก ํ
์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์ฝ์ด ํํํ๋ ์ธ๋ถ ์กฐ์ธ)
-- LEFT + RIGHT JOIN
SELECT
e.first_name,
d.department_name
FROM employees e
FULL JOIN departments d
ON e.department_id = d.department_id;
-- CROSS JOIN์ JOIN ์กฐ๊ฑด์ ์ค์ ํ์ง ์๊ธฐ ๋๋ฌธ์
-- ๋จ์ํ ๋ชจ๋ ์ปฌ๋ผ์ ๋ํ JOIN์ ์ํํฉ๋๋ค.
-- ์ค์ ๋ก๋ ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ต๋๋ค.
-- (์คํ ๊ฒฐ๊ณผ ํ์ ์: ๊ฐ ํ
์ด๋ธ์ ํ์ ๊ณฑํด์ฃผ๋ฉด ๋จ.)
SELECT
*
FROM employees
CROSS JOIN departments;
SELECT * FROM employees, departments;
-- ์ฌ๋ฌ ๊ฐ ํ
์ด๋ธ ์กฐ์ธ -> ์กฐ์ธ ์กฐ๊ฑด์ ์ฌ์ฉํ ํค ๊ฐ์ ์ฐพ์
-- ์ฐ๊ฒฐํด์ ์ฐ๋ฉด ๋ฉ๋๋ค.
SELECT
*
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.department_id
LEFT JOIN locations loc
ON d.location_id = loc.location_id;
-- SELF JOIN์ด๋ ๋์ผ ํ
์ด๋ธ ์ฌ์ด์ ์กฐ์ธ์ ๋งํฉ๋๋ค.
-- ๋์ผ ํ
์ด๋ธ ์ปฌ๋ผ์ ํตํด ๊ธฐ์กด์ ์กด์ฌํ๋ ๊ฐ์ ๋งค์นญ์์ผ ๊ฐ์ ธ์ฌ ๋ ์ฌ์ฉํฉ๋๋ค.
-- ๊ฐ ์ฌ์๋ณ ๋งค๋์ ์ ์ด๋ฆ์ ์กฐํ
SELECT
e1.employee_id, e1.first_name, e1.manager_id,
e2.first_name, e2.employee_id
FROM employees e1
LEFT JOIN employees e2
ON e1.manager_id = e2.employee_id;
-- ๊ฐ ๋งค๋์ ๊ฐ ๋น๋ดํ๋ ์ฌ์์ ๋ช
์
-- ๋งค๋์ ์์ด๋, ๋งค๋์ ์ด๋ฆ, ์ฌ์์
SELECT
m.employee_id AS manager_id,
m.first_name AS manager_name,
COUNT(m.employee_id) AS ์ฌ์์
FROM employees e
JOIN employees m
ON e.manager_id = m.employee_id
GROUP BY m.employee_id, m.first_name;
-- Natural Join
-- ๋์ผํ ์ด๋ฆ์ ๊ฐ๋ ์ปฌ๋ผ๋ค์ ๋ํด ์๋์ผ๋ก ์กฐ์ธ์กฐ๊ฑด์ ์์ฑํ๋ ๊ธฐ๋ฒ์
๋๋ค.
-- ์ฆ, ์๋์ผ๋ก 2๊ฐ ์ด์์ ํ
์ด๋ธ์์ ๊ฐ์ ์ด๋ฆ์ ๊ฐ์ง ์ปฌ๋ผ์ ์ฐพ์ INNER JOIN์ ์ํํฉ๋๋ค.
-- ์กฐ์ธ๋๋ ๋์ผ ์ด๋ฆ์ ์ปฌ๋ผ์ ํ์
์ด ๊ฐ์์ผ ํ๋ฉฐ,
-- ALIAS๋ ํ
์ด๋ธ๋ช
์ ์๋ ์กฐ์ธ ์ปฌ๋ผ ์์ ํ๊ธฐํ๋ฉด ์๋ฉ๋๋ค.
-- ์กฐํํ๋ ค๋ ์ปฌ๋ผ์ *์ ๋ถ์ด๋ฉด, ๊ณตํต ์ปฌ๋ผ์ ํ ๋ฒ๋ง ํ๊ธฐ๋ฉ๋๋ค.
SELECT
e.employee_id, e.first_name,
department_id, d.department_name
FROM employees e
NATURAL JOIN departments d;
-- USING JOIN
-- NATURAL JOIN๊ณผ๋ ๋ค๋ฅด๊ฒ, USING์ ์ฌ์ฉํ๋ฉด ์ํ๋ ์ปฌ๋ผ์ ๋ํด์๋ง ์ ํ์ ์กฐ์ธ์กฐ๊ฑด์
-- ๋ถ์ฌํ ์ ์์ต๋๋ค.
-- USING์ ์์๋ ์กฐ์ธ ์ปฌ๋ผ์ ๋ํด ALIAS๋ ํ
์ด๋ธ๋ช
์ ํ๊ธฐํ์๋ฉด ์๋ฉ๋๋ค.
SELECT
e.employee_id, e.first_name,
department_id, d.department_name
FROM employees e
JOIN departments d USING(department_id);
/*
# ์๋ธ์ฟผ๋ฆฌ
: SQL ๋ฌธ์ฅ ์์ ๋๋ค๋ฅธ SQL์ ํฌํจํ๋ ๋ฐฉ์.
์ฌ๋ฌ ๊ฐ์ ์ง์๋ฅผ ๋์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
WHERE, SELECT, FROM ์ ์ ์์ฑ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ์๋ธ์ฟผ๋ฆฌ์ ์ฌ์ฉ๋ฐฉ๋ฒ์ () ์์ ๋ช
์ํจ.
์๋ธ์ฟผ๋ฆฌ์ ์ ๋ฆฌํดํ์ด 1์ค ์ดํ์ฌ์ผ ํฉ๋๋ค.
- ์๋ธ์ฟผ๋ฆฌ ์ ์๋ ๋น๊ตํ ๋์์ด ํ๋ ๋ฐ๋์ ๋ค์ด๊ฐ์ผ ํฉ๋๋ค.
- ํด์ํ ๋๋ ์๋ธ์ฟผ๋ฆฌ์ ๋ถํฐ ๋จผ์ ํด์ํ๋ฉด ๋ฉ๋๋ค.
*/
-- ์ด๋ฆ์ด 'Nancy'์ธ ์ฌ์๋ณด๋ค ๊ธ์ฌ๊ฐ ๋์ ์ฌ์์ ์กฐํํ๊ธฐ
SELECT salary FROM employees
WHERE first_name = 'Nancy';
SELECT first_name FROM employees
WHERE salary > 12008;
-- ์๋ธ์ฟผ๋ฆฌ๋ฅผ ํ์ฉํ ๋ฌธ์ฅ
SELECT first_name FROM employees
WHERE salary > (SELECT salary FROM employees
WHERE first_name = 'Nancy');
-- employee_id๊ฐ 103๋ฒ์ธ ์ฌ๋์ job_id๋ ๋์ผํ job_id๋ฅผ ๊ฐ์ง ์ฌ๋์ ์กฐํ.
SELECT * FROM employees
WHERE job_id = (SELECT job_id FROM employees
WHERE employee_id = 103);
-- ๋ค์ ๋ฌธ์ฅ์ ์๋ธ์ฟผ๋ฆฌ๊ฐ ๋ฆฌํดํ๋ ํ์ด ์ฌ๋ฌ ๊ฐ๋ผ์ ๋จ์ผ ํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
-- ๋จ์ผ ํ ์ฐ์ฐ์: ์ฃผ๋ก ๋น๊ต ์ฐ์ฐ์ (=, >, <, >=, <=, <>)๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํ๋์ ํ๋ง ๋ฐํํด์ผ ํฉ๋๋ค.
-- ์ด๋ฐ ๊ฒฝ์ฐ์๋ ๋ค์ค ํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
SELECT * FROM employees
WHERE job_id = (SELECT job_id FROM employees
WHERE last_name = 'King'); -- ์๋ฌ
-- ๋ค์ค ํ ์ฐ์ฐ์ (IN, ANY, ALL, EXIST)
-- IN: ์กฐํ๋ ๋ชฉ๋ก์ ์ด๋ค ๊ฐ๊ณผ ๊ฐ์์ง๋ฅผ ๋น๊ต.
-- ex) salary IN (200, 300, 400)
-- 250 -> false
SELECT * FROM employees
WHERE job_id IN (SELECT job_id FROM employees
WHERE last_name = 'King');
-- first_name์ด David์ธ ์ฌ๋๋ค์ ๊ธ์ฌ์ ๊ฐ์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ๋๋ค์ ์กฐํ.
SELECT
*
FROM employees
WHERE salary IN (SELECT salary FROM employees
WHERE first_name = 'David');
-- ANY, SOME : ๊ฐ์ ์๋ธ์ฟผ๋ฆฌ์ ์ํด ๋ฆฌํด๋ ๊ฐ๊ฐ์ ๊ฐ๊ณผ ๋น๊ตํด์
-- ํ๋๋ผ๋ ๋ง์กฑํ๋ฉด ์กฐํ ๋์์ ํฌํจ๋ฉ๋๋ค.
-- ex) salary > ANY (200, 300, 400)
-- 250 -> true
SELECT
*
FROM employees
WHERE salary > ANY (SELECT salary FROM employees
WHERE first_name = 'David');
-- ALL: ๊ฐ์ ์๋ธ์ฟผ๋ฆฌ์ ์ํด ๋ฆฌํด๋ ๊ฐ๊ฐ์ ๊ฐ๊ณผ ๋น๊ตํด์
-- ์ ๋ถ ๋ค ์ผ์นํด์ผ ์กฐํ๋์์ ํฌํจ๋ฉ๋๋ค.
-- ex) salary > ALL (200, 300, 400)
-- 250 -> false, 200 ๋ณด๋ค๋ ํฌ์ง๋ง 300, 400๋ณด๋ค๋ ํฌ์ง ์๊ธฐ ๋๋ฌธ์
SELECT
*
FROM employees
WHERE salary > ALL (SELECT salary FROM employees
WHERE first_name = 'David');
-- job_history์ ์กด์ฌํ๋ ์ง์์ด employees์๋ ์กด์ฌํ๋ค๋ฉด ์กฐํ ๋์์ ํฌํจ.
-- ์๋ธ์ฟผ๋ฆฌ ๋ด์์ jh์ ์๋ id์ e์ ์๋ id๊ฐ ์ผ์นํ ๋๋ง๋ค 1์ด๋ผ๋ ๊ฐ์ ์กฐํ.
-- EXISTS ์ฐ์ฐ์๊ฐ 1์ด ์กฐํ๊ฐ ๋ ๋ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ค๋ ๊ฒ์ ํ๋จํ์ฌ
-- employees์์ ํด๋น ์ฌ์์ ๋ชจ๋ ์ปฌ๋ผ์ ์กฐํ.
-- EXISTS : ์๋ธ์ฟผ๋ฆฌ๊ฐ ํ๋ ์ด์์ ํ์ ๋ฐํํ๋ฉด ์ฐธ์ผ๋ก ๊ฐ์ฃผ.
SELECT * FROM employees e
WHERE EXISTS (SELECT 1 FROM job_history jh
WHERE e.employee_id = jh.employee_id);
-------------------------------------------------------------------------
-- SELECT ์ ์ ์๋ธ์ฟผ๋ฆฌ ๋ถ์ด๊ธฐ.
-- ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ ๋ผ๊ณ ๋ ์นญํฉ๋๋ค.
-- ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ : ์คํ ๊ฒฐ๊ณผ๊ฐ ๋จ์ผ ๊ฐ์ ๋ฐํํ๋ ์๋ธ์ฟผ๋ฆฌ.
SELECT
e.first_name,
d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.department_id
ORDER BY e.first_name;
SELECT
e.first_name,
(
SELECT
d.department_name
FROM departments d
WHERE d.department_id = e.department_id
) AS department_name
FROM employees e
ORDER BY e.first_name;
/*
# ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ vs LEFT JOIN
a. ๊ฐ๋จํ ์ํฉ์์ ์ฌ์ฉํ๋ฉด ์ฟผ๋ฆฌ๊ฐ ์ง๊ด์ ์ด๊ณ ๊ฐ๊ฒฐํฉ๋๋ค.
b. ๋จ์ผ ๊ฐ์ ๋ฐํํ๋ ์๋ธ์ฟผ๋ฆฌ์์ ์ ์ฉ.
c. ๋๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ๋, ์๋ธ์ฟผ๋ฆฌ์ ๋ณต์ก๋๊ฐ ๋ฎ์ ๊ฒฝ์ฐ ์ ํฉ.
1. ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋, ์ฌ๋ฌ ์ปฌ๋ผ์ ๋ถ์ฌ์ผ ํ ๋ ์ ๋ฆฌํฉ๋๋ค.
2. ์ฌ๋ฌ ํ
์ด๋ธ์ ํ ๋ฒ์ ์กฐ์ธํด์ผ ํ ๊ฒฝ์ฐ.
3. ๋ค์ค๊ฐ ์ฒ๋ฆฌ ๋ฐ ์ค๋ณต ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ์ข ๋ ์ ๋ฆฌ.
*/
-- ๊ฐ ๋ถ์ ๋ณ ์ฌ์์ ๋ฝ๊ธฐ (๋ถ์๋ช
, ์ฌ์์)
SELECT
d.department_name,
COUNT(e.employee_id) AS ์ฌ์
FROM departments d
LEFT JOIN employees e
ON d.department_id = e.department_id
GROUP BY d.department_name
ORDER BY ์ฌ์ DESC;
SELECT
d.department_name,
NVL ((
SELECT
COUNT(*)
FROM employees e
WHERE e.department_id = d.department_id
GROUP BY department_id
), 0) AS ์ฌ์
FROM departments d
ORDER BY ์ฌ์ DESC;
------------------------------------------------------------------------
-- FROM์ ์๋ธ์ฟผ๋ฆฌ (์ธ๋ผ์ธ ๋ทฐ)
-- ํน์ ํ
์ด๋ธ ์ ์ฒด๊ฐ ์๋ SELECT๋ฅผ ํตํด ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๊ฒ์ ๊ฐ์ ํ
์ด๋ธ๋ก ์ฌ์ฉํ๊ณ ์ถ์ ๋.
-- ์๋ฒ์ ์ ํด๋์ ์กฐํ ์๋ฃ๋ฅผ ๋ฒ์๋ฅผ ์ง์ ํด์ ๊ฐ์ง๊ณ ์ค๋ ๊ฒฝ์ฐ.
/*
๊ฐ์ฅ ์์ชฝ SELECT ์ ์์ ํ์ํ ํ
์ด๋ธ ํ์(์ธ๋ผ์ธ ๋ทฐ)์ ์์ฑ.
๋ฐ๊นฅ์ชฝ SELECT ์ ์์ ROWNUM์ ๋ถ์ฌ์ ๋ค์ ์กฐํ
๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ SELECT ์ ์์๋ ์ด๋ฏธ ๋ถ์ด์๋ ROWNUM์ ๋ฒ์๋ฅผ ์ง์ ํด์ ์กฐํ.
** SQL์ ์คํ ์์
FROM(JOIN) -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
*/
SELECT
*
FROM
(SELECT
ROWNUM AS rn, tbl.*
FROM
(SELECT
employee_id,first_name, salary
FROM employees
ORDER BY salary DESC)
tbl)
WHERE rn > 30 AND rn <= 40;
SELECT
first_name, salary,
tbl.avg_salary
FROM employees e
JOIN (SELECT
department_id,
TRUNC(AVG(salary), 0) AS avg_salary
FROM employees
GROUP BY department_id
) tbl
ON e.department_id = tbl.department_id;
-- ๋ถ์๋ณ ์ต๊ณ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ง์์ ์กฐํํด์ฃผ์ธ์.
-- ์ฌ์ ์ด๋ฆ, ๊ธ์ฌ, ๋ถ์ ์ด๋ฆ
SELECT
e.first_name,
e.salary,
d.department_name
FROM employees e
JOIN (
SELECT
department_id,
MAX (salary) AS max_salary
FROM employees
GROUP BY department_id
) max_sal
ON e.department_id = max_sal.department_id
AND e.salary = max_sal.max_salary
JOIN departments d
ON e.department_id = d.department_id;
SELECT
e.first_name,
e.salary,
d.department_name
FROM employees e
JOIN departments d
ON e.department_id = d.department_id
WHERE e.salary = (
SELECT
MAX(salary)
FROM employees
WHERE department_id = e.department_id
)
ORDER BY e.salary;
-- INSERT
-- ํ
์ด๋ธ ๊ตฌ์กฐ ํ์ธ
DESC departments;
-- INSERT์ ์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ (๋ชจ๋ ์ปฌ๋ผ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ์ง์ ํด์ ์ฝ์
)
-- ์๋ฌ -> ์ปฌ๋ผ์ ์ง์ ํ์ง ์๊ณ ๊ฐ๋ง ์ฃผ๋ ๊ฒฝ์ฐ์๋ ๋ชจ๋ ๊ฐ์ ๋ค์ค์ผ ํ๋ค.
INSERT INTO departments
VALUES(301, '์์
๋ถ');
SELECT * FROM departments;
-- INSERT์ ๋๋ฒ์งธ ๋ฐฉ๋ฒ (์ง์ ์ปฌ๋ผ์ ์ง์ ํด์ ์ ์ฅ, NOT NULL ์ปฌ๋ผ ํ์ธ!)
INSERT INTO departments
(department_id, manager_id)
VALUES
(302, 101); -- ์๋ฌ
ROLLBACK; -- ์คํ ์์ ์ ๋ค์ ๋ค๋ก ๋๋๋ฆฌ๋ ํค์๋.
-- ์ฌ๋ณธ ํ
์ด๋ธ ์์ฑ
-- ์ฌ๋ณธ ํ
์ด๋ธ์ ์์ฑํ ๋ ๊ทธ๋ฅ ์์ฑํ๋ฉด -> ์กฐํ๋ ๋ฐ์ดํฐ๊น์ง ๋ชจ๋ ๋ณต์ฌ
-- WHERE์ ์ false(1=2)๋ฅผ ์ฃผ๋ฉด -> ํ
์ด๋ธ์ ๊ตฌ์กฐ๋ง ๋ณต์ฌ๋๊ณ ๋ฐ์ดํฐ๋ ๋ณต์ฌ x
-- ์ ์ฝ์กฐ๊ฑด์ ๋ณต์ฌ๋์ง ์์ต๋๋ค.
CREATE TABLE emps2 AS
(SELECT employee_id, first_name, job_id, hire_date
FROM employees WHERE 1 = 2);
SELECT * FROM emps;
DROP TABLE emps2;
-- INSERT (์๋ธ์ฟผ๋ฆฌ)
INSERT INTO emps
(SELECT employee_id, first_name, job_id, hire_date
FROM employees WHERE department_id = 50);
-------------------------------------------------------------
-- UPDATE
-- UPDATE ํ
์ด๋ธ์ด๋ฆ SET ์ปฌ๋ผ=๊ฐ, ์ปฌ๋ผ=๊ฐ ..... WHERE ๋๊ตฌ๋ฅผ ์์ ํ ์ง(์กฐ๊ฑด)
UPDATE emps
SET first_name = '์ถ์์ด'; -- ์กฐ๊ฑด ์ง์ ์ํ๋ฉด ๋์์ด ํ
์ด๋ธ ์ ์ฒด๊ฐ ๋จ!
ROLLBACK;
UPDATE emps
SET first_name = '์ถ์์ด'
WHERE employee_id = 100;
UPDATE emps
SET
first_name = '์ผ์น์ด',
job_id = '๋ฐฑ์',
hire_date = sysdate
WHERE employee_id = 100;
SELECT * FROM emps;
-- UPDATE ์๋ธ์ฟผ๋ฆฌ
UPDATE emps
SET (job_id, hire_date) =
(
SELECT
job_id, hire_date
FROM emps
WHERE employee_id = 100
)
WHERE employee_id = 101;
-----------------------------------------------------------
-- DELETE
-- DELETE๋ WHERE ์ง์ ํ์ง ์์ผ๋ฉด ํ
์ด๋ธ ์ ์ฒด ํ์ด ๋์์ด ๋ฉ๋๋ค.
DELETE FROM emps
WHERE employee_id = 101;
-- DELETE (์๋ธ์ฟผ๋ฆฌ)
DELETE FROM emps
WHERE department_id = (SELECT department_id FROM departments
WHERE department_name = 'IT');
-- ์คํ ์ปค๋ฐ ํ์ฑํ ์ฌ๋ถ ํ์ธ
SHOW AUTOCOMMIT;
-- ์คํ ์ปค๋ฐ ์ผ๊ธฐ
SET AUTOCOMMIT ON;
-- ๋๊ธฐ
SET AUTOCOMMIT OFF;
SELECT * FROM emps;
INSERT INTO emps
VALUES(300, '์ถ์', 'IT_PROG', sysdate);
DELETE FROM emps WHERE employee_id = 300;
INSERT INTO emps
VALUES(301, '๋ฉ๋กฑ์ด', '์์
๋ถ', sysdate);
-- ๋ณด๋ฅ์ค์ธ ๋ชจ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ฌํญ์ ์ทจ์ (ํ๊ธฐ)
-- ์ง์ ์ปค๋ฐ ๋จ๊ณ๋ก ํ๊ท(๋์๊ฐ๊ธฐ) ๋ฐ ํธ๋์ ์
์ข
๋ฃ.
ROLLBACK;
-- ์ธ์ด๋ธ ํฌ์ธํธ ์์ฑ
-- ๋กค๋ฐฑํ ํฌ์ธํธ๋ฅผ ์ง์ ์ด๋ฆ์ ๋ถ์ฌ์ ์ง์ .
-- ANSI ํ์ค ๋ฌธ๋ฒ์ ์๋๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ๊ถ์ฅํ์ง๋ ์์.
SAVEPOINT insert_choon;
ROLLBACK TO SAVEPOINT insert_choon;
-- ๋ณด๋ฅ์ค์ธ ๋ชจ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฌํญ์ ์๊ตฌ์ ์ผ๋ก ์ ์ฉํ๋ฉด์ ํธ๋์ ์
์ข
๋ฃ.
-- ์ปค๋ฐ ํ์๋ ์ด๋ ํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋๋ผ๋ ๋๋๋ฆด ์ ์์ต๋๋ค.
COMMIT;
/*
- NUMBER(2) -> ์ ์๋ฅผ 2์๋ฆฌ๊น์ง ์ ์ฅํ ์ ์๋ ์ซ์ํ ํ์
.
- NUMBER(5, 2) -> ์ ์๋ถ, ์ค์๋ถ๋ฅผ ํฉ์น ์ด ์๋ฆฌ์ 5์๋ฆฌ, ์์์ 2์๋ฆฌ
- NUMBER -> ๊ดํธ๋ฅผ ์๋ตํ ์ (38, 0)์ผ๋ก ์๋ ์ง์ ๋ฉ๋๋ค.
- VARCHAR2(byte) -> ๊ดํธ ์์ ๋ค์ด์ฌ ๋ฌธ์์ด์ ์ต๋ ๊ธธ์ด๋ฅผ ์ง์ . (4000byte๊น์ง)
- CLOB -> ๋์ฉ๋ ํ
์คํธ ๋ฐ์ดํฐ ํ์
(์ต๋ 4Gbyte)
- BLOB -> ์ด์งํ ๋์ฉ๋ ๊ฐ์ฒด (์ด๋ฏธ์ง, ํ์ผ ์ ์ฅ ์ ์ฌ์ฉ)
- DATE -> BC 4712๋
1์ 1์ผ ~ AD 9999๋
12์ 31์ผ๊น์ง ์ง์ ๊ฐ๋ฅ
- ์, ๋ถ, ์ด ์ง์ ๊ฐ๋ฅ.
*/
CREATE TABLE dept (
dept_no NUMBER(2),
dept_name VARCHAR2(14),
loca VARCHAR2(15),
dept_date DATE,
dept_bouns NUMBER(10)
);
DESC dept;
SELECT * FROM dept;
-- NUMBER์ VARCHAR2์ ํ์
, ๊ธธ์ด๋ฅผ ํ์ธ.
INSERT INTO dept
VALUES (20, '๋ง์ผํ
', '๊ฒฝ๊ธฐ', sysdate, 3000000.86);
-- ์ปฌ๋ผ ์ถ๊ฐ
ALTER TABLE dept
ADD dept_count NUMBER(3);
-- ์ปฌ๋ผ๋ช
์์
ALTER TABLE dept
RENAME COLUMN dept_count TO emp_count;
-- ์ปฌ๋ผ ์์ฑ ๋ณ๊ฒฝ
-- ๋ง์ฝ ๋ณ๊ฒฝํ๊ณ ์ ํ๋ ์ปฌ๋ผ์ ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ค๋ฉด, ๊ทธ์ ๋ง๋ ํ์
์ผ๋ก
-- ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. ๋ง์ง ์๋ ํ์
์ผ๋ก๋ ๋ณ๊ฒฝ์ด ๋ถ๊ฐํฉ๋๋ค.
ALTER TABLE dept
MODIFY dept_no NUMBER(4);
-- DDL(CREATE, ALTER, TRUNCATE, DROP)์ ํธ๋์ ์
๋์์ด ์๋๋๋ค.
-- DML(INSERT, UPDATE, DELETE) ์ดํ DDL์ ์คํํ๋ฉด COMMIT์ด ์๋์ผ๋ก ๋ค์ด๊ฐ.
ROLLBACK;
-- ์ปฌ๋ผ ์ญ์
ALTER TABLE dept
DROP COLUMN dept_bouns;
-- ํ
์ด๋ธ ์ด๋ฆ ๋ณ๊ฒฝ
ALTER TABLE dept
RENAME TO dept2;
SELECT * FROM dept2;
-- ํ
์ด๋ธ ์ญ์ (๊ตฌ์กฐ๋ ๋จ๊ฒจ๋๊ณ ๋ด๋ถ ํ
์ดํฐ๋ง ๋ชจ๋ ์ญ์ )
TRUNCATE TABLE dept2;
-- ํ
์ด๋ธ ์ญ์
DROP TABLE dept2;
-- ํ
์ด๋ธ ์์ฑ๊ณผ ์ ์ฝ์กฐ๊ฑด
-- : ํ
์ด๋ธ์ ๋ถ์ ์ ํ ๋ฐ์ดํฐ๊ฐ ์
๋ ฅ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ท์น์ ์ค์ ํ๋ ๊ฒ.
-- ํ
์ด๋ธ ์ด๋ ๋ฒจ ์ ์ฝ์กฐ๊ฑด (PRIMARY KEY, UNIQUE, NOT NULL, FOREIGN KEY, CHECK)
-- PRIMARY KEY: ํ
์ด๋ธ์ ๊ณ ์ ์๋ณ ์ปฌ๋ผ์
๋๋ค. (์ฃผ์ ํค)
-- UNIQUE: ์ ์ผํ ๊ฐ์ ๊ฐ๊ฒ ํ๋ ์ปฌ๋ผ (์ค๋ณต๊ฐ ๋ฐฉ์ง)
-- NOT NULL: null์ ํ์ฉํ์ง ์์. (ํ์๊ฐ)
-- FOREIGN KEY: ์ฐธ์กฐํ๋ ํ
์ด๋ธ์ PRIMARY KEY๋ฅผ ์ ์ฅํ๋ ์ปฌ๋ผ
-- CHECK: ์ ์๋ ํ์๋ง ์ ์ฅ๋๋๋ก ํ์ฉ.
-- ์ปฌ๋ผ ๋ ๋ฒจ ์ ์ฝ ์กฐ๊ฑด (์ปฌ๋ผ ์ ์ธ๋ง๋ค ์ ์ฝ์กฐ๊ฑด ์ง์ )
-- ์ ์ฝ ์กฐ๊ฑด ์๋ณ์๋ ์๋ต์ด ๊ฐ๋ฅํฉ๋๋ค. (์ค๋ผํด์์ ์์์ ์ด๋ฆ ์ง์)
CREATE TABLE dept (
dept_no NUMBER(2) CONSTRAINT dept_deptno_pk PRIMARY KEY,
dept_name VARCHAR2(14) NOT NULL CONSTRAINT dept_deptname_uk UNIQUE,
loca NUMBER(4, 0) CONSTRAINT dept_loca_locid_fk REFERENCES locations(location_id),
dept_bonus NUMBER(10) CONSTRAINT dept_bonus_ck CHECK(dept_bonus > 100000),
man_gender VARCHAR2(1) CONSTRAINT dept_gneder_ck CHECK(man_gender IN ('M', 'F'))
);
DROP TABLE dept;
-- ํ
์ด๋ธ ๋ ๋ฒจ ์ ์ฝ์กฐ๊ฑด (๋ชจ๋ ์ด ์ ์ธ ํ ์ ์ฝ์กฐ๊ฑด์ ํ๋ฒ์ ์ทจํ๋ ๋ฐฉ์)
CREATE TABLE dept (
dept_no NUMBER(2),
dept_name VARCHAR2(14) NOT NULL,
loca NUMBER(4),
dept_bonus NUMBER(10),
dept_gender VARCHAR2(1),
CONSTRAINT dept2_deptno_pk PRIMARY KEY(dept_no),
CONSTRAINT dept2_deptname_uk UNIQUE(dept_name),
CONSTRAINT dept2_loca_locid_fk FOREIGN KEY(loca) REFERENCES locations(location_id),
CONSTRAINT dept2_bonus_ck CHECK(dept_bonus > 100000),
CONSTRAINT dept2_gender_ck CHECK(dept_gender IN('M', 'F'))
);
-- ์ธ๋ ํค (foreign key)๋ ๋ถ๋ชจ ํ
์ด๋ธ(์ฐธ์กฐ ํ
์ด๋ธ)์ ์๋ ๊ฐ์ INSERTํ ์ ์์!
INSERT INTO dept
VALUES (20, 'bb', 2000, 1000000, 'F');
UPDATE dept
SET loca = 4000
WHERE dept_no = 10; -- ์คํจ (FK ์ ์ฝ์กฐ๊ฑด ์๋ฐ)
UPDATE dept
SET dept_no = 20
WHERE dept_no = 10; -- ์คํจ (PK ์๋ฐ)
UPDATE dept
SET dept_bonus = 4000
WHERE dept_no = 10; -- ์คํจ (CHECK ์๋ฐ)
SELECT * FROM dept;
-- ํ ํ
์ด๋ธ์์ ๋์ PK๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ์๋ ์ญ์ ๊ฐ ๋ง๋๋ก ์๋ฉ๋๋ค.
DELETE FROM locations
WHERE location_id = 1800;
-- ํ
์ด๋ธ ์์ฑ ์ดํ ์ ์ฝ์กฐ๊ฑด ์ถ๊ฐ ๋ฐ ๋ณ๊ฒฝ, ์ญ์
-- ์ ์ฝ์กฐ๊ฑด์ ์ถ๊ฐ, ์ญ์ ๋ง ๊ฐ๋ฅํฉ๋๋ค. ๋ณ๊ฒฝ์ ์๋ฉ๋๋ค.
-- ๋ณ๊ฒฝํ๋ ค๋ฉด ์ญ์ ํ๊ณ ์๋ก์ด ๋ด์ฉ์ผ๋ก ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.
CREATE TABLE dept2 (
dept_no NUMBER(2),
dept_name VARCHAR2(14) NOT NULL,
loca NUMBER(4),
dept_bonus NUMBER(10),
dept_gender VARCHAR2(1)
);
-- PK ์ถ๊ฐ
ALTER TABLE dept2
ADD CONSTRAINT dept2_deptno_pk PRIMARY KEY(dept_no);
-- UNIQUE ์ถ๊ฐ
ALTER TABLE dept2
ADD CONSTRAINT dept2_deptname_uk UNIQUE(dept_name);
-- FK ์ถ๊ฐ
ALTER TABLE dept2
ADD CONSTRAINT dept2_loca_locid_fk
FOREIGN KEY(loca) REFERENCES locations(location_id);
-- CHECK ์ถ๊ฐ
ALTER TABLE dept2
ADD CONSTRAINT dept2_bonus_ck CHECK(dept_bonus > 10000);
ALTER TABLE dept2
ADD CONSTRAINT dept2_gender_ck CHECK(dept_gender IN('M', 'F'));
-- NOT NULL์ ์ด ์์ ํํ๋ก ๋ณ๊ฒฝํฉ๋๋ค.
ALTER TABLE dept2
MODIFY dept_bonus NUMBER(10) NOT NULL;
-- ์ ์ฝ ์กฐ๊ฑด ํ์ธ
SELECT * FROM user_constraints
WHERE TABLE_name = 'DEPT';
-- ์ ์ฝ ์กฐ๊ฑด ์ญ์ (์ ์ฝ ์กฐ๊ฑด ์ด๋ฆ์ผ๋ก -> ์ด๋ฆ์ ์ง์ ์ง์ง ์์๋ค๋ฉด ์ค๋ผํด ๋ถ์ฌํ๋ค.
ALTER TABLE dept DROP CONSTRAINT dept2_bonus_ck;
/*
view๋ ์ ํ์ ์ธ ์๋ฃ๋ง ๋ณด๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฐ์ ํ
์ด๋ธ์ ๊ฐ๋
์
๋๋ค.
๋ทฐ๋ ๊ธฐ๋ณธ ํ
์ด๋ธ๋ก ์ ๋๋ ๊ฐ์ ํ
์ด๋ธ์ด๊ธฐ ๋๋ฌธ์
ํ์ํ ์ปฌ๋ผ๋ง ์ ์ฅํด ๋๋ฉด ๊ด๋ฆฌ๊ฐ ์ฉ์ดํด ์ง๋๋ค.
๋ทฐ๋ ๊ฐ์ํ
์ด๋ธ๋ก ์ค์ ๋ฐ์ดํฐ๊ฐ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ ์ฅ๋ ํํ๋ ์๋๋๋ค.
๋ทฐ๋ฅผ ํตํด์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ฉด ์๋ณธ ๋ฐ์ดํฐ๋ ์์ ํ๊ฒ ๋ณดํธ๋ ์ ์์ต๋๋ค.
*/
SELECT * FROM user_sys_privs;
-- ๋จ์ ๋ทฐ : ํ๋๋ทฐ์ ํ
์ด๋ธ์ ์ด์ฉํด์ ์์ฑํ ๋ทฐ
-- ๋ทฐ์ ์ปฌ๋ผ๋ช
์ ํจ์ ํธ์ถ๋ฌธ, ์ฐ์ฐ์ ๋ฑ ๊ฐ์ ํํ์์ด๋ฉด ์๋ฉ๋๋ค!
SELECT
employee_id,
first_name || ' ' || last_name,
job_id,
salary
FROM employees
WHERE department_id = 60;
CREATE VIEW view_emp AS (
SELECT
employee_id,
first_name || ' ' || last_name AS full_name,
job_id,
salary
FROM employees
WHERE department_id = 60
);
SELECT * FROM view_emp;
-- ๋ณตํฉ ๋ทฐ : ๋ ๊ฐ ์ด์์ ํ
์ด๋ธ์ ์กฐ์ธํด์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ๋ทฐ
-- ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๋ณต์ฌ์ฉํ์ง ์๊ณ ๋น ๋ฅธ ์กฐํ๋ฅผ ์ํด ์ฌ์ฉ. (์์ฐ์ฑ ์ฆ๊ฐ)
CREATE VIEW view_emp_dept_job AS (
SELECT
e.employee_id,
e.first_name || ' ' || last_name AS full_name,
d.department_name,
j.job_title
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.department_id
LEFT JOIN jobs j
ON e.job_id = j.job_id
)
ORDER BY e.employee_id;
SELECT * FROM view_emp_dept_job;
-- ๋ทฐ์ ์์ (CREATE OR REPLACE)
-- ๋์ผ ์ด๋ฆ์ผ๋ก ํด๋น ๊ตฌ๋ฌธ์ผ๋ก ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด์ ์๋กญ๊ฒ ์์ฑ๋๊ณ ,
-- ๊ธฐ์กด์ ์กด์ฌํ์ง ์์๋ค๋ฉด ์๋ก CREATE ๋ฉ๋๋ค.
CREATE OR REPLACE VIEW view_emp_dept_job AS (
SELECT
e.employee_id,
e.first_name || ' ' || last_name AS full_name,
d.department_name,
j.job_title,
e.salary
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.department_id
LEFT JOIN jobs j
ON e.job_id = j.job_id
)
ORDER BY e.employee_id;
SELECT
job_title,
AVG(salary) AS avg
FROM view_emp_dept_job
GROUP BY job_title
ORDER BY avg DESC; -- SQL๋ฌธ์ด ๊ฐ๊ฒฐํด์ง.
-- ๋ทฐ ์ญ์
DROP VIEW view_emp;
/*
VIEW์ INSERT๊ฐ ์ผ์ด๋๋ ๊ฒฝ์ฐ ์ค์ ํ
์ด๋ธ์๋ ๋ฐ์์ด ๋ฉ๋๋ค.
๊ทธ๋์ VIEW์ INSERT, UPDATE, DELETE์๋ ๋ง์ ์ ์ฝ ์ฌํญ์ด ๋ฐ๋ฆ
๋๋ค.
์๋ณธ ํ
์ด๋ธ์ด NOT NULL์ธ ๊ฒฝ์ฐ VIEW์ INSERT๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
VIEW์์ ์ฌ์ฉํ๋ ์ปฌ๋ผ์ด ๊ฐ์์ด์ธ ๊ฒฝ์ฐ์๋ ์๋ฉ๋๋ค.
*/
SELECT * FROM view_emp_dept_job;
-- ๊ฐ์์ด์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ INSERT ์๋จ!
INSERT INTO view_emp_dept_job
VALUES(300, 'test', 'test', 'test', 10000);
-- JOIN๋ ๋ทฐ( ๋ณตํฉ ๋ทฐ)์ ๊ฒฝ์ฐ์๋ ํ๋ฒ์ ์ฝ์
ํ ์ ์์ต๋๋ค.
INSERT INTO view_emp_dept_job
(employee_id, department_name, job_title, salary)
VALUES(300, 'test', 'test', 'test', 10000);
-- ์๋ณธ ํ
์ด๋ธ ์ปฌ๋ผ ์ค NOT NULL ์ปฌ๋ผ์ด ์กด์ฌํ๊ณ , ๊ทธ ์นผ๋ผ์
-- view์์ ์ง๋ชฉํ ์ ์๋ค๋ฉด INSERT๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
INSERT INTO view_emp
(employee_id, job_id, salary)
VALUES(300, 'test', 10000);
DELETE FROM view_emp_dept_job
WHERE employee_id = 107;
ROLLBACK;
-- WITH CHECK OPTION -> ์กฐ๊ฑด ์ ์ฝ ์ปฌ๋ผ
-- ๋ทฐ๋ฅผ ์์ฑํ ๋ ์ฌ์ฉํ ์กฐ๊ฑด ์ปฌ๋ผ์ ๋ทฐ๋ฅผ ํตํด์ ๋ณ๊ฒฝํ ์ ์๊ฒ ํด์ฃผ๋ ํค์๋
CREATE OR REPLACE VIEW view_emp_test AS (
SELECT
employee_id,
first_name,
last_name,
email,
hire_date,
job_id,
department_id
FROM employees
WHERE department_id = 60
)
WITH CHECK OPTION CONSTRAINT view_emp_test_ck;
SELECT * FROM view_emp_test;
UPDATE view_emp_test
SET department_id = 100
WHERE employee_id = 107;
-- ์ฝ๊ธฐ ์ ์ฉ ๋ทฐ -> SELECT๋ง ํ์ฉ, DML ์ฐ์ฐ์ ๋ง์
CREATE OR REPLACE VIEW view_emp_test AS (
SELECT
employee_id,
first_name,
last_name,
email,
hire_date,
job_id,
department_id
FROM employees
WHERE department_id = 60
)
WITH READ ONLY;
-- ์ํ์ค (์์ฐจ์ ์ผ๋ก ์ฆ๊ฐ, ๊ฐ์ํ๋ ๊ฐ์ ๋ง๋ค์ด ์ฃผ๋ ๊ฐ์ฒด)
CREATE SEQUENCE test_seq
START WITH 1 -- ์์๊ฐ (๊ธฐ๋ณธ๊ฐ ์ฆ๊ฐํ ๋ ์ต์๊ฐ, ๊ฐ์ํ ๋ ์ต๋๊ฐ)
INCREMENT BY 1 -- ์ฆ๊ฐ๊ฐ (๊ธฐ๋ณธ๊ฐ 1, ์์๋ ์ฆ๊ฐ, ์์๋ ๊ฐ์)
MAXVALUE 10 -- ์ต๋๊ฐ (๊ธฐ๋ณธ๊ฐ 1027, ๊ฐ์์ผ ๋๋ -1)
MINVALUE 1 -- ์ต์๊ฐ (๊ธฐ๋ณธ๊ฐ ์ฆ๊ฐ์ผ ๋ 1, ๊ฐ์์ผ ๋ -1028)
NOCACHE -- ์บ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ์ฌ๋ถ
NOCYCLE; -- ์ํ ์ฌ๋ถ (๊ธฐ๋ณธ ๊ฐ NOCYCLE)
CREATE TABLE test_tbl (
test_id NUMBER(2) PRIMARY KEY,
test_msg VARCHAR2(100)
);
INSERT INTO test_tbl
VALUES(test_seq.NEXTVAL, 'test'); -- INSERT ์คํ ์ ์ํ์ค์ ๋ค์ ๊ฐ ํ์ฉ.
SELECT * FROM test_tbl;
SELECT
test_seq.CURRVAL
FROM dual;
-- ์ํ์ค ์์ฑ ์์
-- START WITH์ ์์ ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
ALTER SEQUENCE test_seq MAXVALUE 9999;
ALTER SEQUENCE test_seq INCREMENT BY -5;
DROP SEQUENCE test_seq;
-- ์ฌ์ฉ์ ๊ณ์ ํ์ธ
SELECT * FROM all_users;
-- ๊ณ์ ์์ฑ ๋ช
๋ น
CREATE USER user1 IDENTIFIED BY user1;
/*
DCL: GRANT(๊ถํ ๋ถ์ฌ), REVOKE(๊ถํ ํ์)
CREATE USER -> ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ ์์ฑ ๊ถํ
CREATE SESSION -> ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ ๊ถํ
CREATE TABLE -> ํ
์ด๋ธ ์์ฑ ๊ถํ
CREATE VIEW -> ๋ทฐ ์์ฑ ๊ถํ
CREATE SEQUENCE -> ์ํ์ค ์์ฑ ๊ถํ
ALTER ANY TABLE -> ์ด๋ ํ ํ
์ด๋ธ๋ ์์ ํ ์ ์๋ ๊ถํ
INSERT ANY TABLE -> ์ด๋ ํ ํ
์ด๋ธ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์
ํ๋ ๊ถํ.
SELECT ANY TABLE...
SELECT ON [ํ
์ด๋ธ ์ด๋ฆ] TO [์ ์ ์ด๋ฆ] -> ํน์ ํ
์ด๋ธ๋ง ์กฐํํ ์ ์๋ ๊ถํ.
INSERT ON....
UPDATE ON....
- ๊ด๋ฆฌ์์ ์คํ๋ ๊ถํ์ ๋ถ์ฌํ๋ ๊ตฌ๋ฌธ.
RESOURCE, CONNECT, DBA TO [์ ์ ์ด๋ฆ]
*/
GRANT CREATE SESSION TO user1;
GRANT SELECT ON hr.departments TO user1;
GRANT RESOURCE, CONNECT, DBA TO user1;
-- REVOKE FROM -> ๊ถํ ํ์
REVOKE RESOURCE, CONNECT, DBA FROM user1;
-- ROLE: ํน์ ๊ถํ์ ๋ชจ์. ์ผ๊ด์ ์ผ๋ก ๊ถํ์ ๋ถ์ฌํ๊ฑฐ๋ ํ์ํ๊ธฐ ์ํด ์ฌ์ฉ.
CREATE ROLE new_emp_role;
GRANT SELECT, UPDATE ON hr.employees TO new_emp_role;
GRANT new_emp_role TO user1;
-- ๊ณ์ธตํ ์ฟผ๋ฆฌ
-- START WITH : ๊ณ์ธต์ ์ฒซ ๋จ๊ณ๋ฅผ ์ด๋์ ์์ํ ๊ฒ์ธ์ง์ ๋ํ ์กฐ๊ฑด
-- CONNECT BY PRIOR ์์ = ๋ถ๋ชจ -> ์๋ฐฉํฅ ํ์
-- CONNECT BY ์์ = PRIOR ๋ถ๋ชจ -> ์ญ๋ฐฉํฅ ํ์
-- ORDER SIBLINGS BY : ๊ฐ์ ๋ ๋ฒจ๋ผ๋ฆฌ์ ์ ๋ ฌ์ ์ ํจ.
SELECT
employee_id,
first_name,
manager_id
FROM employees;
SELECT
employee_id,
first_name,
manager_id,
LEVEL, -- ๊ณ์ธต ๊น์ด๋ฅผ ๋ํ๋ด๋ ํค์๋
SYS_CONNECT_BY_PATH(first_name, '/') AS ๊ณ์ธต๊ตฌ์กฐ
FROM employees
START WITH manager_id IS NULL -- ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ต์์ ๊ด๋ฆฌ์๋ถํฐ ์์ํ๋ค.
CONNECT BY PRIOR employee_id = manager_id -- ํ ์ง์์ manager_id๊ฐ ์์ ์ง์์ employee_id์ ์ผ์นํ๋ ๊ฒฝ์ฐ ๋ถ๋ชจ - ์์ ๊ด๊ณ๋ฅผ ํ์ฑํ๊ฒ ๋ค.
AND LEVEL <= 2 -- ํน์ ๊น์ด๊น์ง๋ง ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์.
ORDER SIBLINGS BY first_name;
SELECT
LEVEL,
LPAD(' ', 2*(LEVEL-1)) || first_name AS ์กฐ์ง์ธ์,
employee_id,
manager_id
FROM employees
START WITH employee_id = 107
CONNECT BY employee_id = PRIOR manager_id;
SELECT * FROM employees;
-- 103๋ฒ ์ง์์ ๋ชจ๋ ๋ถํ์ง์ ์ฐพ๊ธฐ
SELECT
LEVEL,
LPAD(' ', 2*(LEVEL-1)) || first_name AS ์กฐ์ง์ธ์,
salary
FROM employees
START WITH employee_id = 103
CONNECT BY PRIOR employee_id = manager_id;
-- ROLLUP(arg1, arg2) -> arg1๊ณผ arg2๋ก ๊ทธ๋ฃนํ. -> ๊ฐ ๊ทธ๋ฃน๋ณ SUM(salary)
-- -> arg1 ๊ทธ๋ฃน์ SUM(salary) -> ๋ง์ง๋ง์๋ ์ ์ฒด SUM(salary)
-- ํน์ ์ปฌ๋ผ๋ค์ ๋จ๊ณ์ ํฉ๊ณ๋ฅผ ๊ณ์ฐ.
-- ๋ถ์๋ณ ๊ธ์ฌ ํฉ๊ณ
-- ๋ถ์์ ์ง๋ฌด ์กฐํฉ๋ณ ๊ธ์ฌ ํฉ๊ณ
-- ์ ์ฒด ๊ธ์ฌ ํฉ๊ณ
SELECT
department_id,
job_id,
SUM(salary) AS total_salary
FROM employees
GROUP BY ROLLUP (department_id, job_id)
ORDER BY department_id;
-- CUBE(arg1, arg2): ๋ชจ๋ ๊ฐ๋ฅํ ์กฐํฉ์ ๊ณ ๋ คํ์ฌ ์ง๊ณ.
-- ์ง๋ฌด๋ณ ๊ธ์ฌ ํฉ๊ณ
-- ๋ถ์๋ณ ๊ธ์ฌ ํฉ๊ณ
-- ๋ถ์์ ์ง๋ฌด ์กฐํฉ๋ณ ๊ธ์ฌ ํฉ๊ณ
-- ์ ์ฒด ๊ธ์ฌ ํฉ๊ณ
SELECT
department_id,
job_id,
SUM(salary) AS total_salary
FROM employees
GROUP BY CUBE (department_id, job_id)
ORDER BY department_id;
-- GROUPING SETS(arg1, arg2): ์ฃผ์ด์ง ๊ทธ๋ฃน ์งํฉ์ ๋ํด์๋ง ์ง๊ณ
-- ์ง๋ฌด๋ณ ๊ธ์ฌ ํฉ๊ณ
-- ๋ถ์๋ณ ๊ธ์ฌ ํฉ๊ณ
SELECT
department_id,
job_id,
SUM(salary) AS total_salary
FROM employees
GROUP BY GROUPING SETS (department_id, job_id)
ORDER BY department_id;
-- GROUPING(): ์ด ํจ์๊ฐ ์ง์ ๊ทธ๋ฃน ์ง๊ณ๋ฅผ ํ์ง๋ ์์.
-- ๊ฒฐ๊ณผ์์ ํน์ ์ด์ด ์ง๊ณ๊ฐ ๋์๋์ง์ ์ฌ๋ถ๋ฅผ ํ์ธํ์ฌ ๊ฐ์ ์์๋ก ์ง์ด ๋ฃ์๋ ์ฌ์ฉ.
-- ROLLUP, CUBE, GROUPING SETS์์ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅ.
SELECT
CASE GROUPING(department_id) WHEN 1 THEN 0 ELSE department_id END AS dept_id,
CASE GROUPING(job_id) WHEN 1 THEN 'job_total' ELSE job_id END AS job_id,
SUM(salary) AS total_salary
FROM employees
GROUP BY CUBE (department_id, job_id);
ํ๊ณ
1. ์ ๋ฐ์ ์ธ ๋๋์
- SQL์ ์ฒ์ ์ ํด์ ์ฒ์์ ๋ง์ด ์ด๋ ค์์ด ์์์ง๋ง, ๊ฐ์ฌ๋์ ๋์๊ณผ ์กฐ๊ธ์ฉ ๋ณต์ต ๋๋ถ์ ์ด๋์ ๋ ์ดํด ํ ์๊ฐ ์์๋ค.
- ํ์ง๋ง ์์ง ์๋ธ ์ฟผ๋ฆฌ ๋ฑ์ ์ดํด๊ฐ ๊ฐ์ง ์๋ ๋ช๋ช ๋ฌธ๋ฒ์ ์ง์ค์ ์ผ๋ก ๋ณต์ตํ ํ์์ฑ์ ๋๊ผ๋ค.
2. ์ข์๋ ์
- ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ์กฐํ, ์ฝ์ , ์ญ์ , ๋ณ๊ฒฝ๋ค์ ์ตํ๊ณ , ์ง์ ํ ์ด๋ธ์ ๋ง๋ค์ด ์ปค์คํ ์ ํ ์ ์๋ ๋ฅ๋ ฅ์ ํค์ธ ์ ์์ด์ ์ข์๋ค.
3. ์์ฌ์ ๋ ์
- ์์ง ๋ช๋ช ๋ฌธ๋ฒ๋ค์ ์ดํดํ์ง ๋ชปํ๋ ์ , ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํ ๋ ์์ ์๋ฐ๋ฅผ ์ด์ฉํด์ ํ๋ฉด ๋ ์ฌ์ ์ ํ ๋ฐ ์ด์ฉํ์ง ๋ชปํ๋ ๊ฒ์ด ๋ง์ด ์์ฌ์ ๋ค.
4. ๊ฐ์ ํ ์
- ํญ์ ๋๋ผ๋ ์ ์ด์ง๋ง, ์์ ์ ์งํํ๊ณ ๋๋ฉด ๋ถ์กฑํ๊ฑฐ๋ ์ดํด๊ฐ ๊ฐ์ง ์๋ ๊ฒ์ ์ฑ์์ผ ํ ๊ฒ ๊ฐ๋ค.
- ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์๋ฅผ ์กฐ๊ธ ๋ ๋๋ ค์ผ ๊ฒ ๋ค๋ ์๊ฐ์ ํ๊ฒ ๋จ.
5. ๋ค์์ฃผ ๊ณํ
- ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ๊ธฐ
- ์ด๋ฒ์ ๋ฐฐ์ด SQL ๋ณต์ต
0