package com.test.memo;
import java.util.stream.IntStream;
import java.util.stream.Stream;
class Organize {
public static void main(String[] args) {
IntStream.of(11, 22, 33, 44).forEach(s -> System.out.print(s + " "));
System.out.println();
Stream.of("So Simple").forEach(System.out::println);
Stream.of("Toy", "Robot", "Box").forEach(s -> System.out.print(s + " "));
}
}
//11 22 33 44
//So Simple
//Toy Robot Box
package com.test.memo;
import java.util.stream.IntStream;
class Organize {
public static void main(String[] args) {
IntStream.of(7, 5, 3).forEach(s -> System.out.print(s + " "));
System.out.println();
IntStream.range(5, 8).forEach(s -> System.out.print(s + " "));
System.out.println();
IntStream.rangeClosed(5, 8).forEach(s -> System.out.print(s + " "));
}
}
//7 5 3
//5 6 7
//5 6 7 8
package com.test.memo;
import java.util.function.BinaryOperator;
import java.util.stream.Stream;
class Organize {
public static void main(String[] args) {
BinaryOperator<String> bo = (s1, s2) -> {
if (s1.length() > s2.length())
return s1;
return s2;
};
String s1 = Stream.of("Box", "Simple", "Complex", "Robot").parallel().reduce("", bo);
System.out.println(s1);
}
}
//Complex
package com.test.memo;
import java.util.stream.Stream;
class Organize {
public static void main(String[] args) {
Stream<String> s1 = Stream.of("Cake", "Milk");
Stream<String> s2 = Stream.of("Lemon", "Jelly");
Stream.concat(s1, s2).forEach(s -> System.out.print(s + " "));
}
}
//Cake Milk Lemon Jelly
다음 문자열을 요소로 가지고 있는 스트림을 생성하고, 알파벳 순으로 정렬한 후, 전체요소를 출력하자.
"Box", "Apple", "Robot"
다음 문자열을 요소로 가지고 있는 스트림을 생성하고, 문자열의 길이순으로 정렬한 후, 전체요소를 출력하자.
"Box", "Apple", "Rabbit"
package com.test.memo;
import java.util.stream.Stream;
class Organize {
public static void main(String[] args) {
Stream.of("Box", "Apple", "Robot").sorted((s1, s2)
-> s1.compareTo(s2)).forEach(s -> System.out.print(s + " "));
System.out.println();
Stream.of("Box", "Apple", "Rabbit").sorted((s1, s2)
-> s1.length() - s2.length()).forEach(s -> System.out.print(s + " "));
}
}
//Apple Box Robot
//Box Apple Rababit
Box Robot
package com.test.memo;
import java.util.stream.DoubleStream;
import java.util.stream.IntStream;
class Organize {
public static void main(String[] args) {
IntStream.of(3, 9, 4, 2).sorted().forEach(s -> System.out.print(s + " "));
System.out.println();
DoubleStream.of(3.3, 6.2, 1.5, 8.3).sorted().forEach(s -> System.out.print(s + " "));
}
}
//2 3 4 9
//1.5 3.3 6.2 8.3
package com.test.memo;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
class Organize {
public static void main(String[] args) {
Stream<String> str = Stream.of("Hello", "Box", "Robot", "Toy");
List<String> ls = str.filter(s -> s.length() < 5).collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
System.out.println(ls);
}
}
//[Box, Toy]
현재 사용자 확인 : select user();
현재 선택 중인 db확인 : select database();
화면 지우기 : system cls
주석 : # , /* */ , --
해당 사용자(root)의 정보 조회 : select user, authentication_string, file_priv from mysql.user where user = 'root';
authentication_string : 인증 문자열
file_priv : 파일 권한 >> 아래 컬럼으로 확인하고싶은 권한 넣으면 됌
사용자 항목에 host까지 보기 : select user, host from mysql.user;
db테이블에서 사용자 , 호스트, db보기 : select host, db, user, select_priv from mysql.db;
mysql.user 테이블의 컬럼 설명
Data Difinition language : 테이블을 관리하는 데이터 정의 언
항상 유일한 열, 열의 집합 >> 각 행을 고유하게 식별하기 위함
null값이 허용되지 않는다.
각 테이블에는 오직 하나의 기본 키만 정의할 수 있다. : 기본 키 열 목록에서 열의 이름은 한번만 나타나야 한다.
테이블에서 여러 개의 열을 사용해 기본 키를 정의할 수 있다. : 복합키 (composite key) >> 각각의 값이 고유한지를 알기 위해서 이 복합키가 기본키가 될 수 있음
복합키를 사용하더라도, 이 중 하나의 키를 기본키로 지정해야 한다. 나머지는 후보기(cardidate key)가 된다.
create table diplomas
(
course varchar(20) not null, #과목명
professor varchar(10) not null, #교수
cou_num int(2), #과목 인원
end_date date not null, #과목 개설 일자
primary key(course, professor, end_date)
);
3개의 열을 사용해 기본 키를 정의하며 학생은 지정된 일자에 한 과목에 대해 취득할 수 있다. >> primarykey는 not null을 명시하지 않아도, null이면 안되고, 3개를 합친 값이 고유해야 한다.
haksa라는 db생성 >> sakila나 world는 샘플 DB
insa테이블 생성
auto_increment >> unique / not null의 성질을 지니고 있다.(자동증가가 되게끔 한다.) >> 데이터를 넣을때는 null값으로 넣으면 됌
not null > null을 주지 않는다는 의미
데이터 삽입
전체데이터를 만들때 컬럼의 순서로 삽입할때 컬럼명을 생략할 수 있다.
부분데이터를 넣게되면 컬럼명을 생략할 수 없다. 부분 데이터를 넣을경우, 해당 컬럼명을 insert into ~ 에 넣고 values ~ 데이터를 넣어야한다.
Commit / Rollback 작업
Commit : 변경된 데이터를 DB에 적용시킨다.
Rollback : 변경된 데이터를 취소싴니다. 직전에 Commit이 수행된 시점까지 취소
autocommit상태 보기
select @@autocommit;
show variables like 'autocommit'; >> on은 활성화, off는 비활성화
insa테이블의 내용 변경 update 테이블 명 set 바뀔 where 바꿀 행 ;
savepoint / truncate 작업
savepoint 는 변경된 지점(저장점)의 위치를 저장
저장점을 저장하고, insert, delete, update작업을 수행하고 rollback to 저장점 하면 그 위치까지 다시 복구시킬 수 있다.
savepoint aa; > point지정
행삭제하고
rollback to aa; >> aa가지 복구 그럼 삭제했던게 복구됌
truncate 작업 : 저장공간과 내용(모든 행이 삭제)까지 다 삭제하고 틀만 남긴다. >> rollback이 불가능
작업 후에는 복구가 되지 않는다.
delete는 내용만 날리고 테이블 용량은 줄어들지 않는다. 후에 잘못 삭제한것을 되돌릴 수 있다,
truncate는 용량과, 내용까지 모두 삭제해 후에 잘못 삭제한 것을 되돌릴 수 없다.
SQL 데이터형
숫자 데이터형
int > 정수
float(m, d) > 실수
m은 소수 부분을 포함한 실수의 총 자릿수, d는 소수 부분의 자릿수
문자 데이터형
날짜 데이터형
select now() 하면 현재 시간 출력새로운 haksa DB생성
파일을 C드라이버에 따로 저장해서 mysql에서 use haksa_database; 하고, c드라이브에 저장한 파일 중 하나를 불러온다.
\. c:\sql\table.sql > query ok 가 뜨면, show tables; 해서 확인view : 가상테이블 > 저장공간을 차지하지 않는다. table처럼 활용
create view ages(stu_no, stu_name, age) as select stu_no, stu_name, year(now())-birth_year+1 from student; : ages라는 뷰를 주고 컬럼으로 인자 안 이름을 주고 as select 뒤에는 값
select * from ages; 해서 확인하면 view가 table처럼 출력되고, 저장되어 있지는 않고 가상 테이블로서 그때그때 바로 읽어오는 것이다.
반복되는 명령문이나 루틴(routine)을 간단히 사용하고자 할 때,
테이블의 출력 방법을 재구성하고자 할 때,
여러 단계에서 select 명령문이 사용될 때,
데이터를 보호하고자 할 때
새로운 유저 생성 및 확인
create user choi identified by 'choi123'; > choi라는 유저 생성
select user, host from mysql.user; > 현재 user 목록 생성

