Типы данных в SQL Server

Точные числа

bigint, numeric, bit, smallint, decimal, smallmoney, int, tinyint, money

Символьные строки в Юникоде

nchar, nvarchar, ntext

Приблизительные числа

float, real

Двоичные данные

binary, varbinary, image

Дата и время

Date, datetimeoffset, datetime2, smalldatetime, datetime, time

Прочие типы данных

cursor , timestamp, hierarchyid, uniqueidentifier, sql_variant, xml, table,

Пространственные типы , Символьные строки

---------

типы данных больших значений: varchar(max), nvarchar(max) и varbinary(max).

Типы данных больших объектов: text, ntext, image, varchar(max), nvarchar(max), varbinary(max) и xml

------ hierarchyid

Тип данных hierarchyid является системным типом данных переменной длины. Тип данных hierarchyid используется для представления положения в иерархии. Столбец типа hierarchyid не принимает древовидную структуру автоматически. Приложение должно создать и назначить значения hierarchyid таким образом, чтобы они отражали требуемые связи между строками.

Значение типа данных hierarchyid представляет позицию в древовидной иерархии. Значения hierarchyid обладают следующими свойствами.

Чтобы передать параметры типа данных hierarchyid по протоколу SOAP, вначале нужно преобразовать их в строки. Для преобразования типа данных hierarchyid в тип varbinary используются методы Read () и Write ().

Hабор методов для типа данных Transact-SQL hierarchyid и класса SqlHierarchyId среды CLR: GetAncestor, GetDescendant , GetLevel, GetRoot, IsDescendantOf, Parse, Read, GetReparentedValue, ToString, Write

Функции преобразования

CAST и CONVERT

Syntax for CAST: CAST ( expression AS target_data_type [ ( length ) ] )

Syntax for CONVERT: CONVERT ( target_data_type [ ( length ) ] , expression [ , style ] )

----------------

DECLARE @myval decimal (5, 2);

SET @myval = 193.57;

CAST(@myval AS varbinary(20)) AS decimal(10,5);

-- Or, using CONVERT

CONVERT(varbinary(20), @myval);

PARSE - Возвращает результат выражения, преобразованный в требуемый тип данных SQL

Используйте инструкцию PARSE только для преобразования данных из строкового типа в типы даты или времени и числовой тип

PARSE ( string_value AS target_data_type [ USING culture ] )

TRY_CAST , TRY_CONVERT , TRY_PARSE

- Возвращает значение, приведенное к указанному типу, если приведение проходит успешно; в противном случае возвращает NULL.

GETDATE () - Возвращает текущую системную отметку времени в виде datetime

CHOOSE ( index, val_1, val_2 [, val_n ] ) - Возвращает элемент по указанному индексу из списка значений , index - отсчитываемый от 1 индекс в списке элементов, следующих за ним.

IIF ( boolean_expression, true_value, false_value ) - возвращает одно из двух значений в зависимости от того, принимает логическое выражение значение true или false.

CEILING - Возвращает наименьшее целое число, которое больше или равно данному числовому выражению. CEILING($123.45) =124.00

FLOOR ( numeric_expression ) - Возвращает наибольшее целое число, меньшее или равное указанному числовому выражению.

POWER ( float_expression , y ) - возвращает значение указанного выражения, возведенное в заданную степень.

DATALENGTH ( expression ) - Возвращает число байтов, использованных для представления выражения.

REPLACE ( string_expression , string_pattern , string_replacement ) - Заменяет все вхождения указанного строкового значения другим строковым значением.

REPLICATE ( string_expression ,integer_expression ) - Повторяет значение строки указанное число раз.

SUBSTRING ( expression ,start , length ) - Возвращает часть символьного, двоичного, текстового или графического выражения

STUFF ( character_expression , start , length , replaceWith_expression ) - вставляет одну строку в другую. Она удаляет указанное количество символов первой строки в начальной позиции и вставляет на их место вторую строку.

PATINDEX ( '%pattern%' , expression ) - возвращает начальную позицию первого вхождения шаблона в указанном выражении или нули, если шаблон не найден.

SELECT PATINDEX('%en_ure%', 'please ensure the door is locked'); = 8

LEN ( string_expression ) - Возвращает количество символов указанного строкового выражения, исключая конечные пробелы.

