Free tutorials & notes in Hindi & English · Clean code examples · Mobile friendly learning
MySQL + SQL · Lesson 94

MySQL Views

MySQL में View क्या है?

View named query definition है जिसे SELECT में table की तरह reference कर सकते हैं। यह selected columns expose, expressions calculate, tables combine या aggregates को stable interface से present कर सकती है। Normal MySQL view separately refreshed materialized result नहीं; base data tables में रहता है।

ObjectRows store?Purpose
Base tableहाँPersistent storage
ViewSeparate result copy नहींNamed query और abstraction
Temporary tableSession/lifetime तकIntermediate stored result
Faculty correction: View automatically faster या automatically secure नहीं। Definition, privileges और base indexes deliberately design हों तभी लाभ मिलता है।

Verified Orders Lab

DROP TABLE IF EXISTS orders_view_lab;
DROP TABLE IF EXISTS customers_view_lab;

CREATE TABLE customers_view_lab (
  customer_id INT PRIMARY KEY,
  customer_name VARCHAR(80) NOT NULL,
  city VARCHAR(50) NOT NULL
) ENGINE = InnoDB;

CREATE TABLE orders_view_lab (
  order_id INT PRIMARY KEY,
  customer_id INT NOT NULL,
  status VARCHAR(20) NOT NULL,
  order_date DATE NOT NULL,
  total_amount DECIMAL(10,2) NOT NULL,
  internal_note VARCHAR(100),
  FOREIGN KEY (customer_id)
    REFERENCES customers_view_lab(customer_id)
) ENGINE = InnoDB;

INSERT INTO customers_view_lab VALUES
(101,'Asha','Khurja'),(102,'Bilal','Aligarh'),
(103,'Charu','Khurja'),(104,'Deepak','Noida');

INSERT INTO orders_view_lab VALUES
(1,101,'PAID','2026-08-01',1200,'Priority customer'),
(2,101,'PENDING','2026-08-05',500,'Call after 4 PM'),
(3,102,'PAID','2026-08-03',750,NULL),
(4,103,'CANCELLED','2026-08-04',300,'Refund requested'),
(5,101,'PAID','2026-08-10',1500,NULL),
(6,102,'PENDING','2026-08-11',900,NULL),
(7,104,'PAID','2026-08-12',2200,'Do not expose'),
(8,101,'PAID','2026-08-14',650,NULL);

Examples internal_note public views से बाहर रखते हैं। Column hiding उस interface से exposure घटाती है, पर security के लिए correct GRANTs और DEFINER management जरूरी हैं।

Simple View Create और Query

CREATE OR REPLACE VIEW paid_orders_v AS
SELECT order_id, customer_id, order_date, total_amount
FROM orders_view_lab
WHERE status = 'PAID';

SELECT order_id, order_date, total_amount
FROM paid_orders_v
WHERE customer_id = 101
ORDER BY order_date;
1 | 2026-08-01 | 1200.00 5 | 2026-08-10 | 1500.00 8 | 2026-08-14 | 650.00

Outer WHERE और ORDER BY view query करते समय apply होते हैं। SELECT * की जगह explicit columns लें; MySQL creation पर definition freeze करता है, इसलिए later base columns automatically नहीं जुड़तीं।

CREATE VIEW customer_order_public_v
  (order_no, customer_no, ordered_on, amount)
AS
SELECT order_id, customer_id, order_date, total_amount
FROM orders_view_lab;

Explicit column list stable public contract देती है। Names unique और list count selected columns के बराबर होना चाहिए।

Join Views और Aggregate Views

CREATE OR REPLACE VIEW paid_order_details_v AS
SELECT o.order_id, c.customer_name, c.city,
       o.order_date, o.total_amount
FROM orders_view_lab AS o
JOIN customers_view_lab AS c
  ON c.customer_id = o.customer_id
WHERE o.status = 'PAID';

SELECT customer_name, order_date, total_amount
FROM paid_order_details_v
WHERE city = 'Khurja'
ORDER BY customer_name, order_date;
Asha | 2026-08-01 | 1200.00 Asha | 2026-08-10 | 1500.00 Asha | 2026-08-14 | 650.00
CREATE OR REPLACE VIEW customer_paid_summary_v AS
SELECT customer_id, COUNT(*) AS paid_orders,
       SUM(total_amount) AS paid_total
FROM orders_view_lab
WHERE status = 'PAID'
GROUP BY customer_id;
101 | 3 | 3350.00 102 | 1 | 750.00 104 | 1 | 2200.00

Aggregate view reporting के लिए useful है, पर nonupdatable क्योंकि rows का base rows से one-to-one map नहीं। Queryability और updatability अलग properties हैं।

Views Inspect, Replace, Alter और Drop

