[SQLD] Chapter3 SQL ๊ธฐ๋ณธ(SQLD, D-12)

Updated:

Categories:

Tags: ,

๐Ÿ“Œ ๊ฐœ์ธ์ ์ธ ๊ณต๊ฐ„์œผ๋กœ ๊ณต๋ถ€๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ๋ณต์Šตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
์ •ํ™•ํ•˜์ง€ ์•Š์€ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ๋ฐ”๋ž๋‹ˆ๋‹ค :๐Ÿ˜ธ
[ํ‹€๋ฆฐ ๋‚ด์šฉ์€ ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ๋ณต๋ฐ›์œผ์‹ค๊ฑฐ์—์š”]

Chapter3 SQL ๊ธฐ๋ณธ

๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐœ์š”

  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์ •ํ•œ ์ณฌ๊ณ„์— ๋”ฐ๋ผ ํ†ตํ•ฉํ•˜์—ฌ ๋””์Šคํฌ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•œ ๊ฒƒ์œผ๋กœ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์— ์ข…์†์ ์ด์ง€ ์•Š๋„๋ก ์ผ์ข…์˜ ๋ฏธ๋“ค์›จ์–ด ํ˜•ํƒœ๋กœ ๋งŒ๋“  ๊ฒƒ์„ ๋งํ•œ๋‹ค.
    • DBMS : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์‹œ์Šคํ…œ ์†Œํ”„ํŠธ์›จ์–ด
  2. ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
    • 1970๋…„ E.F.Codd ๋ฐ•์‚ฌ๊ฐ€ ๋ฐœํ‘œํ•œ ์ •๊ทœํ™” ์ด๋ก ์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ๋ฌธ์ œ๋ฅผ ๊ทผ๋ณธ์ ์œผ๋กœ ํ•ด๊ฒฐํ•œ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ
    • 2์ฐจ์› ๊ตฌ์กฐ์˜ ํ–‰๊ณผ ์—ด๋กœ ๊ตฌ์„ฑ๋œ ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ๋‹ค๋ฃจ๋ฉฐ ์ˆ˜ํ•™์  ์ด๋ก ์„ ๋ฐ”ํƒ•์œผ๋กœ ํ•˜๊ณ  ์žˆ์–ด ์—ฐ์‚ฐ ์ž์ฒด๋ฅผ ์ˆ˜ํ•™์ ์œผ๋กœ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • SQL ์ด๋ผ๋Š” ๊ณตํ†ต์˜ ์งˆ์˜ ์–ธ์–ด๋ฅผ ์ •์˜ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์กฐํšŒ, ๊ฐ€๊ณต, ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅ
    • Oracle, PostgresSQL, MariaDB, MySQL, SQL Server ๋“ฑ ์ด ์žˆ๋‹ค.
  3. Table
    • table = entity = Relation
    • ํ–‰: ์ธ์Šคํ„ด์Šค = ๋ ˆ์ฝ”๋“œ = ํŠœํ”Œ
    • ์—ด: ํ•„๋“œ = ์†์„ฑ
  4. SQL (Structed Query Langauge)

    ๋ช…๋ น๋ฌธ์„ ์ œ๊ณตํ•˜๋Š” ์–ธ์–ด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ์ ˆ์ฐจ์ +๋น„์ ˆ์ฐจ์  ์–ธ์–ด์ด๋‹ค.

    • DDL: Data Definition Langauge
      • ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ, ์ฆ‰ ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ช…๋ น์–ด
      • ex) CREATE, ALTER, DROP, RENAME, TRUNCATE
    • DML: Data Manipulation Langauge
      • ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ, ์ž…๋ ฅ, ์ˆ˜์ •, ์‚ญ์ œํ•˜๋Š” ๋ช…๋ น์–ด
      • ์ปค๋ฐ‹ ์ „์— ๋กค๋ฐฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
      • ex) SELECT, INSERT, UPDATE, DELETE, MERGE
    • DCL: Data Control Language
      • ์‚ฌ์šฉ์ž ์ ‘๊ทผ๊ถŒํ•œ๊ณผ ๊ฐ™์ด ๋ณด์•ˆ๊ณผ ์ œ์–ด๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ช…๋ น์–ด
      • ex) GRANT, REVOKE
    • TCL: Transaction Control Langauge
      • ํŠธ๋žœ์žญ์…˜์„ ๋‹ค๋ฃจ๋Š” ์–ธ์–ด, DCL์˜ ์ผ๋ถ€๋กœ ๋ณด๊ธฐ๋„ ํ•จ
      • ex) COMMIT, ROLLBACK, SAVEPOINT

