CREATE TABLE IF NOT EXISTS "diaries" (
"id" SERIAL ,
"text" VARCHAR(500) NOT NULL,
"imageUrl" VARCHAR(1000),
"createdAt" TIMESTAMP WITH TIME ZONE NOT NULL,
"updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL,
PRIMARY KEY ("id")
);
TimeStamp bilan ishlashda qiynalganingizda bemalol olib ishlatishingiz mumkin!
π1
Assalomu alaykum, hamma salomatmi? Uygonamiz akalar bugun postgresqlga yangi extension o'rnatish va query ichida function ishlatishni koramiz nasib qilsa!
π4
Postgre SQL da o'zimiz uchun
Masalan bizda users table bor va unda status column bor u columnda esa active va passive valuelar bo'lishi kerak biz dataπ
Keyin esa misol uchunπ
Users table ning status columniga type create qilganimizda bergan nomni berib ketamiz ya'ni
Malumotlarimiz foydali bo'layotgan bo'lsa reaksiya bosing.
NUMERIC, VARCHAR, TIMESTAMP
, BOOLEAN
va boshqa type larga o'xshagan type yaratib ko'ramiz!Masalan bizda users table bor va unda status column bor u columnda esa active va passive valuelar bo'lishi kerak biz data
create
qilayotganimizda adashib boshqa value berib yubormasligimiz uchun o'zimizga quyidagicha query orqali type yaratib olamiz CREATE TYPE user_status AS ENUM ('active', 'passive');
Keyin esa misol uchun
users
table quyidagicha yaratiladi CREATE TABLE IF NOT EXISTS movies(
id SERIAL PRIMARY KEY,
full_name VARCHAR(200),
status USER_STATUS NOT NULL
);
Users table ning status columniga type create qilganimizda bergan nomni berib ketamiz ya'ni
user_status
ni!Biz yaratgan users table dagi status columni endi faqatgina active va passive value larini qabul
qiladi.β
*MISSION PASSED
Malumotlarimiz foydali bo'layotgan bo'lsa reaksiya bosing.
Please open Telegram to view this post
VIEW IN TELEGRAM
π2
Biz quyidagicha jadvalni yaratishimiz kerak π
Bunday holatda nima qilamiz. Bunday holatda biz PostgreSql ga o'zimizga kerakliπ
Extension o'rnatib oldik endi bizga user ning role uchunπ
Type ham yaratib oldik endi query yozishimiz kerak. Table create query sini quyidagicha yozamiz:π
Ushbu querydagi asosiy joylari bu PRIMARY KEY id uchun biz UUID dan foydalandik va DEFAULT kiritib ketishi uchun UUID extensionning ichida 4 versiyasi func ni chaqirib ishlatib yubordik! Qolgan columnlarida esa avval yozgan querylar. Role uchun esa o'zimiz yozgan USER_ROLE type dan foydalandik!
user = {
id: "uuid",
phone: 998933333333,
password: "adadsfuh25235561324sdf",
full_name: "John Doe",
role: "user" // user, admin
}
Bunday holatda nima qilamiz. Bunday holatda biz PostgreSql ga o'zimizga kerakli
UUID
extension ni o'rnatib olamiz: CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Extension o'rnatib oldik endi bizga user ning role uchun
user
va admin
value laridan boshqa valuelarini kiritib qo'ymasligi uchun type yaratib olamiz CREATE TYPE role_user AS ENUM ('user', 'admin');
Type ham yaratib oldik endi query yozishimiz kerak. Table create query sini quyidagicha yozamiz:
CREATE TABLE IF NOT EXISTS users(
id uuid DEFAULT uuid_generate_v4(),
phone INTEGER NOT NULL ,
password TEXT NOT NULL ,
full_name VARCHAR(70),
role role_user NOT NULL,
PRIMARY KEY (id)
);
Ushbu querydagi asosiy joylari bu PRIMARY KEY id uchun biz UUID dan foydalandik va DEFAULT kiritib ketishi uchun UUID extensionning ichida 4 versiyasi func ni chaqirib ishlatib yubordik! Qolgan columnlarida esa avval yozgan querylar. Role uchun esa o'zimiz yozgan USER_ROLE type dan foydalandik!
Please open Telegram to view this post
VIEW IN TELEGRAM
π3
UPSERT
ni ko'rib chiqamiz!
Bizda shop table bor do'kon uchun! Va bizga mahsulot keldi agar u mahsulotni qo'shayotganimiz xuddi o'sha nom bilan yana bir mahsulot bazada mavjud bo'lsa bizda CONFLICT ya'ni xatolik chiqib qoladi agar o'sha mahsulot name UNIQUE (takrorlanmas) bo'lsa.
Bunday holatda biz CONFLICT chiqqan payti xatolik chiqmasligining olidini olish uchun UPSERT dan foydalanib bajaramiz!
INSERT INTO shop
(name, count, price)
VALUES
("Iphone", 15, 1500);
Ushbu query orqali item qo'shayotganimizda agar bazada Iphone mahsuloti bo'lsa va name UNIQUE bo'lsa CONFLICT yuzaga kelishi aniq. U xatolikni ushbu query orqali oldini olib ketishimiz mumkin.
INSERT INTO shop
(name, count, price)
VALUES
("Iphone", 15, 1500)
ON CONFLICT (name)
DO NOTHING;
Ushbu query name column da CONFLICT yuzaga kelgan payti hech narsa qilmay shunchaki o'tkazib yuboradi, bazaga qo'shmaydi!
INSERT INTO shop
(name, count, price)
VALUES
("Iphone", 15, 1500)
ON CONFLICT (name)
DO UPDATE
SET count = shop.count + EXCLUDED.count, price = EXCLUDED.price;
Ushbu query esa bazaga yangi Iphone ni qo'shayotganimizda agar iphone bazada bo'lsa shunchaki uning COUNT i bilan PRICE sini UPDATE qilib qo'yayapti xolos!
Malumotlarimiz foydali bo'layotgan bo'lsa, reaksiya qoldiring π₯
Please open Telegram to view this post
VIEW IN TELEGRAM
π₯3π1
Malumotlarimiz sizga foydali bo'lyaptimi?
Anonymous Poll
72%
Ha
28%
O'zim ba'zilarini bilar edim, foydasi tegdi!
Assalomu alaykum hammaga, bugun sizlarga o'zim juda kop ishlatadigan Jetbrains mahsuloti bo'lgan DataGrip ni tavsiya qilmoqchiman, Ushbu programma bilan siz SQL bilan juda oson ishlay olasiz, qulay va sifatli yaxshi programma!
Proyektlarda Database Design qilayotganingizda juda ham kerak bo'ladi!
π₯ Yuklab olish
P/s: To'g'risi, shell dan bezor bo'lgan edingiz a?π
Proyektlarda Database Design qilayotganingizda juda ham kerak bo'ladi!
π₯ Yuklab olish
P/s: To'g'risi, shell dan bezor bo'lgan edingiz a?
Please open Telegram to view this post
VIEW IN TELEGRAM
SELECT
COUNT("id") AS jami,
SUM(CASE WHEN lang = 'en' THEN 1 ELSE 0 END) AS en_foiz,
SUM(CASE WHEN lang = 'uz' THEN 1 ELSE 0 END) AS uz_foiz,
SUM(CASE WHEN lang = 'ru' THEN 1 ELSE 0 END) AS ru_foiz,
(SUM(CASE WHEN lang = 'en' THEN 1 ELSE 0 END) / COUNT("id")) * 100 AS en_foiz_percent,
(SUM(CASE WHEN lang = 'uz' THEN 1 ELSE 0 END) / COUNT("id")) * 100 AS uz_foiz_percent,
(SUM(CASE WHEN lang = 'ru' THEN 1 ELSE 0 END) / COUNT("id")) * 100 AS ru_foiz_percent
FROM users;
Ushbu query orqali siz telegram botingizda uzbek, english, rus foydalanuvchilarini foizda ola olasiz. Statistikada juda ham kerakli bo'lgan query larda bittasi bu. Ushbu query ishlashi uchun sizda quyidagi table bo'lishi kerak
CREATE TABLE users (
id SERIAL PRIMARY KEY,
user_id VARCHAR(100) NOT NULL,
status VARCHAR(200) NOT NULL,
lang VARCHAR(50) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Ushbu query orqali esa siz oxirgi bir soatda, bugun, shu haftada, shu oyda va hamma foydalanuvchilar sonini olishingiz mumkin va bu query ham yuqoridagi table uchun qilingan o'zingizga moslashtirib olasiz degan umiddaman π
SELECT
SUM(CASE WHEN created_at >= NOW() - INTERVAL '12 hours' THEN 1 ELSE 0 END) AS last_12_hours,
SUM(CASE WHEN DATE(created_at) = CURRENT_DATE THEN 1 ELSE 0 END) AS today,
SUM(CASE WHEN created_at >= CURRENT_DATE - INTERVAL '1 week' AND created_at < CURRENT_DATE + INTERVAL '1 day' THEN 1 ELSE 0 END) AS last_week,
SUM(CASE WHEN created_at >= CURRENT_DATE - INTERVAL '1 month' AND created_at < CURRENT_DATE + INTERVAL '1 day' THEN 1 ELSE 0 END) AS last_month
FROM users;
Hamma kerakli querylarni pastda sql faylda qoldiraman! π
Foydasi tekkan bo'lsa reaksiyani bosib ketamiz π₯Ή
Please open Telegram to view this post
VIEW IN TELEGRAM
statistics_queries.sql
1.2 KB
Tepadagi postda yozilgan querylar jamlanmasi! DataGrip da ochib bitta run qilib natijani korishingiz mumkin!
Please open Telegram to view this post
VIEW IN TELEGRAM
query.sql
3.6 KB
Tez orada JOIN lar haqida POST
bo'ladiπ
Please open Telegram to view this post
VIEW IN TELEGRAM
SELECT t.title AS test, jsonb_build_object('questions', (SELECT jsonb_agg(jsonb_build_object('question', row_to_json(q), 'variants', (SELECT jsonb_agg(v) FROM variants v WHERE v.question_id = q.id))) FROM questions q INNER JOIN test_questions tq ON q.id = tq.question_id)) AS question
FROM tests t;
Hayotim davomida yozgan eng uzun querylarimdan biri. Nima vazifa bajaradi deb o'ylaysiz? π€
Bugun sizlar bilan JOIN lar haqida gaplashamiz.
JOIN lar orqali biz bir vaqtning o'zida bir nechta table dan malutmolarni olib kelishimiz mumkin. Ya'ni bizda user_files table bo'lsa va unda user_id , file_id columnlari dagi malumotlar kelsa biz JOIN lar orqali bitta queryning o'zida users jadvalida bizdagi user_id ga mos user ni, files table dan esa file_id ga mos file olib kelib qaytarib berishimiz mumkin. Va nafaqat ikkita balki bir nechta table lardan malumotlarni olib kelishingiz mumkin. Bu o'zingizning proyektingizga va logikangizga bog'liq!
JOIN lar ning bir nechta turi mavjud. Ularga INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN, SELF JOIN va CROSS JOIN lar kiradi!
Har bittasini alohida ko'rib chiqamiz keyingi postlarda! π
JOIN lar orqali biz bir vaqtning o'zida bir nechta table dan malutmolarni olib kelishimiz mumkin. Ya'ni bizda user_files table bo'lsa va unda user_id , file_id columnlari dagi malumotlar kelsa biz JOIN lar orqali bitta queryning o'zida users jadvalida bizdagi user_id ga mos user ni, files table dan esa file_id ga mos file olib kelib qaytarib berishimiz mumkin. Va nafaqat ikkita balki bir nechta table lardan malumotlarni olib kelishingiz mumkin. Bu o'zingizning proyektingizga va logikangizga bog'liq!
JOIN lar ning bir nechta turi mavjud. Ularga INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN, SELF JOIN va CROSS JOIN lar kiradi!
Har bittasini alohida ko'rib chiqamiz keyingi postlarda! π
INNER JOIN ga misol: π
SELECT
upt.id,
jsonb_build_object('id', u.id, 'login', u.login, 'password', u.password, 'full_name', u.full_name,
'birthdate', u.birthdate, 'role', u.role, 'file',
row_to_json(f.*)) AS users,
row_to_json(t.*) as test,
upt.total_questions, upt.passed_questions, upt.created_at
FROM user_passed_tests upt
INNER JOIN users u ON upt.user_id = u.id
INNER JOIN tests t ON upt.test_id = t.id
INNER JOIN files f ON f.id = u.file_id
WHERE upt.user_id = 1;
Please open Telegram to view this post
VIEW IN TELEGRAM
CREATE OR REPLACE FUNCTION my_count(table_name VARCHAR)
RETURNS TABLE (
row_count INTEGER
) AS $$
DECLARE
count_value INTEGER;
BEGIN
EXECUTE 'SELECT COUNT(*) FROM ' || table_name INTO count_value;
row_count := count_value;
RETURN NEXT;
END;
$$ LANGUAGE plpgsql;
SELECT * from my_count('files');
my_count() nomli function yaratilib unga table name berilganda o'sha table dagi hamma malumotlar sonini keltirib chiqarib beruvchi function.
CREATE TABLE IF NOT EXISTS phones(
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
CREATE TABLE IF NOT EXISTS phones_history (
id INT,
name varchar(50) NOT NULL ,
status varchar(10) NOT NULL ,
created_at timestamp default current_timestamp
);
CREATE OR REPLACE FUNCTION pf_insert_historyyy()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO phones_history(id, name, status) VALUES (NEW.id,NEW.name, 'insert');
RETURN new;
end;
$$;
CREATE OR REPLACE TRIGGER insert_phone_trigger
AFTER INSERT
ON phones
FOR EACH ROW
EXECUTE PROCEDURE pf_insert_historyyy();
INSERT INTO phones(name) VALUES ('Redmi');
phones
table yaratiladi, phones_history
table yaratiladi, pf_insert_historyyy
function yaratiladi, insert_phone_trigger
trigger yaratiladi. phones jadvaliga yangi malumot qo'shilganda trigger tinglab turib phones_historyga qo'shish uchun function (procedure) ni chaqirib yuboradi!π1
PostgreSQL Tutorial
Bugun sizlar bilan JOIN lar haqida gaplashamiz. JOIN lar orqali biz bir vaqtning o'zida bir nechta table dan malutmolarni olib kelishimiz mumkin. Ya'ni bizda user_files table bo'lsa va unda user_id , file_id columnlari dagi malumotlar kelsa biz JOIN lar orqaliβ¦
SQL so'rovida ikki (yoki undan ko'p) jadvalni birlashtirish uchun ishlatiladi. Bu jadvaldagi ma'lum bir shartning qanoatlantirilgan ma'lumotlarini olish uchun foydalaniladi.
Bu so'rovda, birlashgan jadvaldagi har bir qator, qo'shimcha shart bajarilgan holda, boshqa jadvaldagi mos keladigan qatorlar bilan birlashtiriladi.
Ko'proq tushunchalarni tushuntirish maqsadida, quyidagi misolni ko'ramiz:
SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;
Bu misolda, orders jadvalidagi customer_id ustuniga qarab customers jadvalidagi customer_id ustuni bilan INNER JOIN amalga oshirilgan. Natijada, orders va customers jadvallarining mos keladigan qatorlari birlashadi.
sql
SELECT fields
FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name;
Bu yerda, fields - olish uchun tanlangan ustunlar ro'yxati, table1 va table2 - birlashtiriladigan jadvallar, va column_name - ularning birlashuvini amalga oshirish uchun foydalaniladigan ustun. Ustun nomlari bir xil bo'lishi zarur.
Please open Telegram to view this post
VIEW IN TELEGRAM