LEFT ( character_expression , integer_expression ) - Возвращает указанное число символов символьного выражения слева. RIGHT - справа.

DIFFERENCE ( character_expression , character_expression ) - Возвращает целочисленную разницу между значениями SOUNDEX двух символьных выражений

SOUNDEX ( character_expression ) - четырехсимвольный код для оценки степени сходства двух строк. Коды SOUNDEX из разных строк можно сравнивать, чтобы узнать, насколько похоже звучат строки при произношении. Функция DIFFERENCE выполняет SOUNDEX по двум строкам и возвращает целое число, представляющее сходство кодов SOUNDEX для этих строк.

ISNULL ( check_expression , replacement_value ) - если check_expression равно NULL Заменяет значение указанным замещающим значением.

ISNUMERIC ( expression ) - возвращает 1 если допустимый числовой тип

NEWID ( ) - Создает уникальное значение типа uniqueidentifier.



================ ОБЪЕДИНЕНИЯ ==============

LEFT OUTER JOIN - ключевое слова указавают , что из таблицы слева надо взять все строки, и поменяли ключевое слово WHERE на ON. Кроме ключевого слова LEFT OUTER JOIN может быть использовано ключевое слово RIGHT OUTER JOIN. Тогда будут выбираться все строки из правой таблицы и имеющиеся связанные с ними из левой таблицы. И наконец, возможно полное внешнее объединение, которое извлечет все строки из обеих таблиц и свяжет между собой те, которые могут быть связаны. Ключевое слово для полного внешнего объединения - FULL OUTER JOIN.

SELECT имя_таблицы_1.имя_столбца, имя_таблицы_2.имя_столбца

FROM имя_таблицы_1 ТИП ОБЪЕДИНЕНИЯ имя_таблицы_2

ON условие_объединения;

---------------Группировка записей и функция COUNT() -------------------

SELECT id_topic, COUNT(id_topic)

FROM posts

GROUP BY id_topic;

Оператор GROUP BY указывает СУБД сгруппировать данные по столбцу id_topic (т.е. каждая тема - отдельная группа) и для каждой группы подсчитать количество строк:

SELECT id_topic, COUNT(id_topic)

FROM posts

GROUP BY id_topic

HAVING COUNT(id_topic) > 2;

нас интересуют только те группы, в которых больше двух сообщений. В обычном запросе мы указали бы условие с помощью оператора WHERE, но этот оператор умеет работать только со строками, а для групп те же функции выполняет оператор HAVING:



Использование оператора EXISTS

Оператор EXISTS берет подзапрос, как аргумент, и оценивает его как верный, если подзапрос возвращает какие-либо записи и неверный, если тот не делает этого. Например, мы можем решить извлекать ли нам некторые данные из таблицы Заказчиков, если один и более заказчиков в этой таблице находятся в Москве.

SELECT cnum, cname, city

FROM Customers

WHERE EXISTS (

SELECT *

FROM Customers

WHERE city = 'Москва'

)

NOT EXISTS - вариант использования

SELECT DISTINCT snum

FROM Customers couter

WHERE NOT EXISTS (

SELECT *

FROM Customers cinner

WHERE cinner.snum = couter.snum

AND cinner.cnum <> couter.cnum

)

Один из способов нахождения продавцов только с одним заказчиком состоит в том, что предыдущий запрос инвертируется:

Оператор ANY берет все значения, выведенные подзапросом, и оценивает их как верные, если любое из них равняется значению города в текущей строке внешнего запроса. Это означает, что подзапрос должен выбирать значения такого же типа как и те, которые сравниваются в основном условии.



В приведенном выше запросе можно было бы использовать оператор IN. Однако оператор ANY можно применять не только с оператором равенства. Например, можно найти всех агентов, у которых заказчики следуют им в алфавитном порядке:

SELECT *

FROM Salespeople

WHERE sname < ANY ( SELECT cname FROM Customers )

Результат:

SNUM SNAME CITY COMM

----- -------- ---------- -----

1001 Иванов Москва 12

1002 Петров Хабаровск 13

1003 Егоров Караганда 10

1004 Сидоров Сочи 11



Оператор ALL считает условие верным, если каждое значение, выбранное подзапросом, удовлетворяет условию внешнего запроса. Выберем тех заказчиков, чьи рейтинги выше чем у каждого заказчика в Москве:



SELECT *

FROM Customers