DROP, TRUNCATE, DELETE ์˜ ์ฐจ์ด

  • DROP์€ ์Šคํ‚ค๋งˆ ๊นŒ์ง€ ์™„์ „ํžˆ ์‚ญ์ œ
  • TRUNCATE ๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์‚ญ์ œ, ์Šคํ‚ค๋งˆ๋Š” ๋‚จ๊ฒจ ํ…Œ์ด๋ธ”์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค
  • DROP, TRUNCATE ๋Š” ๋‘˜ ๋‹ค ๋””์Šคํฌ ์ €์žฅ๊ณต๊ฐ„์„ ๋ฆด๋ฆฌ์ฆˆํ•˜์—ฌ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ฉฐ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.
  • DELETE ๋Š” DELETE FROM <TABLE> ๋ช…๋ น์— ์˜ํ•ด์„œ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์‚ญ์ œํ•˜์ง€๋งŒ ์ €์žฅ๊ณต๊ฐ„์„ ๋ฆด๋ฆฌ์ฆˆ ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. DELETE ๋Š” DDL์ด ์•„๋‹ˆ๋ฏ€๋กœ ๋กค๋ฐฑ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธด๋‹ค.
  • ๋™์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•  ๋•Œ TRUNCATE๋Š” ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š๋Š” ๋“ฑ ์ž‘์—… ์ทจ์†Œ๋ฅผ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ DELETE ๋ณด๋‹ค ์ฒ˜๋ฆฌ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.

ํ•จ์ˆ˜

๋‹จ์ผํ–‰ ํ•จ์ˆ˜, ๋‹ค์ค‘ํ–‰ ํ•จ์ˆ˜

  • ๋‹จ์ผํ–‰ ํ•จ์ˆ˜: ํ•œ ํ–‰์˜ ์ž…๋ ฅ์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜. ์ฃผ๋กœ ๊ฐ ํ–‰๋ณ„ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต์ด๋‚˜ ๋ณ€ํ™˜์— ์‚ฌ์šฉ.
  • ๋‹ค์ค‘ํ–‰ ํ•จ์ˆ˜: ์—ฌ๋Ÿฌ ํ–‰์„ ๊ทธ๋ฃนํ™”ํ•ด ํ•œ ๊ฐœ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜. SUM, AVG ๊ฐ™์€ ์ง‘๊ณ„ ํ•จ์ˆ˜๊ฐ€ ๋‹ค์ค‘ํ–‰ ํ•จ์ˆ˜์— ํ•ด๋‹น.

๋ฌธ์ž ํ•จ์ˆ˜

  • CHR(n): ASCII ์ฝ”๋“œ ๊ฐ’์„ ํ•ด๋‹น ๋ฌธ์ž๋กœ ๋ณ€ํ™˜. CHR(65) โ†’ โ€œAโ€
  • **TRIM([LEADING TRAILING BOTH] โ€˜๋ฌธ์ž์—ดโ€™ FROM โ€˜์›๋ณธ ๋ฌธ์ž์—ดโ€™)**: ํŠน์ • ๋ฌธ์ž๋ฅผ ์›๋ณธ ๋ฌธ์ž์—ด์—์„œ ์ œ๊ฑฐ. TRIM('X' FROM 'XXXHELLOXXX') โ†’ โ€œHELLOโ€
  • LTRIM(๋ฌธ์ž์—ด, ์ œ๊ฑฐํ•  ๋ฌธ์ž): ๋ฌธ์ž์—ด์˜ ์™ผ์ชฝ์—์„œ ์ง€์ •๋œ ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐ LTRIM('XXHELLOXX', 'X') โ†’ โ€œHELLOXXโ€
  • RTRIM(๋ฌธ์ž์—ด, ์ œ๊ฑฐํ•  ๋ฌธ์ž): ๋ฌธ์ž์—ด์˜ ์˜ค๋ฅธ์ชฝ์—์„œ ์ง€์ •๋œ ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐ RTRIM('XXHELLOXX', 'X') โ†’ โ€œXXHELLOโ€
  • SUBSTR(๋ฌธ์ž์—ด, ์‹œ์ž‘ ์œ„์น˜, [๊ธธ์ด]): ๋ฌธ์ž์—ด์—์„œ ํŠน์ • ์œ„์น˜๋ถ€ํ„ฐ ์ผ๋ถ€๋ฅผ ์ถ”์ถœ. SUBSTR('HELLO', 2, 3) โ†’ โ€œELLโ€
  • REPLACE(๋ฌธ์ž์—ด, ๋Œ€์ƒ ๋ฌธ์ž์—ด, ๋ณ€๊ฒฝ ๋ฌธ์ž์—ด): ํŠน์ • ๋ฌธ์ž์—ด์„ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด๋กœ ๊ต์ฒด. REPLACE('HELLO WORLD', 'WORLD', 'SQL') โ†’ โ€œHELLO SQLโ€