[실습 따라하기]
MySQL 접속하기
MySQL 새로운 데이터베이스 생성
생성된 Database 확인
생성된 Database 사용하기 위해 데이터베이스 변경
[실습 따라하기]
insa 테이블 만들기
create table insa(
bunho int auto_increment,
name char(8) not null,
e_name char(10) not null,
town char(6) not null,
primary key(bunho)
);
auto_increment : n++ 처럼 자동으로 고유한 정수값을 할당한다. 새로운 레코드가 추가될 때 마다 이전 레코드보다 1씩 증가된다. >> 고유한 식별자 역할을 하는것, (데이터의 무결성 유지)
테이블을 생성할 때 기본 키(primary key)를 설정하려면 키워드 primary key 를 사용해 열의 정의하는 부분 뒤에 따로 기술한다.
기본 키 : bunho열의 값은 고유하고, null값이 허용되지 않는다.
데이터 삽입
데이터 삽입
데이터 삽입
데이터 삽입
데이터 삽입
insert into insa(name, e_name, town) values('배트맨', 'batman', '고담');
auto_increment로 주고, primary key 로 줬기 때문에 꼭 bunho에 값을 입력하지 않고, insert into insa(name, e_name, town) values('제갈공명', 'je', '여수'); 이렇게 입력하면 buho에는 자동으로 이전 레코드보다 1씩 증가된 값이 자동으로 들어간다.
[실습 따라하기]
주의사항으로 MySQL은 명령어를 실행하면 자동(Default)으로 Commit를 하게 되어 있다. 우선 AutoCommit를 하지 않도록 한다.
set autocommit = 0;
autocommit 상태 보기
select @@autocommit;
1은 활성화 0은 비활성화
또는
show variables like 'autocommit';
on은 활성화 off는 비활성화
"insa"테이블의 내용 변경 : 번호 4번 도시(TOWN)을 한산도로 변경
update insa
set town = '한산도'
where bunho = 4;
변경된 "insa" 테이블 질의
변경된 데이터 복구작업 : Rollback
rollback;
select * from insa;
"insa" 테이블 내용 변경 도시(town)가 '여수'인 데이터를 '대구'로 변경
"insa" 테이블 내용 데이터베이스에 저장 : Commit
변경된 데이터 복구작업 : Rollback(복구가 되지 않음) >> 위에서 db에 저장했으니까 commit;
rollback;
savepoint
savepoint 는 변경된 지점(저장점)의 위치를 저장한다.
Rollback to 저장점 을 수행하면 그 위치까지 다시 복구시킬 수 있다.truncate
데이터베이스에서 테이블의 모든 행을 삭제하는 SQL 문이다.
테이블의 데이터가 삭제되지만 테이블의 구조는 그대로 유지되고,
DELETE문과 비교하면TRUNCATE는 보다 빠르고 효율적으로 테이블의 데이터를 삭제한다.