WHERE rating > ALL(

SELECT rating

FROM Customers

WHERE city = 'Москва'

)

========================= Триггеры =============================

особая разновидность хранимой процедуры, выполняемая автоматически при возникновении события на сервере базы данных.

-- SQL Server Syntax

Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)

CREATE TRIGGER [ schema_name . ]trigger_name

ON { table | view }

[ WITH <dml_trigger_option> [ ,...n ] ]

{ FOR | AFTER | INSTEAD OF }

{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }

[ WITH APPEND ]

[ NOT FOR REPLICATION ]

AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }

<dml_trigger_option> ::=

[ ENCRYPTION ]

[ EXECUTE AS Clause ]

<method_specifier> ::=

assembly_name.class_name.method_name

CREATE TRIGGER - Создает триггер языка обработки данных, DDL или входа. UPDATE ( column ) - Возвращает логическое значение, указывающее на попытку применить функцию INSERT или UPDATE

UPDATE (StateProvinceID) OR UPDATE (PostalCode)

EVENTDATA - Возвращает сведения (XML-данные) о событиях сервера или базы данных. Функция вызывается при уведомлении о событии, а результаты ее работы возвращаются указанному компоненту Service Broker. Кроме того, ее можно использовать в теле триггера DDL или триггера входа.



CREATE DATABASE (база данных SQL Azure)

CREATE DATABASE database_name [ COLLATE collation_name ]

{

(<edition_options> [, ...n])

}

<edition_options> ::=

{

MAXSIZE = { 100 MB | 500 MB | 1 | 5 | 10 | 20 | 30 … 150…500 } GB

| EDITION = { 'web' | 'business' | 'basic' | 'standard' | 'premium' }

| SERVICE_OBJECTIVE = { 'shared' | 'basic' | 'S0' | 'S1' | 'S2' | 'P1' | 'P2' | 'P3' }

}

[;]

-------------------

To copy a database:

CREATE DATABASE destination_database_name

AS COPY OF [source_server_name.] source_database_name

[;]



=================================================================

SELECT [ ALL | DISTINCT ] <Список полей> или * столбцы, возвращаемые запросом

[ TOP ( expression ) [ PERCENT ] [ WITH TIES ] ] - Указывает на то, что только заданное число или процент строк будет возвращен из результирующего набора запроса. expression может быть либо числом, либо процентом от числа строк.

[FROM <Список таблиц>]

[WHERE <Условие отбора>]

[GROUP BY <Список полей для группирования> [ASC | DESC], ...]

[HAVING <Условие группирования>]

[ORDER BY <Список полей для сортировки> [ASC | DESC], ...]

=====================================

SELECT * FROM users; * выбор всех столбцов таблицы.

SELECT id_user FROM users; только столбец id_user

SELECT name, email FROM users; имена и e-mail пользователей

SELECT DISTINCT - Если требуется получить только уникальные строки

SELECT имя_столбца FROM имя_таблицы ORDER BY имя_столбца_сортировки;

По умолчанию сортировка идет по возрастанию, но это можно изменить, добавив ключевое слово DESC

SELECT * FROM topics ORDER BY topic_name DESC;

запрос отсортирует данные по столбцу topic_name по убыванию:

SELECT * FROM topics ORDER BY topic_name DESC, id_author DESC;

запрос отсортирует данные по столбцу topic_name, и если в этом столбце будет несколько одинаковых строк, то в столбце id_author будет осуществлена сортировка по убыванию:

SELECT имя_столбца FROM имя_таблицы WHERE условие;

SELECT * FROM topics WHERE id_author=4;

SELECT * FROM topics WHERE topic_name='велосипеды';

WHERE Operators =, <, >, >=, <=, !=, IS NULL, IS NOT NULL, BETWEEN x AND y, IN(x,y),

NOT IN(x,y), LIKE 'str%', NOT LIKE 'str%' ; % - метасимвол (любые символы)

Метасимволы оператора LIKE

% - любые символы

_ нижнее подчеркивание обозначает ровно один символ

SELECT *FROM topics WHERE topic_name LIKE '_ рыб%'; - "о рыбалке"

метасимвол _ обозначает ровно один символ и пробел - это тоже символ

если пропустить пробел между метасимволом и "рыб", то запрос не сработает

Вложенный запрос

SELECT имя_столбца FROM имя_таблицы WHERE часть условия

