본문 바로가기
코리아 IT아카데미/grid·flex·mySql·jsp

12일차 | JavaScript, SQL

by Sharon kim 2021. 11. 30.

class_08.js

let result1 = 2 > 1;
let result2 = 2 == 1;
let result3 = 2 != 1;

console.log(result1);
console.log(result2);
console.log(result3);

//문자열 비교
console.log("------------------------")
let result4 = 'Z' > 'A';
let result5 = 'Glow' > 'Glee';
let result6 = 'Bee' > 'Be';

console.log(result4);
console.log(result5);
console.log(result6);
console.log("------------------------")

// 다른 형을 가진 값 간의 비교
// 비교하려는 값에 자료형이 다르면 
// 자바스크립트는 이 값들을 숫자형으로 바꾼다.
let result7 = '2' > 1;
let result8 = '01' == 1;
console.log(result7);
console.log(result8);

console.log("------------------------")
// === 일치 연산자
//== 동등 연산자

let result9 = 0 == false; // 0과 false를 구별 못합니다.
let result10 = '' == false; // 빈 문자열이라도 구분하지 못함
console.log(result9);
console.log(result10);

//일치 연산자(strict) 동등 연산자
let result11 = 0 === false;
let result12 = '' === false;

console.log(result11);
console.log(result12);

class_09.js

/*
    null 병합 연산자 ??
    
    최근에 추가됨.
    
    a ?? b 의 평가

    a가 null도 아니고 undefined도 아니면 a
    그 외의 경우는 b이다.

    let x = a ?? b;
    
    x = (a !== null && a !== undefined) ? a : b;

*/

let firstName = null;
let lastName = null;
let nickName = "바이올렛";

let myName = firstName ?? lastName ?? nickName;
console.log(myName);

let nickName2 = "퍼플"

let myName2 = firstName ?? lastName ?? nickName2;
console.log(myName2);

class_10-1.js

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>class_10</title>
    <script>
        // 지역 변수
        function showMessage() {
        let message = "안녕하세요!";
        alert(message);
        }

        alert(message);
        //함수 내에서 선언한 변수인 지역 변수는 함수 안에서만 접근할 수 있다.

    </script>
</head>

<body>
    <script>
        showMessage();
    </script>
</body>

</html>

 


class_10-2.js

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>class_10</title>
    <script>
        //외부 변수
        let userName = 'John';
        function showMessage() {
        let message = 'Hello' + userName;
        alert(message);
        }
        showMessage();
    </script>
</head>
<body>
</body>

</html>

class_10-3.js

1. alert(userName);이 주석해제
2. alert(userName);이 주석해제

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>class_10</title>
    <script>

        let userName = 'John';
        function showMessage() {
            userName = "Bob";
            let message = 'Hello, ' + userName;
            alert(message);
        }
        //생각 !!
        //1.
        // alert(userName); // 함수 호출 전이므로 John이 출력됨
        showMessage();
        //2.
        alert(userName); // 함수에 의해 Bob로 값이 변경됨

    </script>
</head>
<body>
</body>

</html>

class_10-4.js

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>class_10</title>
    <script>

        let userName = 'John';
        function showMessage() {
            let userName = "Bob"; // 외부변수와 같은 이름을 가진 지역변수
            let message = 'Hello, ' + userName; // Bob
            alert(message);
        }
        showMessage();
        alert(userName);
        // 함수는 외부 변수에 접근하지 않습니다.
        
    </script>
</head>
<body>

</body>

</html>

-- sqlDB 
DROP DATABASE IF EXISTS sqldb;
CREATE DATABASE sqldb;

USE sqldb;

CREATE TABLE usertbl -- 회원 테이블
(
userID CHAR(8) NOT NULL PRIMARY KEY, -- 사용자 아이디 (PK)
name VARCHAR(10) NOT NULL, -- 이름
birthYear INT NOT NULL, -- 출생연도
addr CHAR(2) NOT NULL, -- 지역(경기, 서울, 2글자만 입력)
mobile1 CHAR(3), -- 국번 (011, 010)
mobile2 CHAR(8), -- 휴대폰의 나머지 번호(하이픈 제외)
height SMALLINT, -- 키 (+-32768)
mDate DATE -- 회원가입일
);

select * from usertbl;
DELETE from usertbl;