[실습 따라하기]
MySQL 접속하기
MySQL 새로운 데이터 베이스 생성
생성된 Database 확인
사용자 생성 및 권한 부여(haksa_admin에 비밀번호 1234로 모든 권한)
CREATE USER haksa_admin IDENTIFIED BY '1234'; > 생성
(또는 CREATE USER 'haksa_admin'@'%' IDENTIFIED BY '1234';)
GRANT ALL PRIVILEGES ON haksa_database.* TO 'haksa_admin'@'%' WITH GRANT OPTION; > 권한 부여
위에서 생성한 haksa_admin으로 haksa_database에 접속하자.
MySQL 접속하기
mysql -u haksa_admin -p haksa_database테이블 생성 - 파일로 실행
MySQL에서 파일을 실행시키는 명령은 아래와 같다.
mysql> \. [path]\[filename]
\. C:\sql\table.sql> 내 컴퓨터 실행 명령
[실습 따라하기]
학사관리 테이블 생성(SQL 명령어 사용)
MySQL 접속하기
table.sql 파일을 이용한 데이터 삽입
SQL 파일을 c:\sql 이라는 폴더로 복사한다.
mysql>\. c:\sql\table.sqlMySQL 에 데이터베이스로 바로 접속하기
mysql -u haksa_admin -p haksa_databasedata.sql 파일을 이용한 data 삽입
mysql>\. c:\sql\data.sql > Query OK
정상적으로 테이블과 데이터가 들어간 것을 볼 수 있다.
select * from attend하게되면

