Главная страница
Навигация по странице:

  • SELECT now( ) FROM dual;

  • Компонент Описание Диапазон

  • изучаем SQL. Она позволяет решать многошаговые задачи одним выражением


    Скачать 1.6 Mb.
    НазваниеОна позволяет решать многошаговые задачи одним выражением
    Дата09.02.2018
    Размер1.6 Mb.
    Формат файлаpdf
    Имя файлаизучаем SQL.pdf
    ТипДокументы
    #36127
    страница4 из 31
    1   2   3   4   5   6   7   8   9   ...   31
    Инструмент командной строки mysql
    При вызове инструмента командной строки mysql можно задать имя пользователя и используемую БД:

    Инструмент командной строки mysql
    29
    mysql u lrngsql p bank
    Будет запрошен ваш пароль, и затем появится приглашение mysql>,
    с помощью которого вы сможете создавать SQL выражения и просмат ривать результаты их выполнения. Например, чтобы узнать текущие дату и время, можно выполнить следующий запрос:
    mysql> SELECT now( );
    +
    +
    | now( ) |
    +
    +
    | 2005 05 06 16:48:46 |
    +
    +
    1 row in set (0.01 sec)
    Функция now( ) – это встроенная функция MySQL, возвращающая те кущие дату и время. Как видите, инструмент командной строки mysql
    форматирует результаты запросов, помещая их в прямоугольник, очер ченный символами +, и |. Выведя все результаты (в данном случае это всего одна строка), инструмент командной строки mysql покажет коли чество возвращенных строк и длительность выполнения выражения
    SQL.
    Завершив работу с инструментом командной строки mysql, для возвра щения в консоль просто введите quit; или exit;.
    О пропущенном блоке from
    При работе с некоторыми серверами БД нельзя создать запрос без блока from (из), в котором должна быть указана по крайней мере одна таблица. Oracle Database – именно такой сервер. Для тех случаев, когда требуется только вызвать функцию, Oracle предос тавляет таблицу dual (двойственная), состоящую всего из одного столбца dummy (макет), который содержит всего одну строку дан ных. Для обеспечения совместимости с Oracle Database MySQL
    тоже предоставляет таблицу dual. Следовательно, предыдущий запрос текущих даты и времени можно было бы написать так:
    mysql> SELECT now( )
    FROM dual;
    +
    +
    | now( ) |
    +
    +
    | 2005 05 06 16:48:46 |
    +
    +
    1 row in set (0.01 sec)
    Если вы не работаете с Oracle и вам не нужна совместимость с этой СУБД, таблицу dual можно полностью игнорировать.

    30
    Глава 2. Создание и заполнение базы данных
    Типы данных MySQL
    Вообще говоря, все популярные серверы БД обладают способностью хранить одни и те же типы данных, такие как строки, даты и числа.
    Обычно их различие заключается в возможности хранения специаль ных типов данных, например XML документов, или очень больших текстов, или двоичных документов. Поскольку данная книга является введением в SQL и 98 % всех столбцов, которые вы когда либо встре тите, будут простыми типами данных, мы рассмотрим только сим вольные, числовые и временные типы данных.
    Символьные данные
    Символьные данные могут храниться как строки фиксированной или переменной длины. Разница заключается в том, что строки фиксиро ванной длины справа дополняются пробелами, тогда как строки пере менной длины – нет. При определении столбца символьного типа необ ходимо задать максимальный размер сохраняемой в нем строки. На пример, если предполагается хранить строки длиной до 20 символов,
    можно использовать любое из этих описаний:
    CHAR(20) /* строка фиксированной длины */
    VARCHAR(20) /* строка переменной длины */
    В настоящее время максимальная длина этого типа данных составляет
    255 символов (хотя в будущих версиях будут допустимы более длин ные строки). Для сохранения более длинных строк (таких как сообще ния электронной почты, XML документы и т. д.) используйте один из текстовых типов – tinytext (крошечный текст), text (текст), mediumtext
    (средний текст), longtext (длинный текст)), – рассматриваемых в дан ном разделе позже. В общем, тип char подходит для случая, когда в столбце предполагается хранить только строки одинаковой длины,
    например сокращенные названия государств, а тип varchar – для строк разной длины. Типы char и varchar одинаково применимы во всех основ ных серверах БД.
    Когда речь идет о применении типа данных varchar, СУБД Oracle
    Database является исключением. Пользователи Oracle при опи сании символьных столбцов переменной длины должны приме нять тип varchar2.
    Наборы символов
    В языках, использующих латинский алфавит, например в англий ском, довольно мало символов, то есть каждый символ хранится как один байт. В других языках, таких как японский и корейский, много символов. Таким образом, в них для хранения одного символа требует ся несколько байт. Поэтому такие наборы символов называют много
    байтовыми наборами символов
    (multibyte character sets).

    Типы данных MySQL
    31
    MySQL может хранить данные, используя разные наборы символов,
    как одно , так и многобайтовые. Просмотреть поддерживаемые серве ром наборы символов можно с помощью команды show (показать):
    mysql> SHOW CHARACTER SET;
    +
    +
    +
    +
    +
    | Charset | Description | Default collation | Maxlen |
    +
    +
    +
    +
    +
    | big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
    | dec8 | DEC West European | dec8_swedish_ci | 1 |
    | cp850 | DOS West European | cp850_general_ci | 1 |
    | hp8 | HP West European | hp8_english_ci | 1 |
    | koi8r | KOI8 R Relcom Russian | koi8r_general_ci | 1 |
    | latin1 | ISO 8859 1 West European | latin1_swedish_ci | 1 |
    | latin2 | ISO 8859 2 Central European | latin2_general_ci | 1 |
    | swe7 | 7bit Swedish | swe7_swedish_ci | 1 |
    | ascii | US ASCII | ascii_general_ci | 1 |
    | ujis | EUC JP Japanese | ujis_japanese_ci | 3 |
    | sjis | Shift JIS Japanese | sjis_japanese_ci | 2 |
    | hebrew | ISO 8859 8 Hebrew | hebrew_general_ci | 1 |
    | tis620 | TIS620 Thai | tis620_thai_ci | 1 |
    | euckr | EUC KR Korean | euckr_korean_ci | 2 |
    | koi8u | KOI8 U Ukrainian | koi8u_general_ci | 1 |
    | gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 |
    | greek | ISO 8859 7 Greek | greek_general_ci | 1 |
    | cp1250 | Windows Central European | cp1250_general_ci | 1 |
    | gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |
    | latin5 | ISO 8859 9 Turkish | latin5_turkish_ci | 1 |
    | armscii8 | ARMSCII 8 Armenian | armscii8_general_ci | 1 |
    | utf8 | UTF 8 Unicode | utf8_general_ci | 3 |
    | ucs2 | UCS 2 Unicode | ucs2_general_ci | 2 |
    | cp866 | DOS Russian | cp866_general_ci | 1 |
    | keybcs2 | DOS Kamenicky Czech Slovak | keybcs2_general_ci | 1 |
    | macce | Mac Central European | macce_general_ci | 1 |
    | macroman | Mac West European | macroman_general_ci | 1 |
    | cp852 | DOS Central European | cp852_general_ci | 1 |
    | latin7 | ISO 8859 13 Baltic | latin7_general_ci | 1 |
    | cp1251 | Windows Cyrillic | cp1251_general_ci | 1 |
    | cp1256 | Windows Arabic | cp1256_general_ci | 1 |
    | cp1257 | Windows Baltic | cp1257_general_ci | 1 |
    | binary | Binary pseudo charset | binary | 1 |
    | geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 |
    Когда я установил сервер MySQL, в качестве набора символов, приме няемого по умолчанию, был автоматически выбран latin1. Однако для каждого символьного столбца в БД можно выбрать отдельный набор символов. Можно даже хранить разные наборы символов в одной таб лице. Чтобы при описании столбца выбрать набор символов, отлич ный от применяемого по умолчанию, надо просто указать один из под держиваемых наборов символов после описания типа:
    VARCHAR(20) CHARACTER SET utf8

    32
    Глава 2. Создание и заполнение базы данных
    С MySQL можно также задавать набор символов по умолчанию для всей базы данных:
    CREATE DATABASE foreign_sales CHARACTER SET utf8;
    Пожалуй, для ознакомительной книги о наборах символов сказано дос таточно, но еще есть тема локализации, которая гораздо шире. Если вы планируете работать с несколькими наборами символов или использо вать незнакомые наборы символов, обратитесь к таким книгам, как
    «Java Internationalization» (O’Reilly) или «Unicode Demystified: A Pra ctical Programmer’s Guide to the Encoding Standard» (Addison Wesley).
    Текстовые данные
    Если нужно хранить данные, для которых не хватит 255 символов столбца типа char или varchar, вам понадобится один из текстовых типов.
    В табл. 2.1 показаны доступные текстовые типы и их максимальные размеры.
    Таблица 2.1. Текстовые типы данных MySQL
    Выбирая тот или иной текстовый тип, необходимо помнить следующее:

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

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

    При использовании столбцов типа text для сортировки или группи ровки используются только первые 1024 байта, хотя при необходи мости это ограничивающее значение можно увеличить.

    Разные текстовые типы присущи исключительно MySQL. У SQL
    Server для больших символьных данных есть только один тип text,
    а в DB2 и Oracle применяется тип данных под названием clob (Cha racter Large Object, большой символьный объект).
    При создании столбца для данных произвольного формата, например столбца notes (примечания) для хранения информации о взаимодейст виях клиента с отделом клиентского сервиса вашей компании, кото рую вам не хотелось бы ограничивать 255 символами, следует выбрать тип text или mediumtext.
    Тип
    Максимальное число символов
    Tinytext
    255
    Text
    65 535
    Mediumtext
    16 777 215
    Longtext
    4 294 967 295

    Типы данных MySQL
    33
    В Oracle Database допускаются столбцы char до 2000 байт и var char до 4000 байт. SQL Server может оперировать данными типа char и varchar размером до 8000 байт. Поэтому при работе с Orac le или SQL Server потребность в текстовых типах данных мень ше, чем при работе с MySQL. Однако начиная с версии 5.0.3
    (в настоящее время она проходит бета тестирование) MySQL об скачет оба эти сервера, поскольку максимальный размер столб цов типа char и varchar в нем достигнет 65 535 байт.
    Числовые данные
    Хотя и кажется, что хватило бы одного числового типа данных с на званием «numeric» (числовой), все же есть разные числовые типы, от ражающие разные способы использования чисел, как показано ниже:
    Столбец, являющийся индикатором поставки заказа покупателю
    Столбец такого типа, называемого Boolean (булев), может содер жать 0, что означает false (ложь) и 1, что означает true (истина).
    Первичный ключ для таблицы транзакций, генерируемый системой
    Обычно начинается с 1 и увеличивается с шагом 1, возможно, до очень больших значений.
    Номер позиции в клиентской электронной корзине для покупок
    Значениями столбца данного типа являются положительные целые числа от 1 до (максимум) 200 (для фанатов шопинга).
    Данные позиционирования сверлильного станка для печатных плат
    Высокоточные научные или технологические данные часто требу ют точности до восьми десятичных знаков.
    MySQL располагает несколькими разными числовыми типами для ра боты с этими (и многими другими) видами информации. Наиболее час то числовые типы используют для хранения целых чисел. При зада нии одного из таких типов можно также указать, что данные беззнако
    вые
    , тогда сервер будет знать, что все хранящиеся в столбце данные не отрицательные. В табл. 2.2 показано пять разных типов данных,
    предназначенных для хранения целых чисел.
    Таблица 2.2. Целые типы данных MySQL
    Тип
    Диапазон значений со знаком Диапазон значений без знака
    Tinyint от 128 до 127
    от 0 до 255
    Smallint от 32 768 до 32 767
    от 0 до 65 535
    Mediumint от 8 388 608 до 8 388 607
    от 0 до 16 777 215
    Int от 2 147 483 648 до 2 147 483 647
    от 0 до 4 294 967 295
    Bigint от 9 223 372 036 854 775 808 до 9 223 372 036 854 775 807
    от 0 до 18 446 744 073 709 551 615

    34
    Глава 2. Создание и заполнение базы данных
    При создании столбца одного из целых типов MySQL выделит для хра нения данных соответствующее количество памяти – от 1 байта для типа tinyint до 8 байт для bigint. Поэтому попытайтесь подобрать тип достаточного размера для хранения самого большого из предполагае мых чисел без неоправданного расхода памяти.
    Для чисел с плавающей точкой (таких как 3,1415927) можно выбрать один из типов, приведенных в табл. 2.3.
    Таблица 2.3. Типы данных MySQL для чисел с плавающей точкой
    Для типа с плавающей точкой можно задать точность (precision) (об щее допустимое число разрядов, как справа, так и слева от десятичной точки) и масштаб (scale) (допустимое число разрядов справа от десятич ной точки), но эти параметры не являются обязательными. В табл. 2.3
    они представлены как p и s. Задавая точность и масштаб для столбца,
    имеющего тип с плавающей точкой, необходимо помнить, что сохра няемые в нем данные будут округляться, если число разрядов в них превысит заданный масштаб и/или точность. Например, столбец, оп ределенный как float(4,2), будет сохранять всего четыре разряда, два слева и два справа от десятичной точки. Поэтому с такими числами,
    как 27,44 и 8,19, будет все в порядке, а вот число 17,8675 будет округ лено до 17,87, а число 178,5 будет округлено (грубо) до 99,99 – самое большое число, которое может быть сохранено в этом столбце.
    Как и данные целого типа, данные с плавающей точкой могут быть оп ределены как unsigned (беззнаковые), но это только предотвращает хранение в столбце отрицательных чисел, но не изменяет диапазон данных, которые могут быть сохранены в столбце.
    Временные данные
    Наряду со строками и числами довольно часто приходится работать с ин формацией о датах и/или времени. Этот тип данных называют времен
    ным
    (temporal). К примерам временных данных в базе данных относятся:

    Дата будущего события, например доставки заказа покупателю

    Фактическая дата доставки заказа покупателю

    Дата и время изменения пользователем определенной строки таб лицы

    Дата рождения сотрудника

    Год, соответствующий строке таблицы yearly_sales (продажи за год)
    в хранилище данных
    Тип
    Числовой диапазон
    Float(p,s)
    от 3,402823466E+38 до 1,175494351E 38 и от 1,175494351E 38
    до 3,402823466E+38
    Double(p,s)
    от 1,7976931348623157E+308 до 2,2250738585072014E 308
    и от 2,2250738585072014E 308 до 1,7976931348623157E+308

    Типы данных MySQL
    35

    Время, необходимое для монтажа электропроводки в автомобиле на сборочном конвейере
    В MySQL есть типы данных для обработки всех подобных ситуаций.
    В табл. 2.4 показаны временные типы данных, поддерживаемые MySQL.
    Таблица 2.4. Временные типы данных MySQL
    Серверы БД хранят временные данные по разному, и назначение фор матирующей строки (второй столбец табл. 2.4) – показать, как будут представлены данные при извлечении, а также то, как должна быть сформирована строка даты при вставке или обновлении столбца вре менного типа. Таким образом, если бы вам понадобилось вставить дату
    23 марта 2005 года в столбец date (дата) с форматом по умолчанию YYYY
    MM DD
    , то вы бы использовали строку '2005 03 23'. Построение и отобра жение временных данных подробно рассмотрено в главе 7.
    На всех серверах БД допустимы различные диапазоны дат для столбцов временного типа. Oracle Database допускает даты от
    4712 г. до н. э. до 9999 г. н.э., тогда как SQL Server обрабатыва ет только даты от 1753 г. н. э. до 9999 г. н. э. Хотя для большин ства систем, отслеживающих текущие и будущие события,
    большой разницы здесь нет, об этом важно помнить при хране нии исторических дат.
    Различные компоненты форматов даты, приведенных в табл. 2.4, опи саны в табл. 2.5.
    Таблица 2.5. Компоненты формата даты
    Тип
    Формат по умолчанию
    Допустимые значения
    Date
    YYYY MM DD
    от 1000 01 01 до 9999 12 31
    Datetime
    YYYY MM DD HH:MI:SS от 1000 01 01 00:00:00 до 9999 12 31 23:59:59
    Timestamp
    YYYY MM DD HH:MI:SS от 1970 01 01 00:00:00 до 2037 12 31 23:59:59
    Year
    YYYY
    от 1901 до 2155
    Time
    HHH:MI:SS
    от 838:59:59 до 838:59:59
    Компонент
    Описание
    Диапазон
    YYYY
    Год, включая столетие от 1000 до 9999
    MM
    Месяц от 01 (январь) до 12 (декабрь)
    DD
    День от 01 до 31
    HH
    Час от 01 до 24
    HHH
    Часы (прошедшие)
    от 838 до 838
    MI
    Минута от 01 до 60
    SS
    Секунда от 01 до 60

    36
    Глава 2. Создание и заполнение базы данных
    Вот как были бы использованы различные временные типы при реали зации приведенных выше примеров:

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

    Для хранения информации о фактической доставке заказа покупа телю использовался бы тип datetime (дата и время), поскольку важ но отследить не только дату, но и точное время доставки.

    Столбец, отслеживающий время последнего изменения пользовате лем определенной строки таблицы, использовал бы тип timestamp
    (временная метка). Этот тип содержит ту же информацию, что и тип datetime
    (год, месяц, день, час, минуту, секунду), но при добавлении или изменении строки таблицы сервер MySQL автоматически за полнит столбец timestamp текущими значениями даты/времени.

    Столбец для хранения только данных о годе использовал бы тип year
    (год).

    Столбцы, содержащие данные о временном интервале, необходимом для выполнения задачи, использовали бы тип time (время). Этому типу данных не нужно хранить компонент даты – это сбивало бы с толку, поскольку интерес представляет только количество часов/
    минут/секунд, необходимое для выполнения задания. Эту информа цию можно было бы получить, найдя разность значений из двух столбцов типа datetime (первый хранит дату/время начала выполне ния задания, а второй – дату/время его завершения). Но проще ис пользовать один столбец time.
    В главе 7 будет рассказано, как работать с каждым из этих временных типов данных.
    Создание таблиц
    Теперь, имея четкое представление о том, какие типы данных могут храниться в базе данных MySQL, самое время взглянуть, как эти типы используются при описании таблиц. Начнем с описания таблицы для хранения информации о человеке.
    1   2   3   4   5   6   7   8   9   ...   31


    написать администратору сайта