์ˆซ์ž ํ•จ์ˆ˜

  • MOD : ๋‚˜๋จธ์ง€๋ฅผ ๋ฐ˜ํ™˜ MOD(10, 3) โ†’ 1
  • TRUNC(์ˆซ์ž, [์†Œ์ˆ˜ ์ž๋ฆฟ์ˆ˜]): ์ˆซ์ž๋ฅผ ์ž๋ฆฟ์ˆ˜์— ๋งž๊ฒŒ ์ž๋ฆ„ TRUNC(123.456, 2) โ†’ 123.45
  • SIGN(์ˆซ์ž): ์ˆซ์ž์˜ ๋ถ€ํ˜ธ๋ฅผ ํ™•์ธํ•ด 1(์–‘์ˆ˜), -1(์Œ์ˆ˜), 0(0)์„ ๋ฐ˜ํ™˜. SIGN(-10) โ†’ -1
  • CEIL(์ˆซ์ž): ์†Œ์ˆ˜์  ์ด์ƒ์˜ ์ˆซ์ž๋ฅผ ์˜ฌ๋ฆผํ•˜์—ฌ ์ •์ˆ˜๋กœ ๋ฐ˜ํ™˜ CEIL(123.4) โ†’ 124
  • FLOOR(์ˆซ์ž): ์†Œ์ˆ˜์  ์ดํ•˜์˜ ์ˆซ์ž๋ฅผ ๋‚ด๋ฆผํ•˜์—ฌ ์ •์ˆ˜๋กœ ๋ฐ˜ํ™˜ FLOOR(123.4) โ†’ 123

๋‚ ์งœ ํ•จ์ˆ˜

  • SYSDATE: ํ˜„์žฌ ์‹œ์Šคํ…œ์˜ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ๋ฐ˜ํ™˜ SELECT SYSDATE FROM DUAL โ†’ ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๋ฐ˜ํ™˜

NULL ๊ด€๋ จ ํ•จ์ˆ˜

  • NVL(ํ‘œํ˜„์‹, ๋Œ€์ฒด ๊ฐ’): ํ‘œํ˜„์‹์ด NULL์ผ ๊ฒฝ์šฐ ๋Œ€์ฒด ๊ฐ’์„ ๋ฐ˜ํ™˜ NVL(NULL, '๋Œ€์ฒด๊ฐ’') โ†’ โ€œ๋Œ€์ฒด๊ฐ’โ€
  • NULLIF(ํ‘œํ˜„์‹1, ํ‘œํ˜„์‹2): ๋‘ ํ‘œํ˜„์‹์ด ๊ฐ™์œผ๋ฉด NULL, ๋‹ค๋ฅด๋ฉด ์ฒซ ๋ฒˆ์งธ ํ‘œํ˜„์‹ ๋ฐ˜ํ™˜ NULLIF(10, 10) โ†’ NULL
  • COALESCE(ํ‘œํ˜„์‹1, ํ‘œํ˜„์‹2, โ€ฆ): ์—ฌ๋Ÿฌ ํ‘œํ˜„์‹ ์ค‘ NULL์ด ์•„๋‹Œ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์„ ๋ฐ˜ํ™˜

ํ‘œ์ค€ ์กฐ์ธ

ํ‘œ์ค€ ์กฐ์ธ์€ ๊ธฐ์ค€ ์กฐ๊ฑด์œผ๋กœ WHERE ์ ˆ์ด ์•„๋‹ˆ๋ผ ON ์ ˆ์„ ์‚ฌ์šฉํ•˜๋ฉฐ FROM ์ ˆ์— ์กฐ์ธ์˜ ์ข…๋ฅ˜๋ฅผ ๋ช…์‹œํ•œ๋‹ค.

where์ ˆ, groupby, orderby๋Š” ๊ธฐ์กด์— ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ด์„œ ๋”ฐ๋กœ ์ •๋ฆฌ ํ•˜์ง€ ์•Š์•„๋„ ๋  ๋“ฏ.