INSERT INTO usertbl VALUES('LSG', '이승기', 1987, '서울', '011', '1111111', 182, '2008-8-8');
INSERT INTO usertbl VALUES('KBS', '김범수', 1979, '경남', '011', '2222222', 173, '2012-4-4');
INSERT INTO usertbl VALUES('KKH', '김경호', 1971, '전남', '019', '3333333', 177, '2007-7-7');
INSERT INTO usertbl VALUES('JYP', '조용필', 1950, '경기', '011', '4444444', 166, '2009-4-4');
INSERT INTO usertbl VALUES('SSK', '성시경', 1979, '서울', NULL  , NULL      , 186, '2013-12-12');
INSERT INTO usertbl VALUES('LJB', '임재범', 1963, '서울', '016', '6666666', 182, '2009-9-9');
INSERT INTO usertbl VALUES('YJS', '윤종신', 1969, '경남', NULL  , NULL      , 170, '2005-5-5');
INSERT INTO usertbl VALUES('EJW', '은지원', 1972, '경북', '011', '8888888', 174, '2014-3-3');
INSERT INTO usertbl VALUES('JKW', '조관우', 1965, '경기', '018', '9999999', 172, '2010-10-10');
INSERT INTO usertbl VALUES('BBK', '바비킴', 1973, '서울', '010', '0000000', 176, '2013-5-5');


-- 구매 테이블 만들기

CREATE TABLE buytbl -- 회원 구매 테이블
(
num INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -- 순번(pk)
userID CHAR(8) NOT NULL, -- 아이디 (PK)
prodName CHAR(8) NOT NULL, -- 물품명
groupName CHAR(4), -- 분류
price INT NOT NULL, -- 단가
amount SMALLINT NOT NULL,
FOREIGN KEY(userID)REFERENCES usertbl(userID)
);

select * FROM buytbl;

INSERT INTO buytbl VALUES(NULL, 'KBS', '운동화', NULL  , 30, 2);
INSERT INTO buytbl VALUES(NULL, 'KBS', '노트북', '전자', 1000, 1);
INSERT INTO buytbl VALUES(NULL, 'JYP', '모니터', '전자', 200,  1);
INSERT INTO buytbl VALUES(NULL, 'BBK', '모니터', '전자', 200,  5);
INSERT INTO buytbl VALUES(NULL, 'KBS', '청바지', '의류', 50,   3);
INSERT INTO buytbl VALUES(NULL, 'BBK', '메모리', '전자', 80,  10);
INSERT INTO buytbl VALUES(NULL, 'SSK', '책'    , '서적', 15,   5);
INSERT INTO buytbl VALUES(NULL, 'EJW', '책'    , '서적', 15,   2);
INSERT INTO buytbl VALUES(NULL, 'EJW', '청바지', '의류', 50,   1);
INSERT INTO buytbl VALUES(NULL, 'BBK', '운동화', NULL  , 30,  2);
INSERT INTO buytbl VALUES(NULL, 'EJW', '책'    , '서적', 15,  1);
INSERT INTO buytbl VALUES(NULL, 'BBK', '운동화', NULL   , 30,  2);

-- where 절

use sqldb;

SELECT * FROM usertbl WHERE name = '김경호';

-- 관계연산자 사용
-- and
SELECT userID, name FROM usertbl WHERE birthYear >= 1970 AND height >= 182;
-- or
SELECT userID, name FROM usertbl WHERE birthYear >= 1970 OR height >= 182;

-- BETWEEN AND
-- 키가 180 ~ 183인 사람을 조회
SELECT userID, name FROM usertbl WHERE height BETWEEN 180 AND 183;
SELECT userID, name FROM usertbl WHERE height>=180 AND height<=183;

-- IN
-- 지역이 경남, 전남, 경북인 사람의 정보를 확인
SELECT name, addr FROM usertbl WHERE addr = '경남' or addr = '전남' or addr = '경북';
-- 이와 동일하게 연속적인 값이 아닌 이상적인 값을 위해 IN구문을 사용할 수 있다.

SELECT name, addr FROM usertbl WHERE addr IN('경남','전남','경북');

SELECT * FROM usertbl;

-- 경기와 서울에 포함된 사람만 출력해주세요
SELECT name, addr FROM usertbl WHERE addr IN('서울','경기');