IN (SELECT имя_столбца FROM имя_таблицы WHERE часть условия

IN (SELECT имя_столбца FROM имя_таблицы WHERE условие) ) ;

подзапросы могут выбирать только один столбец, значения которого они будут возвращать внешнему запросу

SELECT message FROM posts WHERE id_author IN

(SELECT id_autthor FROM topics WHERE topic_name='велосипеды');

Объединение таблиц (внутреннее объединение)

SELECT имена_столбцов_таблицы1, имена_столбцов_таблицы2

FROM имя_таблицы1, имя_таблицы2; - декартово произведение, когда каждой строке первой таблицы ставится в соответствие каждая строка второй таблицы.

-------------

SELECT имя_таблицы1.имя_столбца1, имя_таблицы1.имя_столбца2 ,

имя_таблицы2.имя_столбца1, имя_таблицы2.имя_столбца2

FROM имя_таблицы_1, имя_таблицы_2

WHERE имя_таблицы_1.имя_столбца_по_которому_объединяем

= имя_таблицы_2.имя_столбца_по_которому_объединяем; - корректный синтаксис объединения

Объединение таблиц (внешнее объединение)

SELECT имя_таблицы1.имя_столбца, имя_таблицы2.имя_столбца

FROM имя_таблицы_1 ТИП ОБЪЕДИНЕНИЯ имя_таблицы_2

ON условие_объединения;

LEFT OUTER JOIN - из таблицы слева надо взять все строки

RIGHT OUTER JOIN - выбираться все строки из правой таблицы

меняем ключевое слово WHERE на ON

SELECT users.name, topics.topic_name

FROM users LEFT OUTER JOIN topics

ON users.id_user=topics.id_author;

------------

SELECT users.name, topics.topic_name

FROM users RIGHT OUTER JOIN topics

ON users.id_user=topics.id_author;

=======

SELECT Customers.ContactName, OrderDetails.Quantity, Customers.City, Customers.Address, Orders.OrderDate

FROM Orders, Customers, OrderDetails

WHERE Orders.CustomerID = Customers.CustomerID

AND Customers.City LIKE "L%"

AND Orders.OrderID = OrderDetails.OrderID;

==========

COUNT(*) Возвращает количество строк источника записей

COUNT Возвращает количество значений в указанном столбце

SUM Возвращает сумму значений в указанном столбце

AVG Возвращает среднее значение в указанном столбце

MIN Возвращает минимальное значение в указанном столбце

MAX Возвращает максимальное значение в указанном столбце

WHERE фильтрует строки, а HAVING - группы

UNION

COALESCE

CAST('1000' AS MONEY) - преобразование типа данных

WHERE PC.cd IN ('12x', '24x') - будет ли значение проверяемого выражения обнаружено в наборе значений

BETWEEN

FROM Product JOIN Laptop

ON Product.model = Laptop.model

=================================

итоговые функции:

COUNT - количество значений в указанном столбце

SUM - сумма значений в указанном столбце

AVG - среднее значение в указанном столбце

MIN - минимальное значение в указанном столбце

MAX - максимальное значение в указанном столбце

==========================================

SELECT Customers.CustomerID, COUNT(Orders.OrderID) as Qt

FROM Customers LEFT OUTER JOIN Orders

ON Customers.CustomerID=Orders.CustomerID

GROUP BY Customers.CustomerID;

----

SELECT Customers.CustomerID, COUNT(Orders.OrderID) as Qt

FROM Customers LEFT OUTER JOIN Orders

ON Customers.CustomerID=Orders.CustomerID

GROUP BY Customers.CustomerID

HAVING COUNT(Orders.OrderID)> 1;

-------

SELECT DISTINCT product.model,price

FROM product,pc

WHERE product.model = pc.model AND maker = 'B'

UNION

SELECT DISTINCT product.model,price

FROM product,laptop

WHERE product.model = laptop.model AND maker = 'B'

UNION

SELECT DISTINCT product.model,price

FROM product,printer

WHERE product.model = printer.model AND maker = 'B'

==============================

посчитать среднею цену для каждой модели компьютера, запрос такой:

SELECT model, AVG (price) AS ‘средняя цена’

FROM table

GROUP BY model

==============================

максимальную цену компа, сгруппированную по моделям этих компов, но максимальная цена, которых меньше 500:

