Mohammad Jawad Barati
Mohammad Jawad Barati
خواندن ۳ دقیقه·۴ سال پیش

تعریف alias برای روابط تو PostgreSQL

وقتی میخوای دیتا رو از یه جدول fetch کنی ممکنه نخوای یه ستون خاص یا اسم جدول رو به صورت مستقیم توی کوئری رفرنس کنی. در کل alias ها یه نام جایگزین برای ستون ها ، جداول، view ها و materialized view ها هست. اینطوری بنویسش:

table_name AS alias_name;

برای اینکار میتونی دلیل های زیادی داشته باشی:

  • دادن نام جدید به یه ستون ممکنه خوندن کوئری رو راحت تر بکنه.
  • ممکنه یه join داشته باشی که روی اون join بخوای اسم بزاری.
  • ممکنه یه Aggregate function داشته باشی که بخوای روی اون اسم بزاری.

توی تغییر نام دادن ستون ها با استفاده از alias می توان از کلمات کلیدی تعریف شده توی PostgreSQL استفاده بکنی ولی برای جداول نمیتونی این کار رو بکنی. ولی اگه اجبار به استفاده داری می تونی از double quote استفاده بکنی.

توی این موارد می تونیم از SELECT AS استفاده بکنیم تا روی یه ستون/جدول یه alias ست کنیم. تست اولیه روی این ایمیج داکری که یه مشته دیتا ست پیش فرض داره انجام میشه. دیتاست منتخب ما توی این پست sportsdb هست.

docker exec -it containerName bash psql sportsdb

مشخص کردن alias روی ستون ها

  • استفاده از Column Alias جلوی دستور SELECT (مثل: select team_key as key from teams)
  • مثل همه آبجکت ها alias ها lowercase هستن. ولی اگه به چیز بیشتری نیاز داری (مثلا کاراکتر های خاص) باید از quote استفاده بکنی.
  • استفاده از Column Alias برای ستون های derived
  • یه مورد دیگه استفاده از Column Alias دستور GROUP BY و ORDER BY
  • ولی از Column Alias با WHERE و HAVING نمیشه استفاده کرد.

حالا روی جدول affiliations کوئری زیر رو بزنید:

select affiliation_key, affiliation_type, publisher_id as publisher from affiliations;

همون طوری که توی تصویر زیر مشخصه اسم ستون publisher_id به publisher تغییر کرده.


مشخص کردن alias روی جداول

  • استفاده از Table Alias جلوی دستور select و from
  • استفاده از Table Alias به همراه WHERE ،GROUP BY ،HAVING و ORDER BY
  • استفاده از Table Alias وقتی join میزنی.
  • برای inline query ها استفاده از Table Alias الزامی هست.

حالا فرض کن میخوای اسم جدول رو به صورت موقت و فقط برای نمایش تغییر بدی. فقط یادت باشه که این کوئری به ظاهر هیچ تغییری نداره.

select affiliation_key, affiliation_type, publisher_id as publisher from affiliations as aff;

حالا فرض کن چند تا جدول داریم که اسم جداولشون طولانی هست:

select AFAP.participant_role AFAPlays.play_type from american_football_action_participants as AFAP, american_football_action_plays as AFAPlays where AFAP.american_football_action_play_id = AFAPlays.id;

راه ساده تر اینه که اصلا از as استفاده نکنی و بجاش این جوری عمل کنی:

select * from teams_media tm;



ساخت جدول و وارد کردن مقادیر تست

CREATE TABLE employees (empno INT, ename TEXT, job TEXT, mgr INT, sal INT, comm INT, deptno INT); INSERT INTO employees VALUES (7788, 'SCOTT', 'ANALYST',NULL, 3000, NULL, 20); INSERT INTO employees VALUES (7369, 'SMITH', 'CLERK', 7788, 800, NULL, 20); INSERT INTO employees VALUES (7499, 'ALLEN', 'SALESMAN', 7788, 1600, 300, 10); CREATE TABLE department (DEPTNO INT, DNAME TEXT, LOC TEXT ); INSERT INTO department VALUES (10, 'ACCOUNTING', 'NEW YORK'); INSERT INTO department VALUES (20, 'RESEARCH', 'DALLAS');

تست برای Column Alias

SELECT ename enm, empno AS eid FROM employees;

نکته: نوشتن as الزامی نیست.

SELECT ename ||'_'|| empno AS &quotEmpDetails&quot, sal+COALESCE(comm,0) AS TOTALSAL FROM employees;

خب همون جوری که میبینید ما توی کوئری یه ستون derived داریم به اسم TOTALSAL که با حروف بزرگ نوشته شده ولی توی خروجی totalsal اومده. چونکه پیش فرض alias ها lowercase هست. ولی ستون EmpDetails چونکه توی double quote اومده فرمت خودش رو حفظ کرده.

SELECT deptno AS &quotDeptID&quot, SUM(sal) AS &quotDeptSal&quot FROM employees GROUP BY &quotDeptID&quot

ولی اگه کوئری زیر رو بزنی به ارور میخوری:

SELECT emp.ename as &quotEnm&quot, emp.empno as &quotEmpID&quot, emp.sal as &quotESal&quot FROM employees emp WHERE &quotESal&quot <=2000;

تست برای Table Alias

SELECT emp FROM employees emp;
SELECT emp.* FROM employees emp;
SELECT emp.ename as &quotEnm&quot, emp.empno as &quotEmpID&quot FROM employees emp;
SELECT emp.ename as &quotEnm&quot, emp.sal as &quotsalary&quot, emp.empno as &quotEmpID&quot FROM employees emp WHERE emp.sal <=2000;

همونطوری که متوجه شدی توی این کوئری بجای استفاده از alias ای که تعریف کردیم اومدیم به صورت مستقیم از خود ستون استفاده کردیم.

SELECT emp.deptno as &quotDeptID&quot, SUM(emp.sal) as &quotDeptSal&quot FROM employees emp GROUP BY emp.deptno HAVING emp.deptno = 20;
SELECT emp.ename AS &quotENM&quot FROM employees emp ORDER BY emp.ename DESC;
SELECT emp.ename as &quotEmpName&quot, manager.ename as &quotMgrName&quot FROM employees as emp LEFT JOIN employees as manager ON emp.mgr = manager.empno;
SELECT emp.ename ||' works at '|| dept.loc ||' in '||dept.dname||' department as '||emp.job AS &quotEmployee status.&quot FROM employees as emp JOIN department as dept ON emp.deptno = dept.deptno;
SELECT emp.deptno, dept.dname FROM employees emp JOIN (select * from department) dept ON emp.deptno = dept.deptno;

توی مثال بالا dept برای inline query الزامی هست.

منابع

رفرنس، رفرنس،

postgresqlpostgrealiasaspsql
برنانه نویس، مدرس، محقق. عاشق انیمه هستم و دنبال چالش ها جدید.
شاید از این پست‌ها خوشتان بیاید