반응형

※ 구분은 대소문자 상관없지만 가독성을 위해 대문자를 이용(변수는 대소문자 지켜야 함)

※ 구문 실행 순서에 따라 AS로 지정한 별칭이 적용되지 않는 구문이 있다.


  • 구문 순서

SELECT / FROM / WHERE / GROUP BY / HAVING / ORDER BY / OFFSET FETCH

 

  • 실행 순서

FROM / WHERE / GROUP BY / HAVING / SELECT / ORDER BY / etc..


  • SELECT FROM

1. SELECT

 - 질의라고 함.

 - 모든 열을 가지고 올때는 '*'를 사용한다.

 - 여러 열들을 가지고 올때는 ','로 구분한다.

 - 특정 열의 별칭을 달고 싶을때는 '열명 AS 별칭'을 사용한다.

 - 갯수 지정이 가능하다 (상위 10개 : TOP 10 *, 상위 10% : TOP 10 PERCENT *)

 

2. FROM

 - 테이블 명을 입력한다.

 

  • WHERE

 - 조건구문. 원하는 조건의 행을 가져온다.

 - 조건 연산자는 문자로 풀어서 사용한다.

!= NULL IS NOT NULL
== NULL IS NULL
&& AND
|| OR

 - LIKE : 문자 패턴 매칭

% : 임의의 문자열 ex) 'Hello%' : Hello가 들어간 모든 값을 얻을 수 있음
_ : 임의의 문자 ex) 'Hell_' : Hell과 나머지 문자 1개가 들어간 모든 값을 얻을 수 있음

 

  • GROUP BY

 - 그룹핑

 - 중복을 제거하는 DISTINCT와 다르게 집계의 인수로 값을 넘겨줄 수 있다.

 

  • HAVING

 - GROUP BY에 대한 추가 조건을 입력하는 구문

 

  • ORDER BY

 - 결과를 정렬한다.

 - 오름차순(ASC), 내림차순(DESC)가 있다. (기본값 : ASC)

 - 정렬은 테이블에 영향을 주지 않는다.

 - 여러 열들을 정렬할 때 ','로 구분한다.

 

  • OFFSET

 - 원하는 구간을 지정할 수 있다.

 - ex) 50위 부터 100위의 순위를 가지고 온다 : OFFSET 50 ROWS FETCH NEXT 50 ROWS ONLY

 - 사용빈도가 낮다. (알고만 있을것)

 


  • DATETIME

 - DATE : 연/월/일

 - TIME : 시/분/초

 - DATETIME : 연/월/일/시/분/초

 - 날짜는 문자열로 관리할 경우 정확한 날짜 비교가 쉽지 않다.

   (문자열은 비교 대상끼리 일치를 보는것이 아닌 사전 순서의 일치를 보는것)

 - 문자열로 입력시 DATETIME 형식 : YYYYMMDD / YYYYMMDD hh:mm:ss.nnn / YYYY-MM-DDThh:mm

 - 문자열로 시간 형식을 맞춰 입력하면 CAST 함수를 사용하지 않아도 자동으로 CAST가 된다.

 - GETDATE() : T-SQL 한정 현재 시간 가져오는 함수 (표준 : CURRENT_TIMESTAMP)

 - GETUTCDATE() : 그리니치 표준시(글로벌 서비스 시)

 - 기타 함수 : DATEADD(시간 더하기), DATEDIFF(시간 차), DATEPART(특정 시간 가져오기(연 or 월 or 일 등))

 - DATEPART(DAY, sometime) == DAY(somtime)

 


  • 연산

 - Null의 연산 결과는 Null이다.

 - 한글의 경우 문자열 앞에 N을 붙여 유니코드로 변경해준다. (기본 값으로는 ?로 표기가 됨)

 - 문자열 연산 : CONCAT(), SUBSTRING(), TRIM() 등이 있다.

 

  • CASE

 - CASE 열명 WHEN 조건 THEN 값 END

 - CASE WHEN 조건 THEN 값 END

 - default는 ELSE로 표기한다.

 - ELSE를 넣어주지 않았을때 ELSE에 해당되는 값이 들어가면 그 값은 Null이다.

 


  • 집계

 - COUNT(), SUM(), AVG(), MIN(), MAX()가 있다.

 - 집계 함수는 값이 Null인 경우는 무시하고 실행된다.

 - 인수에 '*'를 넣을 수 있는 함수는 COUNT()가 유일하다.

 - MIN(), MAX()는 문자열이나 날짜에도 사용이 가능하다.

 - WHERE 구에서는 사용이 불가능하다.

 

  • DISTINCT(중복 처리)

 - DISTINCT 뒤에 붙인 열명이 여러개인 경우, 붙인 열들의 값이 전부 일치해야 중복 처리가 된다.

 


  • INSERT

 - INSERT INTO [테이블 명] VALUES [열의 값, 열의 값, ....]

 - VALUES의 값이 모자라면 에러가 발생한다.

 

  • DELETE

 - DELETE FROM [테이블 명] WHERE [조건]

 

  • UPDATE

 - UPDATE [테이블 명] SET [열 = 값] WHERE [조건]

 