-- LIKE (주의점 !  = 사용시 검색이 안됨)
SELECT name, height FROM usertbl WHERE name LIKE '김%';
SELECT name, height FROM usertbl WHERE name LIKE '_종신';
SELECT name, height FROM usertbl WHERE name LIKE '_용%';
-- 조용필__사용해주셔서 감사합니다.

-- 서브쿼리(SubQuery 하위튀김)
-- 서브쿼리란 간단히 말해 쿼리문 안에 또 쿼리문이 들어 있는 것을 말한다.
-- ex) 김경호보다 키가 크거나 같은 사람의 이름과 키를 출력해주세요

-- 1
SELECT name, height FROM usertbl WHERE name = '김경호'; -- 177
-- 2
SELECT name, height FROM usertbl WHERE height >= 177;

-- 1과 2를 합치고 싶으면 쿼리 안에 쿼리를 만드는 서브쿼리문
-- 3
SELECT name, height FROM usertbl
WHERE height > (SELECT height FROM usertbl WHERE name = '김경호');

SELECT*FROM usertbl;

-- 1 김범수보다 키가 크거나 같은 사람을 출력해주세요 한방쿼리 사용
SELECT name, height FROM usertbl
WHERE height >= (SELECT height FROM usertbl WHERE name = '김범수');

-- 2 지역이 경남에 사는 사람보다 키가 크거나 같은 사람을 추출
-- ANY, ALL
SELECT name, height FROM usertbl
WHERE height >= (SELECT height FROM usertbl where addr = '경남'); -- 경남에 사는 사람이 2명이라 오류

-- ANY 구문 (둘 다 해당되는 경우에 조건들을 출력) 170도 좋고 173도 좋다
SELECT name, height FROM usertbl
WHERE height >= ANY(SELECT height FROM usertbl where addr = '경남');

-- ALL 구문 (둘 다 만족해야 되는 조건을 추출) 173보다 큰 사람만 검색
SELECT name, height FROM usertbl
WHERE height >= ALL(SELECT height FROM usertbl where addr = '경남');

-- ORDER BY : 결과물에 대한 영향을 미치지는 않지만 결과가 출력되는 순서를 조절하는 구문이다.
SELECT name, mDate FROM usertbl ORDER BY mDate ASC; -- 오름차순
SELECT name, mDate FROM usertbl ORDER BY mDate DESC; -- 내림차순
SELECT * FROM usertbl;

-- 정렬을 두 가지 조건 
-- 문제 name, height height 내림차순 name 오름차순
SELECT name, height FROM usertbl ORDER BY height DESC, name ASC;
-- order by 절을 MYSQL 성능을 상당히 떨어뜨릴 소지가 있기 때문에 꼭 필요한 경우가 아니라면 사용하지 않는 것이 좋다.

-- DISTINCT 문구
SELECT addr FROM usertbl;

SELECT DISTINCT addr FROM usertbl ORDER BY addr;

-- LIMIT 문구 
SELECT name, addr FROM usertbl LIMIT 3; -- 상위 3개만 보여달라

-- LIMIT 시작, 끝
SELECT name, addr FROM usertbl ORDER BY name LIMIT 3, 5; -- (0번부터 시작), 5개

-- 테이블을 복사하는 CREATE TABLE
CREATE TABLE buyTBL2(SELECT * FROM buytbl); -- 회원가입 기능을 만드는 데 새로운 컬럼을 추가해서 추가, 삭제, 수정

-- 특정한 열만 복사해서 만들수도 있다.
CREATE TABLE buyTBL3(SELECT num, userid, prodName FROM buytbl);

SELECT * FROM buyTbl;
SELECT * FROM buyTbl2;

-- 주의할 점 (테이블 복사시에는) primary key 및 foreing key 등 제약조건은 복사되지 않는다.

-- GROUP BY

-- 시나리오1 우리 쇼핑몰에서 사용자별 몇 건의 구매를 했는지 확인하고 싶다.

 USE sqldb;
 SELECT userID, amount FROM buytbl ORDER BY userID;
 
 -- 그룹을 만들어서 결과를 낸다.
 SELECT userID, amount
 FROM buytbl
 GROUP BY userID;
 
 -- 집계 함수
 SELECT userID, sum(amount)
 FROM buytbl
 GROUP BY userID;
 
 -- 별칭 사용하기