order by(정렬) <> where절과 함께 쓰일 수 있는데, where절이 order by절 보다 먼저 쓰여야 한다.
정렬 기준은 한개의 열이 아닌, 여러개 열로 지정 가능하다. 각 열의 정렬을 다르게 설정도 가능 Ex) order by stu_no, stu_name desc; 처럼 한 열은 오름, 만약 stu_no가 같다면 stu_name에서 비교해 내림으로 출력할 수 있다.
Limit : 출력하는 개수를 제한한다. 형식은 Limit 시작, 개수이다. limit 3만 쓰면 limit 0, 3과 동일하다. (0번째 부터 3개 출력)
ex) order by 로 정렬시킨 후 원하는 출력 열의 개수를 제한해서 출력할 때 사용한다.(order by절 보다 뒤에 사용)
distinct는 중복을 제거하는 함수다. select 뒤 열 이름 앞에 붙이면, 중복된 값은 1개만 출력된다.
ex) select distinct grade from student;
STUDENT 테이블로부터 성별이 남자인 각 학생의 학번, 이름, 영문이름, 학년, 주민등록번호를 영문이름 순서로 출력하라.
mysql> select stu_no, stu_name, stu_ename, grade, id_num from student where substring(id_num, 8, 1)=1 order by stu_ename;
order by 는 오름차순(asc)으로 할건지 내림차순(desc)로 할건지 정렬할 때 사용한다. 디폴트가 asc이므로, 위처럼 생략가능하다.
substring함수는 문자열에서 지정된 위치에서 시작하여, 지정된 길이의 부분 문자열을 반환하는 함수다. 위에서는 id_num열에서 8번째 문자에서 1개의 문자만가져와 =1과 비교하는것이다. >> 8번째 문자에서 1개의 문자만 가져와 =1인 경우의 행만 출력(성별이 남자인 행만 출력이니까 )
(select stu_no, stu_name, stu_ename, grade, id_num from student where substring(id_num, 8, 1)=1 order by stu_ename asc;) > asc는 stu_ename을 기준으로 오름차순 정렬 (생략 가능)
학년이 1학년이고 성별이 남자인 각 학생의 학번과 이름을 출력하는데, 출력 순서는 학번 내림차순이다.
select stu_no, stu_name from student where grade = 1 and substring(id_num,8,1)=1 order by stu_no desc;
교과목 테이블에 관한 모든 정보를 출력하라
select * from subject;교과목 중 운영체제의 생성년도를 2006년으로 변경하라.
update subject set create_year = '2006' where sub_name = '운영체제';교과목 테이블에서 교과목코드, 교과목명, 교과목 영문이름, 생성년도를 생성년도를 오름차순으로 출력하라.
select sub_code, sub_name, sub_ename, create_year from subject;alter table [테이블명] modify [컬럼명][바꿀 자료형]
diplomas 테이블의 sex 열의 길이를 2에서 4로 증가시켜라.
alter table diplomas modify sex char(4);diplomas 테이블에서 sex의 자료형을 char에서 int로 변경하라
alter table diplomas modify sex int;자료형의 변경에 있어서 테이블에 기본키로 정의되어 있지 않은 열이 중복된 값을 가지고 있지 않을 때 기본 키의 추가가 허용된다.
alter table 테이블 이름 add primary key(professor)테이블의 내용을 제거할 때 행(ROW) 단위로 이루어진다.
만약에 "SAMPLE"이라는 테이블의 모든 행을 삭제한다면 DELETE FROM SAMPLE; 이렇게 쓰인다.
테이블의 명세표, 인덱스, 부여된 권한 등 환경 테이블 정보 자체를 삭제하고 싶다면 Drop 명령어를 사용한다.
DROP TABLE SAMPLE;create table [새로 만들 테이블 이름] (새로 붙일 컬럼명 - 생략가능) as select [복사할 컬럼] from [복사할 테이블 이름]
student 테이블과 동일한 테이블 구조와 데이터를 가지고 있는 student1 테이블을 복사하라
create table student1 as select * from student;
확인 : desc student1;
post 테이블에서 post_no와 post_address로 구성된 신규 post1 테이블을 생성하라
create table post1 as select post_no, post_address from post;
확인 : desc post1;
post1 테이블의 모든 열을 조회하라.
select * from post1;뷰, 시퀀스 등 mysql객체의 이름 변경 가능 >> alter table ~ rename~
"post1" 테이블을 "test_post" 테이블명으로 변경하라.
alter table post1 rename test_post;쿼리 결과를 저장하지 않고 결과를 기반으로 가상의 테이블을 생성하는 논리적인 데이터베이스 객체다.
뷰는 ALTER문을 사용하여 변경할 수 없으므로 필요한 경우는 삭제한 후 재생성한다.
가상 테이블 : 뷰는 데이터를 저장하지 않고 쿼리 결과를 기반으로 가상의 테이블을 생성한다.(물리적으로 저장되어 있지 않음) >> 사용자에게 접근이 허용된 자료만을 제한적으로 보여줄 수 있다.
데이터 무결성: 뷰를 통해 접근하면 원본 테이블에 대한 데이터 무결성을 유지할 수 있습니다.
복잡한 쿼리 간소화: 복잡한 쿼리를 간소화하고 가독성을 높이는 데 사용할 수 있습니다.
동적 업데이트: 일부 뷰는 데이터를 직접 수정할 수 있지만, 대부분의 경우 뷰는 읽기 전용입니다.
특징
장단점
장점
단점
5. 독립적인 인덱스를 가질 수 없다.
6. ALTER VIEW문을 사용할 수 없다. 즉 뷰의 정의를 변경할 수 없다.
7. 뷰로 구성된 내용에 대한 삽입, 삭제, 갱신, 연산에 제약이 따른다.
생성
create view ~ as select문
CREATE VIEW 뷰이름 AS
SELECT 컬럼1, 컬럼2, ...
FROM 테이블이름
WHERE 조건;
CREATE VIEW 뷰이름(컬럼 이름1, 이름 2, 이름 3 ) AS
SELECT 컬럼1, 컬럼2, ... // >> 컬럼 이름 수와 맞게
FROM 테이블이름
WHERE 조건;
삭제
DROP VIEW 뷰이름 RESTRICT or CASCADE
Restrict : 뷰를 다른곳에서 참조하고 있으면 삭제가 취소
Cascade : 뷰를 참조하는 다른 뷰나 제약 조건까지 모두 삭제
view 항목 보기
show full tables : 만들어진 테이블과 뷰를 한번에 볼 수 있다.
show full tables in 데이터베이스 이름 : 특정 데이터베이스의 뷰만 확인
describe 뷰이름 : 뷰의 컬럼 및 세부 데이터형 볼 수 있다.
SHOW FULL TABLES IN 디비명 WHERE TABLE_TYPE LIKE 'VIEW'; : 해당 데이터베이스 안에 타입이 view인 항목 모두 보기
SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_TYPE LIKE 'VIEW' AND TABLE_SCHEMA LIKE 'haksa_database';
[실습하기]
학적 테이블의 학번, 이름, 출생년도, 나이를 출력하라.
select stu_no, stu_name, birth_year "출생년도", year(now()) - birth_year+1 "나이" from student;
"" : 쌍따옴표를 이용해 별칭을 지정했다.(원하는 컬럼명 뒤에 붙이면 별칭으로 지정되서 출력)
now() : 현재 날짜와 시간을 반환하는 내장함수다. 시스템의 현재 날짜와 시간을 사용한다.
year() : now()함수의 값은 dateTime형식이므로, now() 반환 값에서 year() 함수를이용해 현재 연도를 추출해 계산할 수 있다.
year(now()) - birth_year+1 : 현재 년도 - 컬럼의 생년일 + 1( 한국은 태어나자마자 1살이니까)학적 테이블의 학번, 이름, 나이로 구성된 AGES 뷰 테이블을 생성하라.
create view ages(stu_no, stu_name, age) as select stu_no, stu_name, year(now())-birth_year+1 from student;