물리삭제(DELETE)와 논리삭제(UPDATE)

 - 논리삭제의 경우 Delete flag의 열을 둔 뒤, Delete flag 값의 변경으로 유저의 삭제 여부를 알수있음.

 - 논리삭제의 경우 물리적으로 삭제한것이 아니기 때문에 추후에 복구가 가능함.

 - 개인정보(SNS)등을 포함한 정보는 물리삭제를 한다.

 

INSERT SELECT

 - 테이블의 데이터를 다른 테이블에 복사할때 사용한다.

 - SubQuery와 유사하지만 기능의 차이가 있다.

 


  • SubQuery

 - SQL 명령문 안에 지정하는 하부 SELECT.

 - 서브쿼리의 결과가 다중행인 경우 IN을 사용한다.

 - 다른 구문에서도 사용 가능하지만 주로 WHERE 구문에서 사용된다.

 

상관 관계 서브쿼리

 - EXISTS, NOT EXISTS가 있다.

 - IN과 유사하지만 확장성이 높다.

 


  • INDEX

 - CREATE INDEX [인덱스 명] ON [테이블 명(열 명)]

 - DROP INDEX [테이블 명.인덱스 명]

 

 1. PRIMARY KEY = 대부분 CLUSTERED INDEX

 - 테이블당 1개만 존재한다.

 - 제일 빠름.

 - 등록시 명시하지 않으면 기본적으로 CLUSTERED로 설정된다.

 - Dictionary의 KEY와 같음. (사전 순서)

 

 2. 나머지 = NON CLUSTERED INDEX

 - 갯수 제한이 없다.

 - 이진 탐색을 한다.

 - 따로 관리하는 일종의 LOOK UP 테이블

 - 색인과 같다.

 


  • UNION

 - 합집합

 - Query UNION Query

 

  • INTERSECT

 - 교집합

 - Query INTERSECT Query

 

  • EXCEPT

 - 차집합

 - Query EXCEPT Query

 


  • CROSS JOIN

 - 교차 결합

 - SELECT * FROM [테이블] CROSS JOIN [테이블]

 

  • INNER JOIN

 - 두 개의 테이블을 가로로 결합.

 - 결합 기준은 ON으로 설정한다.

 - 양쪽에 정보를 갖고있는 것만 JOIN이 된다.

 - SELECT * FROM [테이블] INNER JOIN [테이블] ON [조건]

 

  • LEFT / RIGHT JOIN

 - JOIN 방향의 정보는 무조건 표시, 반대 방향의 테이블의 정보가 JOIN 방향의 테이블에 없으면 NULL로 채움.

 - SELECT * FROM [테이블] LEFT / RIGHT JOIN [테이블] ON [조건]

 


  • TRANSACTION

 - BEGIN TRAN [명령] COMMIT or ROLLBACK

 - 명시하지 않으면 자동으로 COMMIT을 수행한다.

 - TRY CATCH로 응용이 가능함.

 

