Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

SQL में विचारों को समझना

मनोज देबनाथ द्वारा

SQL डेटाबेस में तालिकाओं में भारी मात्रा में डेटा हो सकता है, लेकिन वे हमेशा आसानी से उपयोग किए जाने वाले उपयोगी प्रारूप में नहीं होते हैं। कुशल उपयोग के लिए कुछ निर्दिष्ट मानदंडों के आधार पर डेटा की मात्रा को फ़िल्टर किया जाना चाहिए। सुरक्षा कारणों से, हम केवल एक निश्चित मात्रा में डेटा सार्वजनिक करना चाहते हैं, जबकि बाकी विशेषाधिकार प्राप्त उपयोगकर्ताओं के लिए सुलभ हो सकते हैं। SQL DML संचालन एक्स्टेंसिबल हैं और जटिल क्वेरी अभिव्यक्तियों का उपयोग करके एक या अधिक तालिकाओं के माध्यम से फ़िल्टर करने के लिए उपयोग किए जाते हैं। इस विचार का लाभ उठाते हुए, हम एसक्यूएल का उपयोग करके लगातार बेस टेबल से वर्चुअल टेबल बना सकते हैं जिसमें सटीक डेटा होगा जिसकी हमें आवश्यकता है। यही कारण है कि SQL:2006 मानक ने व्यू टेबल, या व्यू के उपयोग की शुरुआत की। किसी दृश्य या वर्चुअल तालिका की परिभाषा स्कीमा ऑब्जेक्ट के रूप में मौजूद होती है। यह आलेख एसक्यूएल में विचारों की अवधारणा का परिचय देता है, यह कैसे काम करता है और दिखाता है कि इसे कुछ उदाहरणों के साथ कैसे कार्यान्वित किया जाता है।

एसक्यूएल दृश्यों का परिचय

SQL दृश्य और कुछ नहीं बल्कि वर्चुअल टेबल एक या अधिक बेस टेबल से प्राप्त मेमोरी में रहते हैं। वर्चुअल टेबल का मतलब है कि विचारों में टुपल्स का भौतिक अस्तित्व नहीं है और उन्हें डेटाबेस में संग्रहीत नहीं किया जाता है। टुपल्स SQL ​​क्वेरी के परिणाम के रूप में बनाए गए अस्थायी डेटा की तरह होते हैं जो आमतौर पर एक या अधिक बेस टेबल से फ़िल्टर किए गए डेटा को खींचता है। नतीजतन, ऑपरेशन के प्रकार पर एक सीमा होती है जिसे व्यू टेबल पर लागू किया जा सकता है। उदाहरण के लिए, अद्यतन कार्रवाई सभी प्रकार के दृश्यों पर लागू नहीं की जा सकती है, लेकिन उस पर SQL क्वेरी लागू करने की कोई सीमा नहीं है।

नीचे दिए गए उदाहरणों का परीक्षण MySQL डेटाबेस के साथ किया जाता है। कुछ टेबल बनाकर शुरू करें:

my_company डेटाबेस:

CREATE DATABASE my_company;

CREATE TABLE Employee(
    empId INT(11) UNSIGNED CHECK (empId > 0),
    empName VARCHAR(20),
    birthDate DATE,
    address TEXT(128),
    gender VARCHAR(1),
    salary DECIMAL(15,2),
    managerId INT(11) UNSIGNED,
    deptId INT(11) UNSIGNED,
    PRIMARY KEY(empId)
);
 
CREATE TABLE Department(
    deptId INT(11) UNSIGNED CHECK (empId > 0),
    deptName VARCHAR(20),
    deptMgrId INT(11) UNSIGNED,
    mgrStartDate DATE,
    PRIMARY KEY(deptId)
);

CREATE TABLE Project(
    projId INT(11) UNSIGNED CHECK (empId > 0),
    projName VARCHAR(20),
    projLocation TEXT(128),
    deptId INT(11) UNSIGNED,
    PRIMARY KEY(projId)
);
 
CREATE TABLE EmpWorksOnProj(
    empId INT(11) UNSIGNED,
    projId INT(11) UNSIGNED,
    hoursWorked DECIMAL(4,2)
);  
 
ALTER TABLE Employee ADD CONSTRAINT fk_emp_mgr FOREIGN KEY(managerId) REFERENCES Employee(empId);
ALTER TABLE Employee ADD CONSTRAINT fk_emp_dept FOREIGN KEY(deptId) REFERENCES Department(deptId);
ALTER TABLE Department ADD CONSTRAINT fk_dept_mgr FOREIGN KEY(deptMgrId) REFERENCES Employee(empId);
ALTER TABLE Project ADD CONSTRAINT fk_proj_dept FOREIGN KEY(deptId) REFERENCES Department(deptId);