SELECT userID AS '사용자 아이디', SUM(amount) AS '총 구매 개수'
FROM buytbl
GROUP BY userID;

 -- 시나리오2 사용자별 총 구매액의 총합을 출력하자 (별칭 사용)
 SELECT userID AS '사용자 아이디', SUM(price) AS '총구매액'
 FROM buytbl
 GROUP BY userID;
 -- 집계함수 sum과 group by 절은 함께 자주 사용된다.
 -- ABG(),MIN(),MAX(),COUNT()
 SELECT*FROM buytbl;
 
 -- 시나리오3 전체 구매자가 구매한 물품의 개수의 평균을 구해보자
SELECT AVG(amount) AS '평균 구매 개수'
FROM buytbl;
 
-- 시나리오4 사용자별  평균 몇개의 물품을 구매했는지 평균을 내보자.
 SELECT userID, AVG(amount) AS '평균 구매 개수'
 FROM buytbl
 GROUP BY userID;
 
 drop table buytbl2;
 
  -- 시나리오5 가장 큰 키와 가장 작은 키의 회원 이름과 키를 출력해보자
  
  -- 주의 1
  SELECT name, MAX(height), MIN(height) FROM usertbl;
 -- 결과 187, 166 결과는 맞지만 이름은 한명만 나온다.
 
 -- 주의 2
  SELECT name, MAX(height), MIN(height) 
  FROM usertbl
  GROUP BY name;
  
 -- 서브쿼리로 조합해서 사용하는 것이 가장 수월하다.
 SELECT name, height
 FROM usertbl
 WHERE height=(SELECT MAX(height)FROM usertbl)
 OR height = (SELECT MIN(height)FROM usertbl);
 
 -- 시나리오6 휴대폰이 있는 사용자 수를 카운터 하자
 SELECT*FROM usertbl;
 
 SELECT count(*) FROM usertbl; -- 전체 회원의 수
 
 -- 한번  쿼리 문을 작성해보세요 mobile1 별칭 휴대폰이 있는 사용자
 SELECT count(mobile1) AS '휴대폰이 있는 사용자' FROM usertbl;
 
 -- !! Having 절 
SELECT userID AS '사용자', SUM(price*amount)AS '총구매액'
FROM buytbl
GROUP BY userID;

-- 시나리오1 천원 이상 구매한 회원에게 사은품을 증정하고 싶다.
-- 실행 안되는 쿼리문
SELECT userID AS '사용자', SUM(price*amount)AS '총구매액'
FROM buytbl
WHERE SUM(price*amount)>1000
GROUP BY userID;
 
-- 정답
SELECT userID AS '사용자', SUM(price*amount)AS '총구매액'
FROM buytbl
GROUP BY userID
Having SUM(price*amount)>1000;

-- 필요하다면 ORDER BY 추가 가능하다
SELECT userID AS '사용자', SUM(price*amount)AS '총구매액'
FROM buytbl
GROUP BY userID
Having SUM(price*amount)>1000
ORDER BY SUM(price*amount)ASC;

-- ROLLUP
-- 총합 또는 중간 합계가 필요하다면 GROUP BY 절과 함께 WITH ROLLUP문을 사용하면 된다.

SELECT num,groupName,sum(price*amount) AS '비용'
FROM buytbl
GROUP BY groupName, num
WITH ROLLUP; 

SELECT num,groupName,sum(price*amount) AS '비용'
FROM buytbl
GROUP BY groupName
WITH ROLLUP; 

/*
	SELECT
    FROM
    WHERE
    GROUP BY
    HAVING
    ORDER BY
    LIMIT
    
    SQL (STRUCTURED QUERY LANGUAGE)- 분류
    쿼리문의 종류
    DML(Data Maipulation Language) - 데이터 조작 언어
       - 데이터를 조작 (삽입, 수정, 삭제, 선택)하는데 사용되는 언어
       
    DDL(Data Definition Language) - 데이터 정의 언어
	   - 데이터 베이스를 생성, 테이블, 뷰, 인덱스 개체 생성, 삭제 변경하는 질의어
		
        CREATE
        DROP
        ALTER
        TRUNCATE
    
    DCL(Data Control Language) - 데이터 제어 언어
	 GRANT = 특정 데이터베이스 사용자에 특정 작업에 대한 수행 권한을 부여한다.
     REVOKE = 특정 데이터베이스 사용자에게 특정 작업에 대한 수행 권한을 박탈 또는 회수한다.
     
     ㄴ면접용
     
     
*/