※ 주의점

 - TRAN이 오래걸리는 작업을 수행하게 되면 해당 작업이 끝날때 까지 다른 쿼리들이 대기하므로 주의.

 


  • 변수

 - DECLARE [변수 명] AS 자료형 (+ 초기화 가능)

 - SET [변수 명] = 으로 대입 가능

 - SELECT 구문에서 대입 가능 (SQL SERVER에서만 가능)

 - 테이블 변수도 만들 수 있다. (만들어진 테이블은 tempdb에 임시로 저장된다)

 

  • BATCH

 - GO

 - { } 블록과 같은 기능을 가진다.

 

  • 흐름 제어

 - BEGIN / END

 


 

 - SSMS 관련 함수 참고 : https://docs.microsoft.com/ko-kr/sql/t-sql/functions/functions?view=sql-server-ver15 

 

Microsoft SQL 데이터베이스 함수란? - SQL Server

Microsoft SQL 데이터베이스 함수란?

docs.microsoft.com

 

반응형

'Develoment > DB' 카테고리의 다른 글

[Database] 데이터베이스 작성  (0) 2021.06.14
[Database] 프로그램  (0) 2021.06.09
반응형

  • Programs

1. MS SQL Express : https://www.microsoft.com/ko-kr/sql-server/sql-server-downloads

 

SQL Server 다운로드 | Microsoft

지금 Microsoft SQL Server 다운로드를 시작하세요. 내 데이터와 워크로드에 가장 적합한 SQL Server 체험판 또는 버전, 에디션, 도구 또는 커넥터를 선택하세요.

www.microsoft.com

2. SSMS(SQL Server ManageMent Studio) : https://docs.microsoft.com/ko-kr/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15 

 

SSMS(SQL Server Management Studio) 다운로드 - SQL Server Management Studio (SSMS)

최신 버전의 SSMS(SQL Server Management Studio)를 다운로드합니다.

docs.microsoft.com


 

반응형

'Develoment > DB' 카테고리의 다른 글

[Database] 데이터베이스 작성  (0) 2021.06.14
[Database] 문법 정리  (0) 2021.06.10
반응형

※※ 해당 글은 꾸준히 업데이트 하는 글입니다.

※※ 참조에 사용한 유니티 dll은 2020.3 LTS 버전 이상입니다.


 

  • 프로젝트

1. 프로젝트 생성 시, 템플릿은 클래스 라이브러리로 생성.

 - 일반 클래스 라이브러리가 아닌 클래스 라이브러리(.Net Framework)를 선택해야 한다.


  • 참조

1. UnityEngine.dll은 UnityEngine.CoreModule.dll로 참조한다.

 - UnityEngine.dll은 일부 클래스의 멤버에서 에러를 띄운다.

 

2. 유니티 dll의 경로는 유니티 설치 경로\유니티 버전\Editor\Data\Managed에 대부분 위치한다.

 - 잘 못찾겠으면 위 경로까지만 들어가서 원하는 dll 파일을 검색해서 찾도록 하자.


 

반응형
반응형

어느날 지인에게 메쉬를 생성하는법을 알려달라고 연락이 왔다.

해본적은 없지만(메쉬 개념도 없었다...) 재미있을거같아서 한번 시도해보았다.

 

1. 메쉬 생성(vertices, uv) : vertices만 알면 되는거같아서 uv 설정은 하지 않음.

2. Raycast를 이용해서 vertices 값이 유동적으로 바뀔수 있어야한다.

3. Circle 형태여야 함.

 

연락받았을 당시, 어몽어스에서 그림자가 표현되는 것을 상상했다.

그래서 코드를 2D로 만들었다가, 나중에 3D로 만들어야 된다고 뒤늦게 들어서.. 안타깝게도 코드가 2D와 3D가 섞인 코드가 됐다.

 

※※ 메쉬에 대한 개념은 구글링하면 바로나오니 패스한다.


  • 코드
using UnityEngine;
using UnityEngine.Rendering;

public class MeshCreater : MonoBehaviour
{
    public Material meshMaterial;