विचारों को एक संदर्भ तालिका के रूप में माना जा सकता है, और हम इसे जितनी बार चाहें उपयोग कर सकते हैं, हालांकि यह भौतिक रूप से मौजूद नहीं हो सकता है। उदाहरण के लिए, हमें अक्सर my_company . का संदर्भ लेने की आवश्यकता हो सकती है डेटाबेस और कर्मचारी ढूंढें और परियोजना जानकारी। ध्यान दें कि कर्मचारी . के बीच अनेक से अनेक संबंध हैं और परियोजना क्योंकि एक व्यक्ति कई प्रोजेक्ट पर काम कर सकता है और एक प्रोजेक्ट में भी कई कर्मचारी होते हैं। इसलिए, तीन तालिकाओं में शामिल होने को निर्दिष्ट करने के बजाय:कर्मचारी , EmpWorksOnProj , और परियोजना हर बार जब हमें एक सहयोगी जानकारी की आवश्यकता होती है और एक प्रश्न जारी किया जाता है, तो हम एक ऐसे दृश्य को परिभाषित करते हैं जो इन तालिकाओं में शामिल होने के परिणाम के रूप में निर्दिष्ट होता है। दृश्य क्वेरी के परिणाम से बनाई गई वर्चुअल तालिका बनाता है। लाभ यह है कि क्वेरी अब तीन सम्मिलित तालिकाओं से पुनर्प्राप्त करने के बजाय एकल परिणामी तालिका से पुनर्प्राप्त कर सकती है। तालिकाओं का संग्रह:कर्मचारी , परियोजना , विभाग आदि इस प्रकार आधार तालिका या दृश्य की परिभाषित तालिका बनाते हैं।

आइए ऊपर दिए गए स्कीमा के आधार पर कुछ दृश्य बनाएं।

CREATE VIEW V1
AS
SELECT
   empName, projName, hoursWorked
FROM
   Employee, Project, EmpWorksOnProj
WHERE
   Employee.empId=EmpWorksOnProj.empId
AND
   Project.projId=EmpWorksOnProj.projId;
 

SQL क्वेरीज़ को व्यू या वर्चुअल टेबल पर निर्दिष्ट करने का तरीका बेस टेबल से जुड़े प्रश्नों को निर्दिष्ट करने जैसा ही है। आप निम्न प्रकार से डेटा प्राप्त करने के लिए दृश्यों पर SQL SELECT का उपयोग कर सकते हैं:

* V1 से चुनें;

एम्पनाम

प्रोजनाम

घंटे काम किया

मिकी माउस

क्लब हाउस

6.50

डोनाल्ड डक

खेती

7.0

निम्नलिखित एक दूसरा दृश्य बनाता है:

V2 को चुनें विभाग नाम के रूप में बनाएं, COUNT (*), विभाग से SUM (वेतन), कर्मचारी जहां Employee.deptId=Department.deptId GROUP by deptName;

SQL SELECT का परिणाम

. होता है
SELECT * FROM V1;

विभागनाम

COUNT(*)

एसयूएम (वेतन)

संगीत

5

56000.00

नाटक

2

25400.00

ध्यान दें कि V1 को देखते हुए विशेषता नाम आधार तालिका से लिए गए हैं। V2 में नई विशेषता नामों को स्पष्ट रूप से क्रिएट व्यू क्लॉज की निर्दिष्ट विशेषताओं और सेलेक्ट क्लॉज में निर्दिष्ट विशेषताओं के बीच एक से एक पत्राचार का उपयोग करके स्पष्ट रूप से निर्दिष्ट किया गया है। दृश्य के साथ चयन खंड दृश्य की परिभाषा के लिए निर्णायक है।

देखने की जानकारी हमेशा अप टू डेट होनी चाहिए। इसका मतलब है कि इसे हमेशा उन बेस टेबल पर किए गए परिवर्तनों को प्रतिबिंबित करना चाहिए जिन पर इसे परिभाषित किया गया है। यह दिलचस्प है, क्योंकि इसका मतलब है कि दृश्य को परिभाषित करने के समय वास्तव में भौतिक नहीं किया जाता है, लेकिन बाद में जब उस पर एक प्रश्न निर्दिष्ट किया जाता है। दृश्य को अद्यतित रखने के लिए पृष्ठभूमि में डेटाबेस प्रबंधन प्रणाली जिम्मेदार है।

अपडेट करें, डालें और देखे जाने पर हटाएं

SQL में, अद्यतन करने योग्य दृश्य बनाना संभव है जिनका उपयोग मौजूदा डेटा को बदलने या दृश्य में नई पंक्तियों को सम्मिलित करने के लिए किया जा सकता है जो बदले में आधार तालिका में रिकॉर्ड को सम्मिलित या संशोधित करता है . एक दृश्य अद्यतन करने योग्य है या नहीं यह दृश्य परिभाषा के भीतर परिभाषित चयन कथन द्वारा निर्धारित किया जाता है। किसी दृश्य को अद्यतन करने योग्य निर्दिष्ट करने के लिए कोई विशेष खंड नहीं है। आमतौर पर, दृश्य परिभाषा सरल होनी चाहिए और इसमें SUM, AVG, MAX, MIN, COUNT जैसे कोई समग्र कार्य नहीं होने चाहिए। किसी भी प्रकार का ग्रुपिंग या DISTINCT या JOIN क्लॉज भी व्यू को अपडेट करने योग्य नहीं बनाता है। किसी दृश्य को अद्यतन न करने योग्य बनाने के लिए विशिष्ट RDBMS के प्रासंगिक डेटाबेस मैनुअल का संदर्भ लें।

