Писане в sql таблица c. Заявки за промяна с SQL оператори

Писане в sql таблица c.  Заявки за промяна с SQL оператори
Писане в sql таблица c. Заявки за промяна с SQL оператори

Тази статия е посветена на попълването на таблици на база данни с данни, тоест ще изучаваме SQL команди за вмъкване на нови записи. Трябва да се каже, че писането в таблицата може да се извърши по два начина:

Метод номер 1.
Нека се опитаме да добавим нов запис за държава към таблицата с държави. Синтаксисът за добавяне ще бъде:
INSERT INTO table_name (field_1, field_2, ...) VALUES (Value_1, Value_2, ...); Въз основа на структурата на нашата таблица, SQL заявката ще бъде:
INSERT INTO държави (име_на_държава, име_на_акроним) СТОЙНОСТИ ("Русия", "RU"); Ето как въведохме запис за страната "Русия" в нашата таблица. Тук всичко трябва да е ясно и просто, основното е внимателно да погледнете кои полета сте посочили в първите скоби и да напишете стойностите във вторите скоби в същия ред.

Метод номер 2.
Вторият начин според мен е малко по-лесен, защото виждаш какво и какво поле задаваш. Повярвайте ми, ако таблицата има огромен брой колони, тогава е много лесно да объркате или пренебрегнете реда на полетата в първите и реда на стойностите във вторите скоби. Синтаксисът за втория метод е:
INSERT INTO table_name SET поле_1 = стойност_1, поле_2 = стойност_2, ... ; да продължим този примервъведете малко информация в таблицата лица, тъй като има повече полета и веднага ще се усети предимството на втория метод:
INSERT INTO persons SET first_name="Иван", last_name="Dulin", register_date="2012-06-14", country="1"; Сега нашата таблица има следните данни:


Вероятно сте забелязали, че не посочихме стойност за възраст, но се оказа, че е попълнена ... Всичко е правилно - за дадено полезадаваме по подразбиране 25. Така че сега нашият Иван Дулин е посочен в базата данни като 25-годишен. Може да не е най-добрият пример да направите стойност по подразбиране за полето за възраст, но можете да зададете свойства на такива полета като например оценката на потребителя на сайта или броя показвания на страници. Първоначално те са зададени на 0.

Трябва също да обърнете внимание на формата на датата в MySQL: ГГГГ-ММ-ДД. Ако не се придържате към него, вашите записи просто няма да бъдат включени в таблицата.

Както можете да видите, полето за професия е попълнено като NULL, това е празна стойност. за това поле.

Като допълнение помислете за следната команда:
ЗАРЕДЕТЕ ДАННИ ЛОКАЛЕН ВЪВ ФАЙЛ "D:\zapros.txt" В ТАБЛИЦА лица; Какво мислите, че направихме сега?! И направихме следното: добавихме данни към таблицата лицаот файл request.txt, който се намира на устройство D. Информацията във файла трябва да има следната структура:


Структурата на данните на файла трябва да отговаря на следните изисквания:
  1. Всеки нов запис трябва да бъде описан на нов ред.
  2. Данните трябва да бъдат посочени за абсолютно всички полета. Както можете да видите, посочихме NULL за полето id, тъй като имаме автоматично нарастване, така че MySQL сам ще въведе желаната стойност.
  3. Полетата са разделени едно от друго с табулатор (клавиш Tab).
  4. Въведената информация трябва да съответства на типовете данни на конкретното поле. Това е, например, дата във формат ГГГГ-ММ-ДД, цяло число за цяло число и т.н.
Така научихте как да въвеждате нови данни в таблиците на базата данни. За да консолидирате изучения материал, въведете сами следните данни:

Таблица с професии:

таблица с лица:

първо име фамилия възраст Дата на Регистрация държава професия
Леонид Билак 45 2012-06-20 2 1
Юрий Назаров 22 2012-06-21 3 1
Алла Савенко 25 2012-06-22 2 3
Ирина Николаева 31 2012-06-22 1 3