    private Mesh mesh;
    private MeshFilter meshFilter;
    private MeshRenderer meshRender;

    private void Start()
    {
        GameObject meshGameObject = new GameObject("Mesh", typeof(MeshFilter), typeof(MeshRenderer));
        meshFilter = meshGameObject.GetComponent<MeshFilter>();
        meshRender = meshGameObject.GetComponent<MeshRenderer>();

        meshRender.material = meshMaterial;

        mesh = new Mesh();
        meshFilter.mesh = mesh;
    }

    private void Update()
    {
        CalculateMesh();
    }

    //Calculate vertex vector(circle)
    private Vector3 ConvertAngleToVector(float _angle)
    {
        var rad = _angle * Mathf.Deg2Rad;
        return new Vector3(Mathf.Cos(rad), Mathf.Sin(rad));
    }

    //*** Mesh vertices point : local position of gameObject
    //recalculate vertices for vertices of mesh
    private void CalculateMesh()
    {
        float targetAngle = 360f;
        int rayCount = 360;
        float angleIncrease = targetAngle / rayCount;
        float angle = 0f;
        float dist = 2f;
        
        //Arr Length : ray counts + cneter point
        Vector3[] vertices = new Vector3[rayCount + 1];
        //Triangles : Multiple of 3
        int[] triangles = new int[rayCount * 3];

        //Center point is always Vector3.zero
        Vector3 centerPoint = Vector3.zero;
        //Set the center point to vertices[0] (triangle index 0)
        vertices[0] = centerPoint;

        int vertexIndex = 1;
        int triangleIndex = 0;
        for (int i = 0; i < vertices.Length; i++)
        {
            if (vertexIndex < vertices.Length)
            {
                Vector3 vertex = ConvertAngleToVector(angle);
                RaycastHit hit;

                //Get vertex points
                if (Physics.Raycast(meshRender.transform.position, vertex, out hit, dist))
                {
                    //Recalculate mesh point(local position)
                    //Set the local position(vertices), after Subtract the meshRender position from hit point.
                    vertices[vertexIndex] = hit.point - meshRender.transform.position;
                }
                else
                {
                    vertices[vertexIndex] = vertex * dist;
                }
            }

            //Set triangles
            if (vertexIndex > 1)
            {
                triangles[triangleIndex] = 0;
                triangles[triangleIndex + 1] = vertexIndex - 1;
                triangles[triangleIndex + 2] = vertexIndex < vertices.Length ? vertexIndex : 1;

                triangleIndex += 3;
            }

            vertexIndex++;
            angle -= angleIncrease;
        }

        //Apply mesh info
        mesh.vertices = vertices;
        mesh.triangles = triangles;
    }
}

 

※※ ConvertAngleToVector(float)는 삼각비를 이용해서 각도로 좌표를 구하는 함수다. (Raycast 함수의 direction 값이라 거리값은 필요가 없음.)

※※ 위 함수가 이해가 안간다면 다음글 참고

링크 : [유니티] 삼각비를 이용해 각도로 좌표구하기

 

[유니티] 삼각비를 이용해 각도로 좌표구하기.

삼각비 삼각비는 직각 삼각형에서 각 A에 대해 세 변의 길이가 이루는비가 일정한걸 말한다. 위와 같은 삼각형에서 빗변(r), 대변(y), 이웃변(x)로 확인해보자. 여기서 각 A가 동일하면 다음과 같은

srdeveloper.tistory.com


  • 결과 보기

 

일단 개념을 잡는 쪽에 맞춰둔 코드라, 활용이나 최적화 작업은 목적에 따라 바뀔것 같다.

추가로 빛으로 활용하기 위한 참고 사이트 링크도 올려둠.

 

2d Visibility

The next step is to keep track of which walls the sweep ray passes through. Only the nearest wall is visible. How do you figure out which wall is nearest? The simplest thing is to calculate the distance from the center to the wall. However, this approach d

www.redblobgames.com

 

반응형
반응형

※ 해당 글은 삼각비를 이해해야 적용이 가능하니 혹시 삼각비를 모르시는 분들은 검색해서 알아보시거나, 아래 링크를 참고해주세요~!