서울고객이라는 뷰를 삭제해라
DROP VIEW 서울고객 RESTRICT;student 테이블에 있는 모든 데이터를 가지고 studentInfo1이라는 view를 만든다.
CREATE VIEW studentInfo1 AS SELECT * FROM student;student 테이블에 있는 stu_no, stu_name을 가지고 studentInfo2라는 view를 만든다.
CREATE VIEW studentInfo2 AS SELECT stu_no, stu_name from student;student 테이블에 있는 stu_no, stu_name을 각각 '학번', '이름' 이라는 컬럼명으로 studentInfo3라는 view를 만든다.
CREATE VIEW studentInfo3 (학번, 이름) AS SELECT stu_no, stu_name from student;studentInfo1 view를 삭제한다.studentInfo2, studentInfo3 view를 삭제한다.
DROP VIEW studentInfo1;
DROP VIEW studentInfo2, studentInfo3; : 한번에 여러개 삭제 가능
select user(); : 하게 되면 내가 현재 사용하는 계정을 보여준다.
유저[root] 패스워드 변경
ALTER user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '변경할 비밀번호';사용자 생성 및 권한 부여
MySQL에서 사용자를 생성하는 방법은 command 방법과 GUI 방법(MySQL Administrator)이 있다.
비밀번호 변경 : alter user sky identified with mysql_native_password by '5678';
1) create 문으로 user 생성하기
create user 사용자명 identified by '비밀번호';
(1) create 문을 사용하여 새로운 사용자 "choi"를 암호(password) "choi123"으로 생성해 보자.
(2) create 문을 사용하여 새로운 사용자 "lee@localhost"를 암호(password) "lee123" 으로 생성해 보자.
(3) "user" 테이블에서 새로이 생성된 사용자를 확인하기 위해 호스트명, 사용자, 비밀번호를 출력해 보자.
select host, user, authentication_string from mysql.user; : mysql데이터베이스에서 현재 사용자에게 할당된 권한을 조회
로컬 호스트 : mysql서버와, 클라이언트 모두 동일한 컴퓨터에서 실행 > 로컬 시스템에서만 연결을 허용
원격 : 로컬시스템이 아닌 다른 컴퓨터로, 다른 컴퓨터에 위치해 원격으로 접속 가능
% : 모든 호스트를 의미, 원격, 로컬 클라이언트 모두 포함
2) 사용자 권한 부여
grant all privileges on 데이터베이스명.* to 사용자명;
grant 부여할 권한 SQL 명령문 on 데이터베이스명. * to 사용자명;
(1) grant select, insert, update, delete on haksa. * to lee@localhost;
'lee'에게 'haksa' 데이터베이스를 select, insert, update, delete 할 수 있는 권한을 부여
(2) grant all privileges on haksa. * to choi;
사용자 'choi'에게 'haksa' 데이터베이스를 관리할 수 있는 모든 권한을 부여(3) grant all privileges on . to lee@localhost;
(3) grant all privileges on *.* to lee@localhost;
사용자 'lee'는 모든 데이터베이스를 모든 권한을 가지고 관리할 수 있도록 권한을 부여하였으므로 DBA의 권한을 부여한 것과 같다.
3) 사용자 권한 회수- revoke
revoke priv_type [(column_list)],priv_type[(column_list)]...]
on tbl_name ||*.|db_name. * from user_name [, user_name ...]
revoke SQL 명령문 on DB명. * from '해당유저이름';
(1) 사용자 "choi"을 "haksa" 데이터베이스에서 select 할 수 있는 권한을 회수해보자.
revoke select on haksa. * from choi@'%';
(2) 사용자 "lee@localhost"을 "haksa" 데이터베이스에서 select, update할 수 있는 권한을 회수해보자.
revoke select, update on haksa. * from lee@'localhost';
4) 사용자 삭제
drop문 이용, delete문은 테이블 행을 삭제하는데 사용
**drop user 해당유저이름;**
따옴표 사용 x, 지정된 사용자와 할당된 권한 모두 삭제, 해당 사용자에게 데이터베이스 객체에 대한 권한을 획득한 다른 사용자가 있을 경우, 이 권한도 함께 삭제
desc mysql.db; : mysql 데어테비으세 있는 관련 정보를 포함하는 시스템 테이블
drop user kim@localhost;delete from user where user='lee';delete from db where user='lee';아래 데이터형 내용참조
zerofill 명시하는 법
create table TEST(
seq INT(11) not null auto_increment primary key,
oops1_fillzero INT(1) zerofill,
oops1_nozero INT(1) ,
oops2_fillzero INT(2) zerofill,
oops2_nozero INT(2) ,
oops3_fillzero INT(3) zerofill,
oops3_nozero INT(3)
);
!
숫자 데이터 형
정수 데이터형(INT) ex) INT
int(11) 등으로 과호로 옵션을 주는 경우는, 자릿수를 나타내 제한하는 것이 아니라, 출력하는 기본 자릿수를 설정하는 것이다. >> 출력되는 디스플레이 폭 설정
ex) int(3)으로 정의하고 데이터를 12345를 저장, 12345데이터는 데이터에 저장되어 있지만, 출력할 때는 123만 출력 >> 디스플레이 폭을 설정하는 것
zerofill 과 함께 사용하면, int(5)로 정의하고 12를 저장하면 출력할 떄는 00012로 출력되는 것이다. > int만 사용하면 12를 출력
실수 데이터형(FLOAT) ex)FLOAT(M,D)
M은 소수 부분을 포함한 실수의 총 자릿수를 나타내며, D는 소수 부분의 자릿수를 나타냅니다.
문자 데이터형(CHAR, VARCHAR, BLOB)
char 데이터형 ex) CHAR(n)
1바이트에서 255바이트까지의 고정 길이 문자열을 저장하고, 정의된 저장공간보다 입력 데이터가 짧으면 나머지 공간은 공백(SPACE)으로 채워져, 정의된 길이보다 입력 데이터가 길면 길이에 맞게 잘린 데이터가 입력된다.
그러므로 테이블 생성시 저장할 데이터의 최대크기로 정의해야만 데이터의 손실을 막을 수 있다.
VARCHAR 데이터형 VARCHAR(n)
CHAR 데이터형과 유사하나 정의된 저장공간보다 긴 문자열이 입력되면 CHAR 데이터형에서는 에러를 발생시키지 않고
초과되는 데이터를 잘라서 입력하지만 VARCHAR에서는 에러 값을 리턴 한다.
최대로 정의할 수 있는 데이터의 길이는 16383바이트까지 저장할 수 있고, 메모 등의 다양한 길이의 데이터에 적절하고,
가변적인 길이의 문자열을 저장하기 때문에, 문자열을 저장하기 위하여 선호되는 데이터형이다.
하지만 자료 구조의 원리로 볼 때는 CHAR가 VACHAR보다 검색 속도가 훨씬 빠르다.
BLOB, TEXT 데이터형
BLOB와 TEXT는 65,535 이상의 거대한 텍스트 데이터를 저장할 때 사용하면 된다. 다만 BLOB는 검색시 대소문자를 구분하고 TEXT는 대소문자의 구분이 없이 검색할 수 있다.
날짜 데이터형
MySQL은 날짜 및 시간 데이터를 저장하기 위해서 Date 데이터형을 제공한다. 사용자들은 SYSDATE이라는 함수를 사용해서 현재 OS의 날짜를 조회할 수 있다.
바이너리(binary) 데이터형
MySQL은 음성, 화상(이미지), 동영상과 같은 데이터를 저장하기 위해서 바이너리 데이터형으로 RAW와 LONG RAW 데이터형을 사용하고
제약점으로는 내장함수를 사용할 수 없다.
RAW 데이터형
이진형 데이터를 255바이트까지 수용할 수 있으나 저장 공간의 제한점 때문에 많이 사용하지 않는다.
LONG RAW 데이터형
이진형 데이터를 2GB까지 수용할 수 있다.
BLOB 데이터형
이진형 데이터를 4GB가지 수용할 수 있다.
저장 방식:
CHAR: 고정 길이 문자열을 저장한다. 지정된 길이보다 짧은 문자열이라도 공백 문자로 채워져 지정된 길이에 맞게 저장된다.VARCHAR: 가변 길이 문자열을 저장한다. 실제 데이터의 길이만큼만 저장하며, 추가 공간은 필요하지 않다.저장 공간:
CHAR: 고정된 길이로 저장되므로 지정된 길이만큼의 공간을 항상 차지한다. 따라서 데이터 길이가 고정되어 있고, 입력값의 길이가 일정한 경우에 유리하다.VARCHAR: 실제 데이터 길이에 따라 저장 공간이 유동적으로 조정되므로, 입력값의 길이가 다양한 경우에 유리하다.검색 및 정렬 성능:
CHAR: 데이터의 길이가 고정되어 있으므로 검색 및 정렬이 빠르다.VARCHAR: 데이터의 길이가 가변적이므로 CHAR보다는 약간 느릴 수 있다.사용 사례:
CHAR: 전화번호, 우편번호, 국가 코드 등과 같이 길이가 일정한 데이터에 적합하다.VARCHAR: 주소, 이메일, 설명 등과 같이 길이가 다양한 데이터에 적합합니다.데이터의 길이가 고정되어 있고 일정한 경우에는
CHAR를 사용하고, 데이터의 길이가 다양하거나 변할 수 있는 경우에는VARCHAR를 사용하는 것이 일반적으로 더 효율적이다.
USE HAKSA_DATABASE;
사용자 ID를 "sky", 암호(PASSWORD) "SKY1234"로 생성하시오.
create user 'sky'@'localhost' identified by 'sky1234';사용자 "sky"의 암호를 "sky5678"로 변경하시오.
alter user 'sky'@'localhost' identified with mysql_native_password by '5678';사용자 "sky"에게 모든 데이터베이스를 관리할 수 있는 모든 권한을 부여하시오.
grant all privileges on *.* to sky@'localhost';. 다음과 같은 학생신상테이블(SINSANG)이 있다. 학번 : 정수, 이름 : 영수치 10자리, 출생년도 : 영수치 4자리, 성별 : 영수치 1자리, 도시명 : 영수치 10자리, 입학일자 : 날짜형, 우편번호 : 영수치 7자리, 전화번호 : 영수치 14자리이고 PRIMARY KEY는 학번이다.
create table SINSANG(no int primary key, name varchar(10), birth int, gender char(1), city varchar(10), entrance_date date, zipcode int, phoneNum varchar(14));
create table SINSANG(no int, name varchar(10), birth int, gender char(1), city varchar(10), entrance_date date, zipcode int, phoneNum varchar(14)); + alter table sinsang add primary key (no);
학생신상 테이블(SINSANG)로 부터 도시명이 "서울"인 학생의 학번(stu_no), 이름(stu_name), 성별(sex)을 학번 순으로 출력하는 SQL문을 쓰시오.
select stu_no, stu_name, sex from sinsang where city='서울' order by stu_no asc;학생신상 테이블(sinsang)로 부터 우편번호(postcode)가 '546-121'인 모든 학생의 우편번호를 '540-100'으로 변경하는 SQL문을 쓰시오.
update sinsang set postcode ='540-100' where postcode = '546-121';학생신상 테이블의 형식에 맞추어 본인의 데이터를 생성하여 보시오.(INSERT 명령문 사용)
insert into sinsang values(1, '홍길동', '1980', 'm', '한산도', now(), '546-121', '015');고정되거나 변경할 수 없는 값 >> 상수 (constant)
테이블에서 열과 같은 특별한 자료형 존재
정수 리터럴 Integer Literal
전체가 정수이거나 소수점이 없는 정수로써 양 의 부호(+) 또는 음의 부호(-)를 가질 수 있다.
십진 리터럴 decimal literal
소수점을 가지고 있거나 가지지 않는 수로서 필요하다면 양 또는 음의 부호를 사용할 수 있다. 각 정수 리터럴은 십진 리터럴 정의에 따른다.
소수점 앞에 있는 숫자의 수를 정밀도(precision)라 하며 소수점 뒤에 있는 숫자의 수를 크기(scale) 라 한다. >>123.45는 3개의 정밀도와 2개의 크기를 가지고 있다. MySQL의 Number 데이터형에서는 123.45 값을 처리하기 위해서는 Size를 5자리 이상, Scale을 2자리 이상으로 정의하여 사용해야 한다.
부동 소수점 리터럴 floating point literal
지수를 가지고 있는 십진 리터럴이다.
영수치 리터럴 alphanumeric literal
인용부호(')로 감싼 0 또는 그 이상의 영수치 문자로 구성된 문자열이다. 여기서 인용부호는 리터럴에 포함되지 않고 문자열의 시작과 끝을 나타낸다.
모든 영문자의 대문자(A-Z)
모든 숫자(0-9)
특수 기호(+, =, ?, _)
날짜 리터럴 date literal
연도(year), 달(month), 일(day)로 구성하여 날짜를 표현한다.
이와 같은 날짜를 구성하는 3개의 요소는 슬래쉬('/')로 구분되어 있는데, 앞에 0은 생략할 수 있으며, 년도가 2자리 수치를 사용한다면 19가 두 자리 수치 앞에 생략된 것이다.
날짜 리터럴 한글 버전 입력 값 영문 버전 입력 값
1980/12/08 80/12/08 8 December 1980
1995/06/19 95/06/19 19 June 1995
99/1/1 96/01/01 1 January 1999
함수(수식)들은 데이터를 처리하고 변환하는데 사용된다.
숫자 처리 함수 == 스칼라 함수
mod(column_name1 or value1(분자), column_name2 or value2(분모) : 첫 번째 인수를 두 번째 인수로 나누어 나머지를 반환 (%와 같은 역할)
select mod(10, 3), mod(5, 8); >> 결과: 1 / 5 MYSQL에서는 mod함수에 0을 나누는 수로 넣어도 에러가 발생하지 않는다. 0을 반환한다.(바람직하지는 않은 수식)
abs() : 절대값을 출력하는 함수
select abs(124), abs(-124); >> 결과 124/ 124pow() / power() : 제곱의 값을 구하는 함수로, 소수점이 있는 경우에도 실행 가능 (단, 음수는 양수로 계산)
select pow(2,4), pow(-2.5, 2), pow(1.5, 6); >> 결과 : 16 / 6.25 / 11.390625greatest() : 주어진 숫자 중 가장 큰 수를 반환
4-1. least() : 주어진 숫자 중 가장 작은 수를 반환
select greatest(15, 45, 32, 65), least(15, 45, 32, 65); >> 결과 : 65/ 15반올림 함수 == 스칼라 함수
ROUND(colume_name or value, n) : 함수를 소수점 이하 자릿수에서 반올림(자릿수는 양수, 0, 음수 가능)
자릿수를 생략하면 소수점이 5이상일때 반올림/ 자릿수를 지정하면 지정한 자릿수에서 반올림
ex) select round(123456.789, 2); >> 결과 : 123456.79 : 소수점 아래 두 번쨰 자리에서 반올림
ex) select round(12345678.901, -3;) >> 결과 : 12346000 : 소수점을 기준으로 왼쪽 3자리는0으로 채워지고, 네번쨰 자리에서 반올림
TURNCATE(column_name or value, n)) : 숫자를 소수점 이하 자릿수에서 버린다.
n 은 자릿수를 소수점 이하로 정하며, 해당 숫자가 자릿수보다 소수점이 모자라면 0으로 대체한다. 반드시 자리수를 명시해야한다.
ex) select truncate(123456.789, 2); >> 결과 :123456.78 : 소수점 아래 두번째 자리에서 절삭
ex) select truncate(12345678.901, -3); >> 결과 : 12345000 : 소수점을 기준으로 왼쪽 3자리는 0으로 채워지고 절삭
올림, 절삭해서 무조건 정수를 반환하는 함수(두 번째 인수 사용 x) == 스칼라 함수
floor(column_name or value) : truncate() 함수와 유사해, 소수점 아래의 수를 무조건 절삭해 정수를 반환한다.
ceil(column_name or value) : 소수점 아래의 수는 무시하고 무조건 올림하여 정수를 반환
ex) select floor(123456.789), ceil(123456.123); >> 결과 : 123456 / 123457
round는 반올림(0.5이상)이어야 보다 큰 다음 정수를 나타내지만, ceil()은 0.5미만이라도 인수보다 큰 다음 정수를 반환한다.
문자열 처리 함수
select 붙이고 아래 사용

