10.1. ÐбзоÑ
SQL â ÑзÑк Ñо ÑÑÑогой ÑипизаÑией. То еÑÑÑ ÐºÐ°Ð¶Ð´Ñй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð´Ð°Ð½Ð½ÑÑ Ð² нÑм Ð¸Ð¼ÐµÐµÑ Ð½ÐµÐºÐ¾ÑоÑÑй Ñип, опÑеделÑÑÑий его поведение и допÑÑÑимое иÑполÑзование. Postgres Pro наделÑн ÑаÑÑиÑÑемой ÑиÑÑемой Ñипов, более ÑнивеÑÑалÑной и гибкой по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð´ÑÑгими ÑеализаÑиÑми SQL. ÐÑи ÑÑом пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñипов в Postgres Pro в оÑновном подÑинÑÑÑÑÑ Ð¾Ð¿ÑеделÑннÑм обÑим пÑавилам, Ð´Ð»Ñ Ð¸Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð½Ðµ нÑжен ÑвÑиÑÑиÑеÑкий анализ. ÐлагодаÑÑ ÑÑÐ¾Ð¼Ñ Ð² вÑÑажениÑÑ Ñо ÑмеÑаннÑми Ñипами можно иÑполÑзоваÑÑ Ð´Ð°Ð¶Ðµ ÑипÑ, опÑеделÑннÑе полÑзоваÑелÑми.
ÐнализаÑÐ¾Ñ Ð²ÑÑажений Postgres Pro ÑазделÑÐµÑ Ð¸Ñ Ð»ÐµÐºÑиÑеÑкие ÑлеменÑÑ Ð½Ð° пÑÑÑ Ð¾ÑновнÑÑ ÐºÐ°ÑегоÑий: ÑелÑе ÑиÑла, дÑÑгие ÑиÑловÑе знаÑениÑ, ÑекÑÑовÑе ÑÑÑоки, иденÑиÑикаÑоÑÑ Ð¸ клÑÑевÑе Ñлова. ÐонÑÑанÑÑ Ð±Ð¾Ð»ÑÑинÑÑва не ÑиÑловÑÑ Ñипов ÑнаÑала клаÑÑиÑиÑиÑÑÑÑÑÑ ÐºÐ°Ðº ÑÑÑоки. РопÑеделении ÑзÑка SQL допÑÑкаеÑÑÑ ÑказÑваÑÑ Ð¸Ð¼ÐµÐ½Ð° Ñипов в ÑÑÑÐ¾ÐºÐ°Ñ Ð¸ ÑÑо можно иÑполÑзоваÑÑ Ð² Postgres Pro, ÑÑÐ¾Ð±Ñ Ð½Ð°Ð¿ÑавиÑÑ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°ÑÐ¾Ñ Ð¿Ð¾ веÑÐ½Ð¾Ð¼Ñ Ð¿ÑÑи. ÐапÑимеÑ, запÑоÑ:
SELECT text 'Origin' AS "label", point '(0,0)' AS "value"; label | value --------+------- Origin | (0,0) (1 row)
ÑодеÑÐ¶Ð¸Ñ Ð´Ð²Ðµ ÑÑÑоковÑÑ
конÑÑанÑÑ, Ñипа text и Ñипа point. ÐÑли Ð´Ð»Ñ Ñакой конÑÑанÑÑ Ð½Ðµ Ñказан Ñип, Ð´Ð»Ñ Ð½ÐµÑ Ð¿ÐµÑвонаÑалÑно пÑедполагаеÑÑÑ Ñип unknown, коÑоÑÑй заÑем Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑоÑнÑн, как опиÑано ниже.
Ð SQL еÑÑÑ ÑеÑÑÑе ÑÑндаменÑалÑнÑÑ ÑакÑоÑа, опÑеделÑÑÑÐ¸Ñ Ð¿Ñавила пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñипов Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°ÑоÑа вÑÑажений Postgres Pro:
- ÐÑÐ·Ð¾Ð²Ñ ÑÑнкÑий
СиÑÑема Ñипов Postgres Pro во многом поÑÑÑоена как дополнение к богаÑÑм возможноÑÑÑм ÑÑнкÑий. ФÑнкÑии могÑÑ Ð¸Ð¼ÐµÑÑ Ð¾Ð´Ð¸Ð½ или неÑколÑко аÑгÑменÑов, и пÑи ÑÑом Postgres Pro ÑазÑеÑÐ°ÐµÑ Ð¿ÐµÑегÑÑжаÑÑ Ð¸Ð¼ÐµÐ½Ð° ÑÑнкÑий, Ñак ÑÑо Ð¸Ð¼Ñ ÑÑнкÑии Ñамо по Ñебе не иденÑиÑиÑиÑÑÐµÑ Ð²ÑзÑваемÑÑ ÑÑнкÑиÑ; анализаÑÐ¾Ñ Ð²ÑбиÑÐ°ÐµÑ Ð¿ÑавилÑнÑÑ ÑÑнкÑÐ¸Ñ Ð² завиÑимоÑÑи Ð¾Ñ Ñипов пеÑеданнÑÑ Ð°ÑгÑменÑов.
- ÐпеÑаÑоÑÑ
Postgres Pro позволÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð² вÑÑажениÑÑ Ð¿ÑеÑикÑнÑе опеÑаÑоÑÑ (Ñ Ð¾Ð´Ð½Ð¸Ð¼ аÑгÑменÑом), а Ñакже инÑикÑнÑе опеÑаÑоÑÑ (Ñ Ð´Ð²ÑÐ¼Ñ Ð°ÑгÑменÑами). Ðак и ÑÑнкÑии, опеÑаÑоÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ пеÑегÑÑжаÑÑ, Ñак ÑÑо и Ñ Ð½Ð¸Ð¼Ð¸ ÑÑÑеÑÑвÑÐµÑ Ð¿Ñоблема вÑбоÑа пÑавилÑного опеÑаÑоÑа.
- Ð¡Ð¾Ñ Ñанение знаÑений
SQL-опеÑаÑоÑÑ
INSERTиUPDATEпомеÑаÑÑ ÑезÑлÑÑаÑÑ Ð²ÑÑажений в ÑаблиÑÑ. ÐÑи ÑÑом полÑÑаемÑе знаÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑооÑвеÑÑÑвоваÑÑ Ñипам ÑелевÑÑ ÑÑолбÑов или, возможно, пÑиводиÑÑÑÑ Ðº ним.UNION,CASEи ÑвÑзаннÑе конÑÑÑÑкÑииТак как вÑе ÑезÑлÑÑаÑÑ Ð·Ð°Ð¿ÑоÑа обÑединÑÑÑего опеÑаÑоÑа
SELECTÐ´Ð¾Ð»Ð¶Ð½Ñ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð² одном набоÑе ÑÑолбÑов, ÑезÑлÑÑаÑÑ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ подзапÑоÑаSELECTÐ´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑиводиÑÑÑÑ Ðº Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð½Ð°Ð±Ð¾ÑÑ Ñипов. ÐодобнÑм обÑазом, ÑезÑлÑÑиÑÑÑÑие вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑÑÑÑкÑииCASEÐ´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑиводиÑÑÑÑ Ðº обÑÐµÐ¼Ñ ÑипÑ, Ñак как вÑÑажениеCASEв Ñелом должно имеÑÑ Ð¾Ð¿ÑеделÑннÑй вÑÑ Ð¾Ð´Ð½Ð¾Ð¹ Ñип. Ðодобное опÑеделение обÑего Ñипа Ð´Ð»Ñ Ð·Ð½Ð°Ñений неÑколÑÐºÐ¸Ñ Ð¿Ð¾Ð´Ð²ÑÑажений ÑÑебÑеÑÑÑ Ð¸ Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð´ÑÑÐ³Ð¸Ñ ÐºÐ¾Ð½ÑÑÑÑкÑий, напÑимеÑARRAY[], а Ñакже Ð´Ð»Ñ ÑÑнкÑийGREATESTиLEAST.
ÐнÑоÑмаÑÐ¸Ñ Ð¾ ÑÑÑеÑÑвÑÑÑÐ¸Ñ Ð¿ÑеобÑазованиÑÑ Ð¸Ð»Ð¸ пÑиведениÑÑ Ñипов, Ð´Ð»Ñ ÐºÐ°ÐºÐ¸Ñ Ñипов они опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð¸ как Ð¸Ñ Ð²ÑполнÑÑÑ, Ñ ÑаниÑÑÑ Ð² ÑиÑÑемнÑÑ ÐºÐ°ÑÐ°Ð»Ð¾Ð³Ð°Ñ . ÐолÑзоваÑÐµÐ»Ñ Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE CAST. (ÐбÑÑно ÑÑо делаеÑÑÑ, когда опÑеделÑÑÑÑÑ Ð½Ð¾Ð²Ñе ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐÐ°Ð±Ð¾Ñ Ð¿Ñиведений Ð´Ð»Ñ Ð²ÑÑÑоеннÑÑ Ñипов доÑÑаÑоÑно Ñ Ð¾ÑоÑо пÑоÑабоÑан, Ñак ÑÑо его лÑÑÑе не менÑÑÑ.)
ÐополниÑелÑÐ½Ð°Ñ Ð»Ð¾Ð³Ð¸ÐºÐ° анализа Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ Ð²ÑбÑаÑÑ Ð¾Ð¿ÑималÑное пÑиведение в гÑÑппаÑ
Ñипов, допÑÑкаÑÑиÑ
неÑвнÑе пÑеобÑазованиÑ. ÐÐ»Ñ ÑÑого ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
ÑазделÑÑÑÑÑ Ð½Ð° неÑколÑко базовÑÑ
каÑегоÑий, коÑоÑÑе вклÑÑаÑÑ: boolean, numeric, string, bitstring, datetime, timespan, geometric, network и полÑзоваÑелÑÑкие ÑипÑ. (ÐолнÑй ÑпиÑок каÑегоÑий пÑиведÑн в ТаблиÑе 51.65; Ñ
оÑÑ ÐµÐ³Ð¾ Ñоже можно ÑаÑÑиÑиÑÑ, опÑеделив Ñвои каÑегоÑии.) Ркаждой каÑегоÑии могÑÑ Ð±ÑÑÑ Ð²ÑбÑÐ°Ð½Ñ Ð¾Ð´Ð¸Ð½ или неÑколÑко пÑедпоÑиÑаемÑÑ
Ñипов, коÑоÑÑе бÑдÑÑ ÑÑиÑаÑÑÑÑ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ подÑ
одÑÑими пÑи ÑаÑÑмоÑÑении неÑколÑкиÑ
ваÑианÑов. ÐккÑÑаÑно вÑбиÑÐ°Ñ Ð¿ÑедпоÑиÑаемÑе ÑÐ¸Ð¿Ñ Ð¸ допÑÑÑимÑе неÑвнÑе пÑеобÑазованиÑ, можно добиÑÑÑÑ Ñого, ÑÑо вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñ Ð½ÐµÐ¾Ð´Ð½Ð¾Ð·Ð½Ð°ÑноÑÑÑми (в коÑоÑÑÑ
Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ ÑазнÑе ÑеÑÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ñи пÑеобÑазованиÑ) бÑдÑÑ ÑазÑеÑаÑÑÑÑ Ð½Ð°Ð¸Ð»ÑÑÑим обÑазом.
ÐÑе пÑавила пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñипов ÑазÑабоÑÐ°Ð½Ñ Ñ ÑÑÑÑом ÑледÑÑÑÐ¸Ñ Ð¿ÑинÑипов:
РезÑлÑÑÐ°Ñ Ð½ÐµÑвнÑÑ Ð¿ÑеобÑазованиÑÑ Ð²Ñегда должен бÑÑÑ Ð¿ÑедÑказÑемÑм и понÑÑнÑм.
ÐÑли в неÑвном пÑеобÑазовании Ð½ÐµÑ Ð½ÑждÑ, анализаÑÐ¾Ñ Ð¸ иÑполниÑÐµÐ»Ñ Ð·Ð°Ð¿ÑоÑа не Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑаÑиÑÑ Ð»Ð¸Ñнее вÑÐµÐ¼Ñ Ð½Ð° ÑÑо. То еÑÑÑ, еÑли запÑÐ¾Ñ Ñ Ð¾ÑоÑо ÑÑоÑмÑлиÑован и ÑÐ¸Ð¿Ñ Ð·Ð½Ð°Ñений ÑовпадаÑÑ, он должен вÑполнÑÑÑÑÑ Ð±ÐµÐ· дополниÑелÑной обÑабоÑки в анализаÑоÑе и без лиÑÐ½Ð¸Ñ Ð²Ñзовов неÑвнÑÑ Ð¿ÑеобÑазований.
ÐÑоме Ñого, еÑли запÑÐ¾Ñ Ð¸Ð·Ð½Ð°ÑалÑно ÑÑебовал неÑвного пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ ÑÑнкÑии, а полÑзоваÑÐµÐ»Ñ Ð¾Ð¿Ñеделил новÑÑ ÑÑнкÑÐ¸Ñ Ñ ÑоÑно ÑовпадаÑÑими Ñипами аÑгÑменÑов, анализаÑÐ¾Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ пеÑеклÑÑиÑÑÑÑ Ð½Ð° новÑÑ ÑÑнкÑÐ¸Ñ Ð¸ болÑÑе не вÑполнÑÑÑ Ð¿ÑеобÑазование Ð´Ð»Ñ Ð²Ñзова ÑÑаÑой.