링크 : [유니티] 삼각비를 이용해 각도로 좌표구하기

 

[유니티] 삼각비를 이용해 각도로 좌표구하기.

삼각비 삼각비는 직각 삼각형에서 각 A에 대해 세 변의 길이가 이루는비가 일정한걸 말한다. 위와 같은 삼각형에서 빗변(r), 대변(y), 이웃변(x)로 확인해보자. 여기서 각 A가 동일하면 다음과 같은

srdeveloper.tistory.com


 

 

위의 글에서 우리는 삼각비를 통해서 극축과의 각도(θ)와 반지름(r)을 알면 좌표를 구할수 있다는것을 알았다.

그럼 이제 이 원리를 이용해서 유니티로 3D 카메라의 좌표를 구해보도록 하자.

 

  • 구면좌표계

구면좌표계는 2D 극좌표계에서 축이 하나 더 생긴 3D 극좌표계를 말한다. 그림을 보면서 확인해보자.

 

위 그림에서와 같이 극으로 부터 떨어진 점 P의 좌표를 (r, θ, Φ)라고 한다.

방위각(Azimuth)는 말 그대로 방위의 각이고, 앙각(Elevation)은 고도를 말한다. 유니티 좌표계를 기준으로 XZ축이 방위가 되고, Y축이 고도가 된다.

 

그럼 삼각비를 이용해서 점 P의 직교좌표를 구해보자.

위 그림을 기준으로 우리는 2개의 삼각형을 얻을 수 있다.

왼쪽 삼각형은 앙각을 끼고있는 삼각형이고 오른쪽은 방위각을 끼고있는 삼각형이다.

여기서 우리가 제일 먼저 알아야할 값은 빗변(t)의 길이이다. 일단 r값과 Φ을 이용하여 t를 구하게되면,

 

sinΦ = t / r → t = r sinΦ

 

가 되는것을 확인할 수 있다. 이제 t의 값을 구했으니 t와 θ값을 이용해서 x와 z값을 구해보자.

 

x값 : cosθ = x / t → x = t cosθ → x = r sinΦ cosθ

z값 : sinθ = z / t → z = t sinθ → z = r sinΦ sinθ

 

나머지 y값은 y = r cosΦ로 확인할 수 있다.

삼각비를 제대로 이해했고 여기까지 설명을 봤으면 다 이해했다고 믿는다!

 


 

  • 구면좌표계를 이용해서 캐릭터를 중심으로 움직이는 3D카메라 좌표 계산하기.

이젠 코드와 함께 캐릭터를 중심으로 움직이는 카메라의 3D 좌표를 구해볼 차례이다. 코드를 작성하기 전에 코드에 참고한 예시는 다음 그림과 같다.

위 그림을 기준으로 새로 식을 작성해 보면

 

x = r cosΦ cosθ

y = r sinΦ

z = r cosΦ sinθ

 

으로 확인할 수 있다. (여기까지 이해했다면 당신은 좀 더 진화된 수포자다.)

 

위에서의 설명과 다른점이 하나 있는데, 우리는 카메라의 시작 좌표와 반지름(r)을 지정하여 각도를 먼저 구할것이다.

즉, (x, y, z)값을 지정해서 각 축의 값으로 역함수를 이용하여 θ와 Φ의 각도를 구할것이다.

 

※ 역함수로 직각삼각형의 두 변의 길이를 이용하여 극축과의 각도를 구할 수 있다.

 

우리는 (x, y, z)값과 r값을 알고있기 때문에, 방위각(θ)는 역함수 atan으로 구할것이고, 앙각(Φ)은 역함수 asin으로 구한다.

float Azimuth = Mathf.Atan2(_camCoordinate.z, _camCoordinate.x);
float Elevation = Mathf.Asin(_camCoordinate.y / radius);

위와 같이 작성하게되면 우리는 방위각(Azimuth)과 앙각(Elevation)을 얻을 수 있다. 이렇게 각까지 알아냈다면 나머지는 우리가 가진 값들로 직교좌표를 구하면 되는것이다.

 


 

  • 코드