Не забравяйте да включите тези записи, тъй като ще ни трябват за нашето проучване. Изявление SELECT(избор на информация от базата данни), което ще разгледаме в следващата (четвърта) статия за изучаване на SQL заявки.

Понякога програмистите имат горещо желание да прочетат нещо от база данни. Програмистите стават нервни и раздразнителни, губят сън и трескаво бъркат с пръсти в клавиатурата. В името на по-доброто и световния мир, нека да разгледаме простата работа с база данни от C#, използвайки ADO.NET и OLE DB. Въпреки че този механизъм поддържа различни бази данни като Oracle, тук и сега ще използваме MS SQL сървър.

Две основни задачи при работа с база данни

2. Изпълнение на sql команда, която прави нещо на сървъра (вмъкване, актуализиране, изтриване, извикване на функция или съхранена процедура

3. Последователно четене от селекция-селекция ред по ред. Използва се главно в уеб приложения, в настолни приложения е по-лесно да изтеглите цялата селекция наведнъж RAM, спестяванията от четене само на редовете, от които се нуждаете, са незначителни.

4. Рядък случай. Автоматична актуализациятаблици в базата данни въз основа на промени в DataTable (обикновено редактирани чрез визуален интерфейс). В реалния живот данните обикновено се четат чрез сложна заявка с куп съединения или изглед, така че автоматичната синхронизация не е подходяща.

Основните класове, използвани за тези цели: OleDbConnection - връзка към базата данни, създаваме я с низ, съдържащ параметрите на връзката, отваряме я, затваряме я, OleDbCommand - създаваме я с екземпляр за връзка и sql команда, ако просто трябва да актуализирате или получите една стойност, тогава това е достатъчен клас, OleDbDataAdapter - създаден с OleDbCommand, специализиран в еднократно четене на набори от редове в DataTable, може автоматично да създава DataTable колони въз основа на селекция, прехвърля промени от DataTable към таблица в базата данни, OleDbDataReader - последователно четене на редове в DataTable един по един (работи вътрешно OleDbDataAdapter), DataTable / DataSet е основният контейнер за данни. Изброяването OleDbType съхранява типовете данни на базата данни.

Използване на System.Data; използване на System.Data.OleDb; // низ за свързване, използва се система Потребители на Windows(Integrated Security=SSPI;) string connString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=databaseName;Data Source=serverName"; // алтернативен низ за свързване, използващ удостоверяване на MS SQL Server // connString = "Provider=SQLOLEDB.1;Persist Security Info=False;Initial Catalog=databaseName;Connect Timeout=20;Data Source=serverName;Uid=userName;Pwd=userPassword ; " OleDbConnection dbConn = нов OleDbConnection(connString); dbConn.Open(); someDataTable = new DataTable(); OleDbDataAdapter dbAdapter = нов OleDbDataAdapter("изберете COLUMN1, COLUMN2 от TEST_TABLE ORDER BY COLUMN2", dbConn); // вътрешната структура на празна таблица ще бъде създадена автоматично въз основа на прочетените данни, ако структурата на таблицата вече е зададена (например чрез въведен DataSet), тогава данните ще бъдат записани в колони със същите имена или нови ще бъдат добавени колони dbAdapter.Fill(someDataTable); // алтернатива за попълване на таблица в DataSet // dbAdapter.Fill(someDataSet, "someDataTable"); dbConn.Close();

2. Изпълнение на sql команда, която прави нещо на сървъра (вмъкване, актуализиране, изтриване, извикване на функция или съхранена процедура.

Особено внимание заслужават проблемите с датите. Имплементацията на датите в .Net е изключително крива - първоначално датите не могат да бъдат празни, но в реалния живот са празни през цялото време. Повечето правилно решение- използвайте специален клас за дата, който коригира грешките на програмистите от Microsoft. По-мързеливите разработчици запазват всички дати в кода като низове и ги конвертират в DateTime само когато е необходимо, например, когато пишат в база данни или DataTable. Nullable DateTime не помага, тъй като празна дата в интерфейса трябва да изглежда като празен низ и когато се записва в базата данни като DBNull.Value - и баналната нула в кода не се преобразува в тези стойности без допълнителни танци с тамбура.

Първият вариант включва банално залепване на низа на заявката. Смята се за лоша практика и е особено опасно в уеб приложенията, тъй като е уязвимо за хакерски атаки. Проблемът с празните дати не се решава толкова лесно. Освен това при работа с дати се появява допълнителен проблем- различни формати на низове за дата в зависимост от регионалните настройки на .Net Framework, средата за разработка и sql сървъра. Може да изглежда сюрреалистично - същата заявка работи в SQL Management Studio, но се срива, когато се изпълнява от кода. Частично запазен от специалния формат на низа за дата, но това често се прави в малки програми за вътрешна употреба, за чието съществуване външният свят никога няма да разбере.

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "ВМЪКНЕТЕ В TEST_TABLE (INT_COLUMN, VARCHAR_COLUMN, DATETIME_COLUMN) VALUES (" + intVariable", " + stringVariable" , " + dateTimeVariable.ToString("yyyyMMdd") +""; dbCommand.ExecuteNonQuery();

Правилната опция включва създаване на команда с набор от строго въведени параметри. Помислете, че предишният параграф не беше.

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "ВМЪКНЕТЕ В TEST_TABLE (INT_COLUMN, VARCHAR_COLUMN, DATETIME_COLUMN) СТОЙНОСТИ (?, ?, ?)"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Value = intVariable; dbCommand.Parameters.Add("VARCHAR_COLUMN", OleDbType.VarChar).Value = stringVariable; if (stringDate == "") ( dbCommand.Parameters.Add("DATETIME_COLUMN", OleDbType.DateTime).Value =DBNull.Value; ) else ( dbCommand.Parameters.Add("DATETIME_COLUMN", OleDbType.DateTime).Value = Convert.ToDateTime(stringDate); ) dbCommand.ExecuteNonQuery();

Съхранената процедура се извиква по абсолютно същия начин, за промяна в името на друга опция за запис на стойности в параметри (не е свързана конкретно със съхранената процедура):

OleDbCommand someDbComm = new OleDbCommand("someStoredProcedure", this.dbConn); someDbComm.CommandType = CommandType.StoredProcedure; someDbComm.Parameters.Add("@параметър1", OleDbType.VarChar); someDbComm.Parameters.Add("@параметър2", OleDbType.VarChar); someDbComm.Parameters.Value = "Всеки проблем винаги има решение - просто, удобно и, разбира се, грешно"; someDbComm.Parameters.Value = "Хенри Луис Менкен"; someDbComm.ExecuteNonQuery(); !}

Разширена версия на описанието на параметъра, указваща размера на полето и обвързване към конкретна колона на таблица.

DbCommand.Parameters.Add("VARCHAR_COLUMN", OleDbType.VarChar, 100, "VARCHAR_COLUMN").Value = stringVariable;

Ако не е необходимо да обвързваме параметъра на командата с конкретно поле DataTable, тогава е най-добре да не указваме размера изобщо, например, ако низът е по-малък от указаната дължина на Varchar, тогава рамката good.Net ще добавете интервали до определената дължина към низа, повреждайки данните, предадени на сървъра.

Стойността на едно поле се чете от метода ExecuteScalar().

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "ИЗБЕРЕТЕ TEST_COLUMN FROM TEST_TABLE WHERE ID_COLUMN =?"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Value = intVariable; int резултат = Convert.ToInt32(dbCommand.ExecuteScalar());

Трябва специално да се отбележи, че ExecuteScalar връща Object и ако заявката не е върнала нищо, тогава резултатът ще бъде нулев и преобразуването към нормален тип данни ще се провали. Ако е възможна ситуация, когато не получаваме нищо в отговор, тогава трябва да направим следното:

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "ИЗБЕРЕТЕ TEST_COLUMN FROM TEST_TABLE WHERE ID_COLUMN =?"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Value = intVariable; обект resultObj = dbCommand.ExecuteScalar() int резултат = -1; // стойност по подразбиране, означаваща празен резултат if(resultObj != null) ( result = Convert.ToInt32(dbCommand.ExecuteScalar()); )

3. Последователно четене от селекция-селекция ред по ред
Четене на един ред (няколко се четат в цикъл);

OleDbCommand dbCommand = нова OleDbCommand(изберете PERSON_ID, ИМЕ, ФАМИЛИЯ от TEST_TABLE, dbConn); OleDbDataReader dbReader = dbCommand.ExecuteReader(); dbReader.Read(); име на низ = Convert.ToString(dbReader["NAME"]); низ фамилия = Convert.ToString(dbReader["ФАМИЛИЯ"]); dbReader.Close();

4. Рядък случай. Автоматична актуализация на таблицата в базата данни въз основа на промени в DataTable (обикновено редактирана чрез визуален интерфейс).

Необходимо е да се напишат четири команди за DbAdapter за всеки възможен случай - изберете, вмъкнете, актуализирайте, изтрийте.

DbAdapter.InsertCommand = new OleDbCommand("вмъкване в TEST_TABLE (ИМЕ, СЕМЕЙСТВО, ВЪЗРАСТ) стойности (?, ?, ?)", dbConnection); dbAdapter.InsertCommand.Parameters.Add("ИМЕ", OleDbType.VarChar, 100, "ИМЕ"); dbAdapter.InsertCommand.Parameters.Add("FAMIL", OleDbType.VarChar, 100, "FAMIL"); // за типове данни с постоянна дължина дължината, указана в командата, се игнорира dbAdapter.InsertCommand.Parameters.Add("AGE", OleDbType.Integer, 100, "AGE"); // добавяне на команда за актуализиране dbAdapter.UpdateCommand = new OleDbCommand("актуализиране на TEST_TABLE set NAME = ?, FAMIL = ?, AGE = ? където ID =?", dbConnection); dbAdapter.UpdateCommand.Parameters.Add("ИМЕ", OleDbType.VarChar,100, "ИМЕ"); dbAdapter.UpdateCommand.Parameters.Add("FAMIL", OleDbType.VarChar, 100, "FAMIL"); dbAdapter.UpdateCommand.Parameters.Add("AGE", OleDbType.Integer, 100, "AGE"); dbAdapter.UpdateCommand.Parameters.Add("ID", OleDbType.Integer, 100, "ID"); // добавяне на команда за изтриване dbAdapter.DeleteCommand = new OleDbCommand("изтриване от TEST_TABLE, където ID =?", dbConnection); dbAdapter.DeleteCommand.Parameters.Add("ID", OleDbType.Integer, 100, "ID"); try ( // прехвърля всички промени от DataTable към таблицата в базата данни dbAdapter.Update(table); ) catch (Грешка при изключение) ( MessageBox.Show("Грешка при запазване на данни!" + error.Message); return; ) MessageBox Show("Промените са запазени!");



Съдържанието на статията
1. Най-простите MySQL заявки
2. Прости SELECT заявки
3. Прости заявки INSERT (нов запис).
4. Прости заявки за АКТУАЛИЗИРАНЕ (презаписване, добавяне).
5. Обикновени заявки за ИЗТРИВАНЕ (изтриване на запис).
6. Прости DROP (изтриване на таблица) заявки
7. Комплекс MySQLзаявки
8. MySQL заявки и PHP променливи

1. Най-простите SQL заявки

1. Ще изброи ВСИЧКИ бази.

SHOW бази данни;
2. Изброява ВСИЧКИ таблици в базата данни base_name.

ПОКАЗВАНЕ на таблици в base_name;

2. Прости SELECT (избор) заявки към MySQL базата данни

ИЗБЕРЕТЕ- заявка, която избира вече съществуващи данни от базата данни. Можете да зададете определени опции за избор. Например, същността на заявката на руски звучи така - ИЗБЕРЕТЕ такива и такива колони ОТ такава и такава таблица, КЪДЕ параметърът на такава и такава колона е равен на стойността.

1. Избира ВСИЧКИ данни в таблицата tbl_name.

SELECT * FROM tbl_name;
2. Показва броя на записите в таблицата tbl_name.

SELECT count(*) FROM tbl_name;
3. Избира (SELECT) от (FROM) таблица tbl_name limit (LIMIT) 3 записа, започвайки от 2.

SELECT * FROM tbl_name LIMIT 2,3;
4. Избира (SELECT) ВСИЧКИ (*) записи от (FROM) таблица tbl_name и ги сортира (ORDER BY) по полето id по ред.

SELECT * FROM tbl_name ORDER BY id;
5. Избира (SELECT) ВСИЧКИ записи от (FROM) таблица tbl_name и ги сортира (ORDER BY) по полето id в ОБРАТЕН ред.

SELECT * FROM tbl_name ORDER BY id DESC;
6. Избира ( ИЗБЕРЕТЕ) ВСИЧКИ (*) записи от ( ОТ) таблици потребителии ги подреди ( ПОДРЕДЕНИ ПО) на игрището документ за самоличноствъв възходящ ред, ограничение ( ОГРАНИЧЕНИЕ) първите 5 записа.

SELECT * FROM потребители ORDER BY id LIMIT 5;
7. Избира всички записи от таблицата потребители, където полето fnameсъответства на стойността Гена.

SELECT * FROM потребители WHERE fname="Gena";
8. Избира всички записи от таблицата потребители, където стойността на полето fnameЗапочни с Ge.

SELECT * FROM потребители WHERE fname LIKE "Ge%";
9. Избира всички записи от таблицата потребители, Където fnameзавършва със наи сортира записите във възходящ ред на стойност документ за самоличност.

SELECT * FROM потребители WHERE fname LIKE "%na" ORDER BY id;
10. Избира всички данни от колони fname, имеот масата потребители.

SELECT fname, lname FROM потребители;

11. Да приемем, че имате държава във вашата таблица с потребителски данни. Така че, ако искате да покажете САМО списък от срещащи се стойности (така че, например, Русия да не се показва 20 пъти, а само един), тогава използвайте DISTINCT. Той ще изведе от масата на повтарящите се стойности Русия, Украйна, Беларус. И така от масата потребителиколони държаваЩе бъдат показани ВСИЧКИ УНИКАЛНИ стойности

ИЗБЕРЕТЕ ОТДЕЛНА държава ОТ потребители;
12. Избира ВСИЧКИ редови данни от таблицата потребителиКъдето възрастима стойности 18,19 и 21.

SELECT * FROM потребители WHERE възраст IN (18,19,21);
13. Избира МАКСИМАЛНА стойност възрастна масата потребители. Тоест, ако имате най-високата стойност в таблицата възраст(от английски age) е 55, тогава резултатът от заявката ще бъде 55.

ИЗБЕРЕТЕ max(age) FROM потребители;
14. Изберете данни от табл потребителипо полета имеИ възрастКЪДЕТО възрастприема най-малка стойност.

ИЗБЕРЕТЕ име, мин. (възраст) ОТ потребители;
15. Изберете данни от табл потребителина игрището имеКЪДЕТО документ за самоличностНЕ Е РАВНО НА 2.

ИЗБЕРЕТЕ име ОТ потребители WHERE id!="2";

3. Прости заявки INSERT (нов запис).

ВМЪКНЕТЕ– заявка, която ви позволява ПЪРВОНАЧАЛНО да вмъкнете запис в базата данни. Тоест създава НОВ запис (ред) в базата данни.

1. Прави нов записна масата потребители, в полето имевмъква Сергей и в полето възраствмъква 25. Така таблицата е добавена нова линияс тези стойности. Ако има повече колони, останалите ще останат празни или със стойности по подразбиране.

INSERT INTO потребители (име, възраст) VALUES ("Сергей", "25");

4. Прости заявки за UPDATE към MySQL базата данни

АКТУАЛИЗИРАНЕ- заявка, която ви позволява да ЗАМЕНИТЕ стойностите на полето или да добавите нещо към вече съществуващ ред в базата данни. Например, има готов низ, но параметърът възраст трябва да бъде презаписан в него, тъй като той се е променил с времето.

1. Маса потребители възрастстава на 18.

UPDATE потребители SET age = "18" WHERE id = "3";
2. Всичко е същото като при първата заявка, само показва синтаксиса на заявката, където две или повече полета са презаписани.
Таблица потребители WHERE id е стойност от 3 полета възрастстава на 18 и държаваРусия.

UPDATE потребители SET възраст = "18", държава = "Русия" WHERE id = "3";

5. Прости DELETE (премахване на запис) заявки към MySQL база данни

ИЗТРИЙе заявка, която премахва ред от таблица.

1. Премахва ред от таблица потребителиКЪДЕТО документ за самоличносте равно на 10.

ИЗТРИВАНЕ ОТ потребители WHERE id = "10";

6. Прости DROP (изтриване на таблица) заявки към MySQL база данни

ИЗПУСКАЙТЕе заявка, която изтрива таблица.

1. Изтрива цялата таблица tbl_name.

DROP TABLE tbl_name;

7. Сложни MySQL заявки към бази данни

Любопитни заявки, които дори опитни потребители могат да използват

ИЗБЕРЕТЕ идентификатор, име, държава ОТ потребители, администратори WHERE TO_DAYS(NOW()) - TO_DAYS(registration_date)<= 14 AND activation != "0" ORDER BY registration_date DESC;
Тази сложна заявка ИЗБИРА колони ID, име, държаваВ ТАБЛИЦИ потребители, администраториКЪДЕТО Дата на Регистрация(дата) не по-стара от 14 дни и активиранеНЕ Е РАВНО 0 , Сортиране по Дата на Регистрацияв обратен ред (ново в началото).

UPDATE потребители SET възраст = "18+" WHERE възраст = (ИЗБЕРЕТЕ възраст ОТ потребители WHERE мъж = "мъж");
Горното е пример за т.нар заявка в заявкав SQL. Актуализирайте възрастта сред потребителите на 18+, където полът е мъж. Не препоръчвам този тип заявка. От личен опит ще кажа, че е по-добре да създадете няколко отделни - те ще бъдат отработени по-бързо.

8. MySQL и PHP заявки към бази данни

В MySQL заявки в PHP страница можете да вмъквате променливи като стойности за сравнение и т.н. Няколко примера

1. Избира всички записи от таблицата потребители, където полето fnameсъответства на стойността на променливата $име.

SELECT * FROM потребители WHERE fname="$name";
2. Маса потребители WHERE id е стойност от 3 полета възрастпроменя стойността на променливата $age.

UPDATE потребители SET age = "$age" WHERE id = "3";

внимание!Ако се интересувате от друг пример, напишете въпрос в коментарите!

Изтриване на записи

Операторът DELETE се използва за премахване на записи от таблица:

DELETE FROM tablename WHERE условие;

Този оператор премахва от указаната таблица записи (не отделни стойности на колони), които отговарят на определеното условие. Условието е логически израз, чиито различни конструкции бяха обсъдени в предишни лабораторни упражнения.

Следната заявка премахва записи от таблицата Customer, в която стойността на колоната LName е "Ivanov":

ИЗТРИВАНЕ ОТ Клиент

WHERE LName = "Иванов"

Ако таблицата съдържа информация за няколко клиента с фамилно име Иванов, всички те ще бъдат изтрити.

Клаузата WHERE може да съдържа подзаявка за избор на данни (изявлението SELECT). Подзаявките в оператор DELETE работят точно по същия начин, както в оператор SELECT. Следната заявка премахва всички клиенти от град Москва, като уникалният идентификатор на града се връща с помощта на подзаявка.

ИЗТРИВАНЕ ОТ Клиент

WHERE IdCity IN (SELECT IdCity FROM City WHERE CityName = "Москва")

Transact-SQL разширява стандартния SQL, като ви позволява да използвате друга клауза FROM в оператор DELETE. Това разширение, което указва присъединяване, може да се използва вместо подзаявка в клаузата WHERE за указване на редовете, които да бъдат изтрити. Тя ви позволява да зададете данни от втория FROM и да премахнете съответните редове от таблицата в първата клауза FROM. По-специално, предишната заявка може да бъде пренаписана, както следва

ИЗТРИВАНЕ ОТ Клиент

ОТ Клиент k ВЪТРЕШНО СЪЕДИНЯВАНЕ

Операцията по изтриване на записи от таблица е опасна в смисъл, че е свързана с риск от необратима загуба на данни в случай на семантични (но не и синтактични) грешки във формулирането на SQL израза. За да избегнете проблеми, преди да изтриете записи, се препоръчва първо да изпълните подходящата заявка за избор, за да видите кои записи ще бъдат изтрити. Така например, преди да изпълните заявката за изтриване, обсъдена по-рано, няма да навреди да изпълните съответната заявка за избор.

ИЗБЕРЕТЕ *

ОТ Клиент k ВЪТРЕШНО СЪЕДИНЯВАНЕ

Град c ON k.IdCity = c.IdCity И c.CityName = "Москва"

За да премахнете всички записи от таблица, просто използвайте командата DELETE без ключовата дума WHERE. В същото време самата таблица с всички дефинирани в нея колони е запазена и готова за вмъкване на нови записи. Например следната заявка премахва записи за всички продукти.

ИЗТРИВАНЕ ОТ ПРОДУКТА

Задача за самостоятелна работа:Формулирайте в SQL заявка за изтриване на всички поръчки, които не съдържат стоки (т.е. всички празни поръчки).

Операторът INSERT вмъква нови записи в таблица. В този случай стойностите на колоните могат да бъдат буквални константи или да бъдат резултат от подзаявка. В първия случай се използва отделен оператор INSERT за вмъкване на всеки ред; във втория случай ще бъдат вмъкнати толкова редове, колкото са върнати от подзаявката.

Синтаксисът на оператора е както следва:

    ВМЪКНЕТЕ В[(,...)]

    (СТОЙНОСТИ(,…) )

  1. | ( СТОЙНОСТИ ПО ПОДРАЗБИРАНЕ )

Както можете да видите от представения синтаксис, списъкът с колони не е задължителен (квадратните скоби в описанието на синтаксиса показват това). Ако липсва, списъкът с вмъкнати стойности трябва да е пълен, т.е. да предостави стойности за всички колони на таблицата. Редът на стойностите трябва да съвпада с реда, определен от оператора CREATE TABLE за таблицата, в която се вмъкват редовете. Освен това тези стойности трябва да са от същия тип данни като колоните, в които са въведени. Като пример, помислете за вмъкване на ред в таблицата с продукти, създадена от следния оператор CREATE TABLE:

    CREATE TABLE продукт

    maker char (1) NOT NULL,

    модел varchar(4) NOT NULL,

    тип varchar(7) NOT NULL

Нека се изисква към тази таблица да се добави PC модел 1157 на производител B. Това може да стане чрез следното изявление:

    ВМЕСТЕ В ПРОДУКТА

    СТОЙНОСТИ ("B", 1157, "PC");

Ако зададете списък с колони, можете да промените "естествения" ред на тяхната последователност:

    INSERT INTO Продукт (тип, модел, производител)

    СТОЙНОСТИ ("PC", 1157, "B");

Изглежда, че това е напълно ненужна функция, която само прави дизайна по-тромав. Печели обаче, ако колоните имат стойности по подразбиране. Разгледайте следната структура на таблицата:

    СЪЗДАВАНЕ НА ТАБЛИЦА product_D

    maker char (1) NULL,

    модел varchar(4) NULL,

    тип varchar (7) NOT NULL DEFAULT "PC"

Имайте предвид, че тук стойностите на всички колони имат стойности по подразбиране (първите две са NULL, а последната колона е тип - PC). Сега можем да напишем:

    INSERT INTO Product_D(модел, производител)

    VALUES(1157 , "B" ) ;

В този случай липсващата стойност ще бъде заменена от стойността по подразбиране PC, когато се вмъкне ред. Обърнете внимание, че ако не е указана стойност по подразбиране за колона в оператор CREATE TABLE и не е посочено ограничение NOT NULL, което забранява използването на NULL в тази колона на таблицата, тогава се подразбира стойността по подразбиране NULL.

Възниква въпросът: възможно ли е да не посочите списък с колони и въпреки това да използвате стойностите по подразбиране? Отговорът е да. За да направите това, вместо изрично да посочите стойност, използвайте запазената дума DEFAULT:

    INSERT INTO Product_D

    СТОЙНОСТИ ("B", 1158, ПО ПОДРАЗБИРАНЕ);

Тъй като всички колони имат стойности по подразбиране, за да вмъкнете ред със стойности по подразбиране, можете да напишете:

    INSERT INTO Product_D

    СТОЙНОСТИ (ПО ПОДРАЗБИРАНЕ , ПО ПОДРАЗБИРАНЕ , ПО ПОДРАЗБИРАНЕ ) ;

Има обаче специална конструкция DEFAULT VALUES за този случай (вижте синтаксиса на оператора), която може да се използва за пренаписване на горния оператор като

    INSERT INTO Product_D ПО ПОДРАЗБИРАНЕ СТОЙНОСТИ;

Имайте предвид, че когато вмъквате ред в таблица, всички ограничения, наложени на тази таблица, се проверяват. Това могат да бъдат ограничения за първичен ключ или уникален индекс, ограничения за проверка на тип CHECK, ограничения за референтна цялост. Ако някое ограничение е нарушено, вмъкването на реда ще бъде отхвърлено. Помислете сега за случая с използване на подзаявка. Да предположим, че искаме да вмъкнем в таблицата Product_D всички редове от таблицата Product, свързани с моделите на персонални компютри (type = 'PC'). Тъй като стойностите, от които се нуждаем, вече са в някаква таблица, формирането на вмъкнати редове ръчно, първо, е неефективно и, второ, може да позволи грешки при въвеждане. Използването на подзаявка решава тези проблеми:

Използването на символа "*" в подзаявката е оправдано в този случай, тъй като редът на колоните е еднакъв и за двете таблици. Ако това не беше така, ще трябва да се приложи списък от колони или в израза INSERT, или в подзаявката, или и двете, което ще съответства на реда на колоните:

Тук, както и преди, можете да посочите не всички колони, ако искате да използвате съществуващите стойности по подразбиране, например:

В този случай колоната тип на таблицата Product_D ще бъде зададена на стойността по подразбиране PC за всички вмъкнати редове.

Обърнете внимание, че когато използвате подзаявка, съдържаща предикат, ще бъдат вмъкнати само онези редове, за които стойността на предиката е TRUE (а не UNKNOWN!). С други думи, ако колоната тип в таблицата Product беше nullable и тази стойност присъстваше в няколко реда, тези редове нямаше да бъдат вмъкнати в таблицата Product_D.

За да се преодолее ограничението за вмъкване на един ред в оператор INSERT, когато се използва конструктор на ред в клауза VALUES, изкуствен трик е да се използва подзаявка, която формира ред с клауза UNION ALL. Така че, ако трябва да вмъкнем няколко реда с един оператор INSERT, можем да напишем:

    INSERT INTO Product_D

    SELECT "B" AS maker, 1158 AS модел, "PC" AS тип

    СЪЮЗ ВСИЧКИ

    ИЗБЕРЕТЕ "C", 2190, "Лаптоп"

    СЪЮЗ ВСИЧКИ

    ИЗБЕРЕТЕ "D", 3219, "Принтер";

Използването на UNION ALL е за предпочитане пред UNION, дори ако е гарантирано, че няма да има дублиращи се редове, тъй като в този случай няма да има проверка за дубликати.

Трябва да се отбележи, че вмъкването на множество кортежи с помощта на конструктора на низ вече е реализирано в Система за управление на релационни бази данни (СУБД), разработена от Microsoft Corporation.Езикът за структурирани заявки е компютърен език с общо предназначение, използван за създаване, модифициране и манипулиране на данни в релационни бази данни. SQL сървър 2008. Като се има предвид тази възможност, последната заявка може да бъде пренаписана като:

    INSERT INTO Product_D VALUES

    ("B", 1158, "PC"),

    ("C", 2190, "Лаптоп"),