आइए एक ऐसा दृश्य बनाएं जो अद्यतन करने योग्य हो:

CREATE VIEW v3_ch_dept_name
AS
SELECT
   deptId, deptName, deptMgrId, mgrStartDate
FROM
   Department;

देखने पर चयन क्वेरी:

SELECT * FROM v3_ch_dept_name;

विभाग आईडी

विभागनाम

DeptMgrId

MgrStartDate

1

संगीत

123456789

2020-01-01

5

नाटक

987654321

2018-03-05

अब विभाग का नाम (deptName) बदलकर दृश्य को अपडेट करें।

UPDATE
   v3_ch_dept_name
SET
   deptName = 'Security'
WHERE
   deptId = 5;

दृश्य में एक पंक्ति इस प्रकार डाली जा सकती है:

INSERT
   INTO v3_ch_dept_name
VALUES (7,'Logistics',666884444,'1982-07-07');

इसके अलावा, हम निम्न प्रकार से एक पंक्ति को दृश्य से हटा सकते हैं:

DELETE FROM v3_ch_dept_name WHERE deptId = 7;

MySQL में, आप आसानी से एक डेटाबेस में दृश्य ढूंढ सकते हैं जो अद्यतन करने योग्य हैं या निम्न SELECT कमांड का उपयोग नहीं कर रहे हैं।

SELECT
   table_name
FROM
   information_schema.views
WHERE
   is_updatable like 'YES'
AND
   table_schema like 'my_company';

डेटाबेस से ड्रॉप व्यू

किसी दृश्य को DROP VIEW . के साथ हमेशा निपटाया जा सकता है आदेश।

DROP VIEW V1;

ध्यान दें कि जब हम ड्रॉप व्यू कमांड निष्पादित करते हैं तो यह दृश्य परिभाषा को हटा देता है। आधार तालिकाओं में संग्रहीत अंतर्निहित डेटा जिससे यह दृश्य प्राप्त होता है अपरिवर्तित रहता है। एक बार छोड़े गए दृश्य को उसी नाम से फिर से बनाया जा सकता है।

वैकल्पिक दृश्य कथन

दृश्य आमतौर पर SQL:2006 मानक के अनुसार अपरिवर्तनीय होते हैं, जिसका अर्थ है कि ALTER VIEW कथन विचारों के साथ काम नहीं करता है। हालाँकि, RDBMS जैसे MySQL या SQL सर्वर हैं जो इस तरह के स्टेटमेंट का समर्थन करते हैं। Oracle पहले दृश्य को छोड़ने और फिर उसे बदलने के बजाय उसे फिर से बनाने में विश्वास करता है। इसलिए, RDBMS के विचारों के आधार पर समर्थित कार्यात्मकता उत्पाद से उत्पाद में भिन्न होती है।

निष्कर्ष

SQL दृश्य अनेक प्रकार के डेटा तक पहुँचने के लिए भी उपयोगी उपकरण हैं। जटिल प्रश्नों को दृश्य परिभाषा में संग्रहीत किया जा सकता है। यह पुन:उपयोग का लाभ उठाता है क्योंकि हम हर बार जरूरत पड़ने पर प्रश्नों को फिर से बनाने के बजाय दृश्य को लागू कर सकते हैं। यह कई सूचनाओं को छिपाने वाले उपयोगकर्ता को जानकारी प्रस्तुत करने का एक सुविधाजनक तरीका है जिसे हम सभी के सामने प्रकट नहीं करना चाहते हैं। सुरक्षा की दृष्टि से भी यह महत्वपूर्ण है। जटिल संरचनाओं को अंतिम उपयोगकर्ता के लिए एक आसान प्रारूप में संश्लेषित और प्रस्तुत किया जा सकता है।

संदर्भ:

एल्माश्री, रमेज़, और शामकांत बी. नवाथे। डेटाबेस सिस्टम की बुनियादी बातें . पियर्सन एजुकेशन।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. DEFAULT क्लॉज में CURRENT_TIMESTAMP के साथ केवल एक TIMESTAMP कॉलम क्यों हो सकता है?

  2. MySQL में एक स्ट्रिंग से समय कैसे प्राप्त करें

  3. MySQL क्वेरी में टेक्स्ट को नंबर में बदलें

  4. Apache 2.2, MySQL 5.0 और PHP 5 के साथ FreeBSD 6.0 में वेब सर्वर स्थापित करना - भाग 3

  5. असफल प्रविष्टियों पर MySQL ऑटोइनक्रिकमेंट क्यों बढ़ता है?