[System.Serializable]
public class SphericalCoordinates
{
    private float radius, azimuth, elevation;

    public float Azimuth
    {
        get { return azimuth; }
        private set
        {
            azimuth = Mathf.Repeat(value, maxAzimuth_Rad - minAzimuth_Rad);
        }
    }

    public float Elevation
    {
        get { return elevation; }
        private set
        {
            elevation = Mathf.Clamp(value, minElevation_Rad, maxElevation_Rad);
        }
    }

    //Azimuth range
    public float minAzimuth_Deg = 0f;
    private float minAzimuth_Rad;

    public float maxAzimuth_Deg = 360f;
    private float maxAzimuth_Rad;

    //Elevation rages
    public float minElevation_Deg = -20f;
    private float minElevation_Rad;

    public float maxElevation_Deg = 40f;
    private float maxElevation_Rad;

    public SphericalCoordinates(Vector3 _camCoordinate, float _radius)
    {
        //방위각 라디안 값(최대, 최소)을 구한다.
        minAzimuth_Rad = Mathf.Deg2Rad * minAzimuth_Deg;
        maxAzimuth_Rad = Mathf.Deg2Rad * maxAzimuth_Deg;
        //앙각 라디안 값(최대, 최소)을 구한다.
        minElevation_Rad = Mathf.Deg2Rad * minElevation_Deg;
        maxElevation_Rad = Mathf.Deg2Rad * maxElevation_Deg;

        radius = _radius;
        //역함수로 방위각과 앙각을 구한다.
        Azimuth = Mathf.Atan2(_camCoordinate.z, _camCoordinate.x);
        Elevation = Mathf.Asin(_camCoordinate.y / radius);
    }

    public Vector3 toCartesian
    {
        get
        {
            //camera position = (r cosΦ cosθ, r sinΦ, r cosΦ sinθ)
            float t = radius * Mathf.Cos(Elevation);
            return new Vector3(t * Mathf.Cos(Azimuth), 
                radius * Mathf.Sin(Elevation), t * Mathf.Sin(Azimuth));
        }
    }

    public SphericalCoordinates Rotate(float newAzimuth, float newElevation)
    {
        Azimuth += newAzimuth;
        Elevation += newElevation;
        return this;
    }
}

public class CamCtrl : MonoBehaviour
{
    private Vector3 lookPosition;
    private Vector3 targetCamPos = new Vector3(0, 1.5f, -4);

    public Transform PlayerTr;
    public SphericalCoordinates sphericalCoordinates;

    void Start()
    {
        //카메라 위치 계산을 위해 x, y, z좌표와 반지름 r값을 넘겨준다.
        sphericalCoordinates = new SphericalCoordinates(targetCamPos, Mathf.Abs(targetCamPos.z));
        transform.position = sphericalCoordinates.toCartesian + PlayerTr.position;
    }

    void Update()
    {
        float horizontal = Input.GetAxis("Mouse X") * -1;
        float vertical = Input.GetAxis("Mouse Y") * -1;

        //플레이어 위치에서 조금더 위쪽으로 자리잡게 만든다.
        lookPosition = new Vector3(PlayerTr.position.x, 
        PlayerTr.position.y + targetCamPos.y, PlayerTr.position.z);

        //플레이어 중심으로 구한 구면좌표를 카메라 위치에 적용
        transform.position = sphericalCoordinates.Rotate
            (horizontal * Time.deltaTime, vertical * Time.deltaTime).toCartesian + lookPosition;

        //목표지점으로 카메라를 보게함
        transform.LookAt(lookPosition);
    }
}

 

※※ 여기서 반지름(radius)값을 조절하면 마우스 스크롤을 통한 카메라 줌인 줌아웃 기능도 추가가 가능하다.

※※ 방위각(Azimuth)와 앙각(Elevation)에 제한을 설정하고 싶다면 minAzimuth_Deg, maxAzimuth_Deg, minElevation_Deg, maxElevation_Deg 값들을 설정해두면 된다.

반응형

+ Recent posts