SELECT model, MAX (price)

FROM table

GROUP BY model

HAVING MAX (price) < 500

-------------------------

FROM Product,

WHERE type = 'PC' AND

NOT IN(

SELECT

maker

FROM Product,

WHERE type = 'Laptop');



================ SQL запросы ==============

SQL запросы обычно выполняют следующие задачи:



создание, модификация и удаление таблиц базы данных;

вставка информации (записей) в таблицы базы данных;

редактирование информации (записей) в таблицах базы данных;

выборка (извлечение) информации из таблиц базы данных;

удаление информации (записей) из базы данных.



Для обзора всех этих функций sql запросов создадим и поэкспериментируем с базой данных пользователей. В этой базе данных будет 3 таблицы: пользователи (users), сообщения (messages) и заметки (notes). Эта база данных будет обслуживать сайт (вымышленный), на котором пользователи могут общаться между собой и оставлять для себя различные записи, вроде напоминаний. Данные о пользователе будут следующие: имя, фамилия, логин, пароль и электронный почтовый ящик.



Создание, модификация и удаление таблиц (и столбцов) базы данных.

Вначале, конечно, мы рассмотрим создание таблицы в базе данных, для этих целей используется sql запрос create. Вот его синтаксис:

1

CREATE TABLE название_таблицы (столбец1 тип_столбца параметры_столбца, и т.д.)



С помощью параметров столбца можно сделать его первичным или вторичным ключем, уникальным или неравным значению NULL, сделать автоинкремент (при добавлении следующей записи такой столбец будет увеличиваться на единицу) и т.д. Подробнее о параметрах и типах столбцов (типа данных, которые могут храниться в этих столбцах) вы можете прочесть по этой ссылке mysql.ru/docs/man/CREATE_TABLE.html.



Используем sql запрос create table для создания таблиц, соответствующих нашим требованиям:

/*Таблица пользователей users*/

create table users

(

/*Определяем user_id как первичный ключ (целое число) с

автоинкрементом (+1), который никогда не будет равен NULL*/

user_id integer not null auto_increment primary key,

user_name varchar(15), /*имя пользователя*/

user_surname varchar(20), /*фамилия пользователя*/

user_login varchar(20), /*логин пользователя в системе*/

user_passwd varchar(5), /*пароль пользователя в системе*/

user_email varchar(40) /*email пользователя в системе*/

);

/*Таблица сообщений messages*/

create table messages

(

mess_id integer not null auto_increment primary key,

/*создаем поле для первичного ключа пользователя, который отправил сообщение*/

user_id_author integer,

/*создаем еще одно поле для первичного ключа пользователя, который получил сообщение*/

user_id_receiver integer,

/*текст сообщения*/

mess_text varchar(300)

);

/*Таблица заметок notes*/

create table notes

(

note_id integer not null auto_increment primary key,

user_id integer,

note_text varchar(200)

);



Теперь давайте себе представим такую ситуацию: вам необходимо ввести правки в ранее созданные таблицы базы данных, есть два пути, первый — удалить старые таблицы и добавить новые (исправленные), второй — отредактировать таблицу sql запросом ALTER TABLE, который сохранит данные в таблицах (в отличие от первого метода) и выполнит нужную нам задачу. Для примера исправим таблицы messages и notes: 1 — добавим в них заголовок сообщения и название пометки соответственно, 2 — увеличим количество допустимых знаков в пароле пользователя до 20. Синтаксис команды ALTER TABLE выглядит следующим образом:

1

ALTER TABLE [IGNORE] название_таблицы опции_изменения_таблицы



[IGNORE] — эта опция не обязательна, она существует для защиты первичных ключей при редактировании таблицы, т.е. если при изменении таблицы возникает дублирование первичных ключей, то первая строка с этим первичным ключем остается в изменяемой таблице, а остальные ключи будут удалены. По умолчанию эта опция не указывается и если вы не совсем понимаете зачем она нужна, то лучше не применяйте ее в реальных проекта «на всякий случай».



Опций изменения таблиц очень много (более 25, поэтому я не буду здесь приводить описание каждой из них, а просто выполню требуемую задачу, подробнее об этих опциях можно узнать на сайте mysql.ru/docs/man/ALTER_TABLE.html), они позволяют сделать с таблицей все, что душе угодно: добавлять и удалять произвольное количество столбцов в любое место таблицы, изменять типы и название столбцов, переименовывать и удалять саму таблицу, преобразовывать наборы символов и т.д.