SHOW CREATE VIEW paid_orders_v;
SHOW FULL TABLES WHERE Table_type = 'VIEW';

SELECT TABLE_NAME, IS_UPDATABLE, DEFINER,
       SECURITY_TYPE, CHECK_OPTION
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA = DATABASE();

CHECK TABLE paid_orders_v;

SHOW CREATE VIEW stored definition/security attributes दिखाता है। Referenced object remove होने जैसे broken dependencies में CHECK TABLE useful है।

ALTER VIEW paid_orders_v AS
SELECT order_id, customer_id, order_date, total_amount
FROM orders_view_lab
WHERE status = 'PAID' AND total_amount >= 500;

DROP VIEW IF EXISTS customer_paid_summary_v;

CREATE OR REPLACE deployment-friendly है, पर columns, types या semantics change करने से applications break हो सकती हैं। Definitions को version-controlled schema मानें।

UNDEFINED, MERGE और TEMPTABLE

AlgorithmConceptConsequence
MERGEView text referencing statement में mergePredicate pushdown/updatability possible
TEMPTABLEInternal temporary result materializeView updatable नहीं
UNDEFINEDMySQL usable method चुनता हैNo algorithm का default
CREATE ALGORITHM = MERGE VIEW khurja_customers_v AS
SELECT customer_id, customer_name, city
FROM customers_view_lab
WHERE city = 'Khurja';

Requested algorithm unconditional performance command नहीं। Some definitions merge नहीं हो सकतीं। Expanded plan के लिए EXPLAIN SELECT ... FROM view_name और real predicates/joins के अनुसार base indexes रखें।

Normal MySQL view अपने indexes नहीं रखती। Base tables और referencing query optimize करें।

DEFINER, INVOKER और Privileges

CREATE
SQL SECURITY DEFINER
VIEW order_public_v AS
SELECT order_id, customer_id, status,
       order_date, total_amount
FROM orders_view_lab;

SQL SECURITY DEFINER default है: underlying privileges definer account से check होते हैं। INVOKER में caller से। दोनों में caller को view पर appropriate privilege चाहिए।

  • Controlled durable service account definer रखें; personal account avoid करें।
  • Users को required view operations दें, unnecessary base access नहीं।
  • Sensitive columns/rows definition में न रखें।
  • View complete authorization, auditing और validation का substitute नहीं।
  • Backup/migration में missing definers review करें।
Security: One view में column hide करना other tables, views, routines या accounts से access revoke नहीं करता। Effective grants end to end test करें।

Performance, Restrictions और Checklist

  • View TEMPORARY table reference नहीं कर सकती; TEMPORARY view नहीं होती।
  • Referenced objects exist चाहिए; drop होने पर view unusable हो सकती है।
  • View पर trigger नहीं बनता।
  • Outer ORDER BY हो तो view का ORDER BY ignored; deterministic order बाहर माँगें।
  • View और outer query दोनों में LIMIT का combined effect undefined; avoid करें।
  • Abstraction expensive joins/functions छिपा सकती है; plans inspect करें।
  1. Narrow stable column contract define करें।
  2. Security context/definer deliberately चुनें।
  3. Least privilege दें।
  4. Important outer queries EXPLAIN करें।
  5. Base join/filter columns index करें।
  6. Output, NULLs, duplicates, order test करें।
  7. Writes से पहले updatability check करें।
  8. Dependencies साथ deploy करें।

आगे updatable views, stored procedures और stored functions पढ़ें।

Official संदर्भ

Creation syntax, frozen definitions, algorithms, restrictions और security context official MySQL 8.4 manual से verify किए गए हैं।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

क्या MySQL view अपनी rows store करती है?
Normal MySQL view query definition store करती है, result rows की separately maintained copy नहीं। Query underlying objects से current result निकालती है; यह materialized view से अलग है।
क्या view में joins और aggregate functions हो सकते हैं?
हाँ। MySQL restrictions के भीतर view joins, grouping और aggregates use कर सकती है। ऐसे constructs view को अक्सर nonupdatable बनाते हैं, queryable वह फिर भी रहती है।
क्या view automatically performance improve करती है?
नहीं। View मुख्यतः abstraction और reuse देती है। MySQL underlying query process करता है; performance expanded plan, base indexes, predicates और data पर निर्भर है।
SQL SECURITY DEFINER और INVOKER में क्या अंतर है?
DEFINER underlying-object privileges definer account से check करता है; INVOKER calling account से। Caller को view पर appropriate privilege फिर भी चाहिए।
क्या view का SELECT * बाद में added columns शामिल करता है?
नहीं। MySQL creation time पर view definition freeze करता है। Base table में बाद में added columns existing view में automatically नहीं जुड़तीं।
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.