중복 제거
등록금 총액을 변경하라. - use haksa_datbase >fee테이블 이용
update fee set fee_total = ifnull(fee_enter, 0) + fee_price;
납입금 총액은 "등록금 총액 - 장학금 총액"이다. 납입금 총액을 변경하라.
update fee set fee_pay = fee_total - ifnull(jang_total, 0);우편번호가 150-051 인 동이름과 지역전화번호(동이름과 지역번호는 합쳐서)를 출력하라.
select post_no, concat(post_dong, ddd) from post where post_no = '150-051';
재학생들의 등록 금액에 비례한 장학금의 비율은 몇 % 인가?
select fee_total "등록금액", jang_total "장학금액", round(ifnull(jang_total, 0) / fee_total * 100, 2) "비율" from fee;학번이 20001001인 학생의 학번, 이름, 영문이름을 출력하라. 단, 영문이름은 대문자로 출력하라.
select stu_no, stu_name, upper(stu_ename) from student where stu_no='20001001';2학년 학생의 번호와 이름, 영문이름 그리고 영문이름의 길이를 나타내어라.
select stu_no, stu_name, stu_ename, length(rtrim(stu_ename)) "영문이름 길이" from student where grade = 2;
rtrim() 함수를 사용해 우측에 있는 불필요한 공백을 제거한다. >>문자의 수가 계산되기 전에 이름으로 부터의 모든 공백이 제거
영문이름의 길이가 정확히 12자인 각 학생의 번호와 영문이름을 출력하라.
select stu_no, stu_ename from student where length(rtrim(stu_ename)) = 12;현주소의 우편번호가 "550"으로 시작하는 전남 여수시에 거주하는 학생의 학번과 이름, 우편번호를 나타내어라.
select stu_no, stu_name, post_no from student where substring(post_no, 1, 3) = '550';학번이 '20001021'인 학생의 학번과 이름, 우편번호, 주소를 출력하라. 단, 주소출력에는 공백 부분을 삭제하여 출력하고 concat함수를 이용한다.
select s.stu_no, s.stu_name, s.post_no, concat(rtrim(p.post_address), rtrim(s.address)) "주소" from student s, post p where s.post_no = p.post_no and stu_no = '20001021';
from절에서 각 테이블에 대해 별칭을 지정하여 해당 테이블의 열에 접근할 수 있다.
where절에서 s.post_no = p.post_no 하는 이유는 이 둘의 열이 일치하는 행만 결합되어 새로운결과 집합을 얻게하기 위함이다.
SELECT students.student_id, students.name, grades.grade
FROM students
JOIN grades ON students.student_id = grades.student_id;
# 이와 같이 사용도 가능 join on 을 아직 안배워서리