1. Добавляем дополнительные столбцы в таблицы messages и notes:

//изменяем таблицу messages путем добавления в нее

//столбца mess_title с типом данных внутри varchar(50),

//новый столбец будет располагаться после user_id_receiver

ALTER TABLE messages add mess_title varchar(50) after user_id_receiver

/*таким же образом редактируем таблицу notes*/

ALTER TABLE notes add note_name varchar(100) after user_id



2. Увеличиваем количество допустимых знаков в пароле пользователя до 20.

//редактируем таблицу users путем изменения

//поля user_passwd, заново прописываем тип

//и размер поля varchar(20)

ALTER TABLE users modify user_passwd varchar(20)



Вставка информации (записей) в таблицы базы данных.



После того как мы создали и немного отредактировали нашу базу данных, ее нужно заполнить информацией. Нам нужны пользователи, сообщения этих пользователей, направленные друг к другу и несколько заметок для экспериментов. Вставить информацию в базу данных можно с помощью sql запроса INSERT INTO, вот его синтаксис:

INSERT [LOW_PRIORITY или DELAYED] [IGNORE] [INTO] название_таблицы

(в скобках можно указывать список_колонок в которые нужно вставлять данные)

VALUES вставляемое_значение1, ...



[IGNORE] — описание этой опции смотрите выше.

[LOW_PRIORITY | DELAYED] — это приоритеты добавления информации в базу данных, LOW_PRIORITY — означает, что СУБД подождет удобного момента (когда она будет свободна от операций) для добавления информации, а опция DELAYED — означает, что данные будут буферизироваться. Все эти три параметра (IGNORE, LOW_PRIORITY и DELAYED) являются необязательными.



Для примера я заполню три наши таблицы разными способами, каким пользоваться, выбирать вам:

/*заполняем таблицу users пользователями вставкой всех полей сразу*/

insert into users values

(0, "User1", "User surname1", "User login1", "248jslefgwsg", "user1@mail.ru"),

(0, "User2", "User surname2", "User login2", "3hhsrgerghfd", "user2@mail.ru"),

(0, "User3", "User surname3", "User login3", "34ysergsdgfd", "user3@mail.ru"),

(0, "User4", "User surname4", "User login4", "sdfgsdghgfgs", "user4@mail.ru");

//вставляем записи в таблицу только в выбранные

//нами столбцы, здесь мы не указали столбец

//mess title, его поле будет пустым

//пользователь с user_id 1 (т.е. User1) отправляет

//пользователю с user_id 2 (т.е. User2) сообщение "Hello my friend."

insert into messages (mess_id, user_id_author, user_id_receiver, mess_text) values

(0, 1, 2, "Hello my friend.");

insert into messages (mess_id, user_id_author, user_id_receiver, mess_text) values

(0, 2, 1, "Hi.");

insert into messages (mess_id, user_id_author, user_id_receiver, mess_text) values

(0, 1, 2, "Good by");

//заполняем таблицу заметок, здесь мы тоже не

//будем заполнять столбец note_name, как и в предыдущем примере

/*добавляем три записи первому (User1) пользователю*/

insert into notes (note_id, user_id, note_text) values (0, 1, "Notes 1");

insert into notes (note_id, user_id, note_text) values (0, 1, "Notes 2");

insert into notes (note_id, user_id, note_text) values (0, 1, "Notes 3");



Редактирование информации (записей) в таблицах базы данных.

Редактировать записи в базе данных можно с помощью sql запроса UPDATE, вот его синтаксис:

UPDATE [LOW_PRIORITY] [IGNORE] название_таблицы set имя_столбца = новое_значение, .....

[WHERE - условная под которые подпадают изменяемые столбцы]

[ORDER BY сортировка по критериям]

[LIMIT число редактируемых записей]



Описание опций LOW_PRIORITY и IGNORE смотрите выше. Как пользоваться параметрами WHERE, ORDER BY и LIMIT и для чего они нужны? Эти параметры указывают тот набор записей, в которых нужно произвести изменения.



Для примера изменим значения заголовка сообщений для всех записей в таблице messages:

//изменяем значение поля note_name на 'New message',

//т.к. мы не указали ограничительных параметров