์กฐ์ธ๋„ ์•ˆ ํ•  ์ƒ๊ฐ์ด์—ˆ๋Š”๋ฐ ๋ชจ๋ฅด๋Š” ๋ถ€๋ถ„์ด ์žˆ์–ด์„œ ์ •๋ฆฌํ–ˆ๋‹ค.

NATURE JOIN

์กฐ์ธ์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ๋‘ ํ…Œ์ด๋ธ”์—์„œ ๊ฐ™์€ ์ด๋ฆ„์˜ ์นผ๋Ÿผ์— ๋Œ€ํ•ด์„œ๋Š” ๋™์ผํ•œ ์นผ๋Ÿผ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ํ–‰๋งŒ ๋ณ‘ํ•ฉ๋˜๋Š” ์กฐ์ธ

SORT MERGE JOIN

์กฐ์ธ์˜ ์กฐ๊ฑด์ด ๋˜๋Š” ์นผ๋Ÿผ์— ์ธ๋ฑ์Šค๊ฐ€ ์—†์–ด์„œ ์ธ๋ฑ์Šค ์Šค์บ”์„ ํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ๋Œ€๋Ÿ‰์˜ ์ž๋ฃŒ๋ฅผ ์กฐ์ธํ•˜๊ฒŒ ๋˜์–ด ๋žœ๋ค ์—‘์„ธ์Šค ๋ฐฉ์‹์ด ๋ถ€๋‹ด ๋  ๊ฒฝ์šฐ ์ „์ฒด ํ…Œ์ด๋ธ” ์Šค์บ” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ์ธ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์กฐ์ธ ์ปฌ๋Ÿผ์— ๋Œ€ํ•˜์—ฌ ๋จผ์ € ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•œ ํ›„ ์กฐ์ธ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

NESTED LOOP JOIN

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ค‘์ฒฉ ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐ˜๋ณต๋ฌธ๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ์กฐ์ธ์ด๋‹ค.

์ธ๋ฑ์Šค ์Šค์บ”์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋žœ๋ค ์•ก์„ธ์Šค ๋ฐฉ์‹์œผ๋กœ ์ฝ์–ด๋“ค์ด๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์–‘์ด ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒฝ์šฐ ๋””์Šคํฌ I/O๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์„ฑ๋Šฅ์ด ๋А๋ ค์งˆ ์ˆ˜ ์žˆ๋‹ค.

HASH JOIN

NESTED LOOP JOIN์˜ ๋žœ๋ค ์•ก์„ธ์Šค๋กœ ์ธํ•œ ๋ถ€ํ•˜ ๋ฌธ์ œ์™€ SORT MERGE JOIN์˜ ์ •๋ ฌ ์ž‘์—…์— ๋Œ€ํ•œ ๋ถ€๋‹ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๊ฒƒ์œผ๋กœ ๋‘ ๋ฐฉ์‹์˜ ๋‹จ์ ์„ ๊ฐœ์„ ํ•œ ์กฐ์ธ์ด๋‹ค. ์กฐ์ธ ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด ํ•ด์‹œํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜์—ฌ ์ธ๋ฑ์Šค๊ฐ€ ์—†์„ ๋•Œ ๋ณ„๋„๋กœ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ ๋„ ๋น ๋ฅด๊ฒŒ ์กฐ์ธ ๋Œ€์ƒ์„ ์ฐพ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‚˜ ํ•ด์‹œํ•จ์ˆ˜ ํŠน์„ฑ์— ๋”ฐ๋ผ EQUI JOIN ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค. ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ CPU ์—ฐ์‚ฐ ๋ถ€ํ•˜๊ฐ€ ๋†’๋‹ค.


์ด๋ฒˆ ์ฑ•ํ„ฐ๋Š” ์•Œ๊ณ  ์žˆ๋˜ ๋‚ด์šฉ์ด์ง€๋งŒ ๋ถ„๋Ÿ‰์ด ๋งŽ์•„์„œ ๊ณ„ํš์ด ์ดํ‹€๋กœ ์žกํ˜€์žˆ์—ˆ๋‹ค.

์—ฌ๊ธฐ ์ง€๋‚˜๋ฉด 4๋ถ€ํ„ฐ๋Š” ์•„๋Š” ๋‚ด์šฉ์ด ๋Œ€๋ถ€๋ถ„์ด ์•„๋‹ˆ๋ผ ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ฒ ์ง€โ€ฆ? ใ… .ใ… 






Database ์นดํ…Œ๊ณ ๋ฆฌ ๋‚ด ๋‹ค๋ฅธ ๊ธ€ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

Leave a comment