//(WHERE и LIMIT) этот запрос подействует на все записи в этой таблице

UPDATE messages set mess_title = 'New message'



Второй пример обновления записи — мы хотим изменить значение заголовка одного сообщения для одной записи. Немного модифицируем предыдущий пример:

/*изменяем значение поля mess_title на 'New message', */

UPDATE messages set mess_title = 'Old message' limit 1

Чтобы испробовать опцию WHERE рассмотрим вот такой пример: нам нужно изменить логин пользователя с логином User login1 (такое часто приходится делать при управлении базой данных с пользователями):

//изменяем поле user_login в таблице users

//у пользователя с логином User login1 на значение 'User1'

UPDATE users set user_login = 'User1_1' where user_login = 'User login1'



Выборка (извлечение) информации из таблиц базы данных.

После того как мы создали таблицу, отредактировали нужные нам столбцы, заполнили и отредактировали кое-какую информацию, нам можно спокойно переходить к самому часто используемому (и наверно главному запросу, хотя без остальных тоже ничего не получится) sql запросу — SELECT. По запросу SELECT можно написать отдельную статью (я так позже и сделаю), а пока опишу лишь малую часть его функционала и поставлю ссылку на его хороший обзор с сайта mysql.ru/docs/man/SELECT.html.



С помощью команды SELECT и ее параметров можно извлекать любые данные в нужной нам послодовательности и количестве. Синтаксис команды SELECT выглядит вот так:

SELECT опции и поля FROM список_таблиц

[WHERE] условие для "отсеивания" не нужных записей

[GROUP BY] группировка полученных результатов по какому-нибудь столбцу

[HAVING] используется также для фильтрации результата GROUP BY по заданным условиям, но только на другой стадии формирования ответа.

[ORDER BY] сортировка результатов ответа.

[LIMIT] количество требуемых записей в ответе



Рассмотрим несколько примеров выборок:



Найдем все сообщения системы.

Найдем все сообщения пользователя с логином ‘User1_1′.

Выведем имена трех пользователей системы обратном порядке по полю имени.



Думаю решения этих задач хватит для понимания основ работы sql запроса SELECT.



//1. Выбираем значение поля mess_text из таблицы

//messages, т.к. других условий не указано значения

//mess_text возьмутся из каждой записи.

SELECT mess_text FROM messages;

//2. Для того чтобы найти все сообщения

//пользователя с логином 'User1_1' нам нужно узнать

//его первичный ключ (т.е. узнать user_id, т.к. с помощью него

//таблицы связаны между собой), а уже по этому первичному

//ключу можно без труда выбрать все сообщения через условие where.

SELECT mess_text FROM messages where user_id_author = (select user_id from users where user_login = 'User1_1');

//3. Выбираем столбец с именем пользователя, указываем

//тип сортировки ORDER BY user_name desc, т.е. в обратном

//порядке по имени (desc - это обратный порядок, а asc - стандартный)

// и указываем количество нужных записей (LIMIT 3)

SELECT user_name FROM users ORDER BY user_name desc LIMIT 3;



4. Удаление информации (записей) из базы данных.

Удаление лишних записей из базы данных — это тоже очень частая операция, но с ней нужно быть намного осторожнее чем с SELECT’ом. Если вы работаете с реальной базой данных и вы не уверены что вы хорошо познакомились с конструкцией WHERE…, то лучше проверяйте каждый sql запрос на удаление на тестовой базы данных (правило простое, но им часто пренебрегают). Рассмотрим синтаксис команды DELETE (он очень схож с SELECT):

DELETE [LOW_PRIORITY | QUICK] FROM table_name

[WHERE where_definition]

[ORDER BY ...]

[LIMIT rows]

Все параметры вам уже знакомы (смотрите выше), кроме QUICK — эта опция указывает СУБД на то, что нужно ускорить операцию удаления, если это возможно.

Рассмотрим пару примеров удаление записей из базы данных.

//Удаляем из таблицы пользователей (users) все

//записи в которых поле user_login равно 'User login4', если

//бы мы не указали условия WHERE user_login = 'User login4',

//то все пользователи были бы удалены.

DELETE FROM users WHERE user_login = 'User login4';

//удаляем все сообщения пользователей, т.к.

//мы не указали никаких условий MySQL удалит все записи в таблице messages

DELETE FROM messages;