manual.texi
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:1883k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. In @strong{MySQL} Version 3.22.12 or later,
  2. if a new user is created or if you have global grant privileges, the user's
  3. password will be set to the password specified by the @code{IDENTIFIED BY}
  4. clause, if one is given.  If the user already had a password, it is replaced
  5. by the new one.
  6. @strong{WARNING:} If you create a new user but do not specify an
  7. @code{IDENTIFIED BY} clause, the user has no password.  This is insecure.
  8. Passwords can also be set with the @code{SET PASSWORD} command.
  9. @xref{SET OPTION, , @code{SET OPTION}}.
  10. If you grant privileges for a database, an entry in the @code{mysql.db}
  11. table is created if needed. When all privileges for the database have been
  12. removed with @code{REVOKE}, this entry is deleted.
  13. If a user doesn't have any privileges on a table, the table is not displayed
  14. when the user requests a list of tables (for example, with a @code{SHOW TABLES}
  15. statement).
  16. The @code{WITH GRANT OPTION} clause gives the user the ability to give
  17. to other users any privileges the user has at the specified privilege level.
  18. You should be careful to whom you give the @strong{grant} privilege, as two
  19. users with different privileges may be able to join privileges!
  20. You cannot grant another user a privilege you don't have yourself;
  21. the @strong{grant} privilege allows you to give away only those privileges
  22. you possess.
  23. Be aware that when you grant a user the @strong{grant} privilege at a
  24. particular privilege level, any privileges the user already possesses (or
  25. is given in the future!) at that level are also grantable by that user.
  26. Suppose you grant a user the @strong{insert} privilege on a database.  If
  27. you then grant the @strong{select} privilege on the database and specify
  28. @code{WITH GRANT OPTION}, the user can give away not only the @strong{select}
  29. privilege, but also @strong{insert}.  If you then grant the @strong{update}
  30. privilege to the user on the database, the user can give away the
  31. @strong{insert}, @strong{select} and @strong{update}.
  32. You should not grant @strong{alter} privileges to a normal user.  If you
  33. do that, the user can try to subvert the privilege system by renaming
  34. tables!
  35. Note that if you are using table or column privileges for even one user, the
  36. server examines table and column privileges for all users and this will slow
  37. down @strong{MySQL} a bit.
  38. When @code{mysqld} starts, all privileges are read into memory.
  39. Database, table, and column privileges take effect at once, and
  40. user-level privileges take effect the next time the user connects.
  41. Modifications to the grant tables that you perform using @code{GRANT} or
  42. @code{REVOKE} are noticed by the server immediately.
  43. If you modify the grant tables manually (using @code{INSERT}, @code{UPDATE},
  44. etc.), you should execute a @code{FLUSH PRIVILEGES} statement or run
  45. @code{mysqladmin flush-privileges} to tell the server to reload the grant
  46. tables.
  47. @xref{Privilege changes}.
  48. @cindex ANSI SQL, differences from
  49. The biggest differences between the ANSI SQL and @strong{MySQL} versions of
  50. @code{GRANT} are:
  51. @itemize @bullet
  52. @item
  53. In @strong{MySQL} privileges are given for an username + hostname combination
  54. and not only for an username.
  55. @item
  56. ANSI SQL doesn't have global or database-level privileges, and ANSI SQL
  57. doesn't support all privilege types that @strong{MySQL} supports.
  58. @strong{MySQL} doesn't support the ANSI SQL @code{TRIGGER}, @code{EXECUTE} or
  59. @code{UNDER} privileges.
  60. @item
  61. ANSI SQL privileges are structured in a hierarchal manner. If you remove
  62. an user, all privileges the user has granted are revoked. In
  63. @strong{MySQL} the granted privileges are not automaticly revoked, but
  64. you have to revoke these yourself if needed.
  65. @item
  66. If you in @strong{MySQL} have the @code{INSERT} grant on only part of the
  67. columns in a table, you can execute @code{INSERT} statements on the
  68. table; The columns for which you don't have the @code{INSERT} privilege
  69. will set to their default values. ANSI SQL requires you to have the
  70. @code{INSERT} privilege on all columns.
  71. @item
  72. When you drop a table in ANSI SQL, all privileges for the table are revoked.
  73. If you revoke a privilege in ANSI SQL, all privileges that were granted based
  74. on this privilege are also revoked. In @strong{MySQL}, privileges can be
  75. dropped only with explicit @code{REVOKE} commands or by manipulating the
  76. @strong{MySQL} grant tables.
  77. @end itemize
  78. @cindex indexes
  79. @cindex indexes, multi-part
  80. @cindex multi-part index
  81. @findex CREATE INDEX
  82. @node CREATE INDEX, DROP INDEX, GRANT, Reference
  83. @section @code{CREATE INDEX} Syntax
  84. @example
  85. CREATE [UNIQUE|FULLTEXT] INDEX index_name ON tbl_name (col_name[(length)],... )
  86. @end example
  87. The @code{CREATE INDEX} statement doesn't do anything in @strong{MySQL} prior
  88. to Version 3.22.  In Version 3.22 or later, @code{CREATE INDEX} is mapped to an
  89. @code{ALTER TABLE} statement to create indexes.
  90. @xref{ALTER TABLE, , @code{ALTER TABLE}}.
  91. Normally, you create all indexes on a table at the time the table itself
  92. is created with @code{CREATE TABLE}.
  93. @xref{CREATE TABLE, , @code{CREATE TABLE}}.
  94. @code{CREATE INDEX} allows you to add indexes to existing tables.
  95. A column list of the form @code{(col1,col2,...)} creates a multiple-column
  96. index.  Index values are formed by concatenating the values of the given
  97. columns.
  98. For @code{CHAR} and @code{VARCHAR} columns, indexes can be created that
  99. use only part of a column, using @code{col_name(length)} syntax.  (On
  100. @code{BLOB} and @code{TEXT} columns the length is required). The
  101. statement shown below creates an index using the first 10 characters of
  102. the @code{name} column:
  103. @example
  104. mysql> CREATE INDEX part_of_name ON customer (name(10));
  105. @end example
  106. Because most names usually differ in the first 10 characters, this index should
  107. not be much slower than an index created from the entire @code{name} column.
  108. Also, using partial columns for indexes can make the index file much smaller,
  109. which could save a lot of disk space and might also speed up @code{INSERT}
  110. operations!
  111. Note that you can only add an index on a column that can have @code{NULL}
  112. values or on a @code{BLOB}/@code{TEXT} column if you are using
  113. @strong{MySQL} Version 3.23.2 or newer and are using the @code{MyISAM}
  114. table type.
  115. For more information about how @strong{MySQL} uses indexes, see
  116. @ref{MySQL indexes, , @strong{MySQL} indexes}.
  117. @code{FULLTEXT} indexes can index only @code{VARCHAR} and
  118. @code{TEXT} columns, and only in @code{MyISAM} tables. @code{FULLTEXT} indexes
  119. are available in @strong{MySQL} Version 3.23.23 and later.
  120. @ref{MySQL full-text search}.
  121. @findex DROP INDEX
  122. @node DROP INDEX, Comments, CREATE INDEX, Reference
  123. @section @code{DROP INDEX} Syntax
  124. @example
  125. DROP INDEX index_name ON tbl_name
  126. @end example
  127. @code{DROP INDEX} drops the index named @code{index_name} from the table
  128. @code{tbl_name}.  @code{DROP INDEX} doesn't do anything in @strong{MySQL}
  129. prior to Version 3.22.  In Version 3.22 or later, @code{DROP INDEX} is mapped to an
  130. @code{ALTER TABLE} statement to drop the index.
  131. @xref{ALTER TABLE, , @code{ALTER TABLE}}.
  132. @findex Comment syntax
  133. @cindex comments, adding
  134. @node Comments, CREATE FUNCTION, DROP INDEX, Reference
  135. @section Comment Syntax
  136. The @strong{MySQL} server supports the @code{# to end of line}, @code{--
  137. to end of line} and @code{/* in-line or multiple-line */} comment
  138. styles:
  139. @example
  140. mysql> select 1+1;     # This comment continues to the end of line
  141. mysql> select 1+1;     -- This comment continues to the end of line
  142. mysql> select 1 /* this is an in-line comment */ + 1;
  143. mysql> select 1+
  144. /*
  145. this is a
  146. multiple-line comment
  147. */
  148. 1;
  149. @end example
  150. Note that the @code{--} comment style requires you to have at least one space
  151. after the @code{--}!
  152. Although the server understands the comment syntax just described,
  153. there are some limitations on the way that the @code{mysql} client
  154. parses @code{/* ... */} comments:
  155. @itemize @bullet
  156. @item
  157. Single-quote and double-quote characters are taken to indicate the beginning
  158. of a quoted string, even within a comment.  If the quote is not matched by a
  159. second quote within the comment, the parser doesn't realize the comment has
  160. ended.  If you are running @code{mysql} interactively, you can tell that it
  161. has gotten confused like this because the prompt changes from @code{mysql>}
  162. to @code{'>} or @code{">}.
  163. @item
  164. A semicolon is taken to indicate the end of the current SQL statement
  165. and anything following it to indicate the beginning of the next statement.
  166. @end itemize
  167. These limitations apply both when you run @code{mysql} interactively
  168. and when you put commands in a file and tell @code{mysql} to read its
  169. input from that file with @code{mysql < some-file}.
  170. @strong{MySQL} doesn't support the @samp{--} ANSI SQL comment style.
  171. @xref{Missing comments}.
  172. @findex CREATE FUNCTION
  173. @findex DROP FUNCTION
  174. @findex UDF functions
  175. @findex User-defined functions
  176. @findex Functions, user-defined
  177. @node CREATE FUNCTION, Reserved words, Comments, Reference
  178. @section @code{CREATE FUNCTION/DROP FUNCTION} Syntax
  179. @example
  180. CREATE [AGGREGATE] FUNCTION function_name RETURNS @{STRING|REAL|INTEGER@}
  181.        SONAME shared_library_name
  182. DROP FUNCTION function_name
  183. @end example
  184. A user-definable function (UDF) is a way to extend @strong{MySQL} with a new
  185. function that works like native (built in) @strong{MySQL} functions such as
  186. @code{ABS()} and @code{CONCAT()}.
  187. @code{AGGREGATE} is a new option for @strong{MySQL} Version 3.23.  An
  188. @code{AGGREGATE} function works exactly like a native @strong{MySQL}
  189. @code{GROUP} function like @code{SUM} or @code{COUNT()}.
  190. @code{CREATE FUNCTION} saves the function's name, type, and shared library
  191. name in the @code{mysql.func} system table.  You must have the
  192. @strong{insert} and @strong{delete} privileges for the @code{mysql} database
  193. to create and drop functions.
  194. All active functions are reloaded each time the server starts, unless
  195. you start @code{mysqld} with the @code{--skip-grant-tables} option.  In
  196. this case, UDF initialization is skipped and UDFs are unavailable.
  197. (An active function is one that has been loaded with @code{CREATE FUNCTION}
  198. and not removed with @code{DROP FUNCTION}.)
  199. For instructions on writing user-definable functions, see @ref{Adding
  200. functions}.  For the UDF mechanism to work, functions must be written in C or
  201. C++, your operating system must support dynamic loading and you must have
  202. compiled @code{mysqld} dynamically (not statically).
  203. @cindex keywords
  204. @cindex reserved words, exceptions
  205. @node Reserved words,  , CREATE FUNCTION, Reference
  206. @section Is MySQL Picky About Reserved Words?
  207. A common problem stems from trying to create a table with column names that
  208. use the names of datatypes or functions built into @strong{MySQL}, such as
  209. @code{TIMESTAMP} or @code{GROUP}.  You're allowed to do it (for example,
  210. @code{ABS} is an allowed column name), but whitespace is not allowed between
  211. a function name and the @samp{(} when using functions whose names are also
  212. column names.
  213. The following words are explicitly reserved in @strong{MySQL}. Most of
  214. them are forbidden by ANSI SQL92 as column and/or table names
  215. (for example, @code{group}).
  216. A few are reserved because @strong{MySQL} needs them and is
  217. (currently) using a @code{yacc} parser:
  218. @c This is fixed by including the symbols table from lex.h here and then running
  219. @c fix-mysql-reserved-words in emacs (or let David do it):
  220. @c (defun fix-mysql-reserved-words ()
  221. @c  (interactive)
  222. @c  (let ((cnt 0))
  223. @c    (insert "n@item ")
  224. @c    (while (looking-at "[ t]*{ +"\([^"]+\)"[ t]*,.*n")
  225. @c      (replace-match "@code{\1}")
  226. @c      (incf cnt)
  227. @c      (if (> cnt 3)
  228. @c    (progn
  229. @c      (setf cnt 0)
  230. @c      (insert "n@item "))
  231. @c  (insert " @tab ")))))
  232. @c But remove the non alphanumeric entries by hand first.
  233. @c Updated after 3.23.4 990928 by David
  234. @multitable @columnfractions .25 .25 .25 .25
  235. @item @code{action} @tab @code{add} @tab @code{aggregate} @tab @code{all}
  236. @item @code{alter} @tab @code{after} @tab @code{and} @tab @code{as}
  237. @item @code{asc} @tab @code{avg} @tab @code{avg_row_length} @tab @code{auto_increment}
  238. @item @code{between} @tab @code{bigint} @tab @code{bit} @tab @code{binary}
  239. @item @code{blob} @tab @code{bool} @tab @code{both} @tab @code{by}
  240. @item @code{cascade} @tab @code{case} @tab @code{char} @tab @code{character}
  241. @item @code{change} @tab @code{check} @tab @code{checksum} @tab @code{column}
  242. @item @code{columns} @tab @code{comment} @tab @code{constraint} @tab @code{create}
  243. @item @code{cross} @tab @code{current_date} @tab @code{current_time} @tab @code{current_timestamp}
  244. @item @code{data} @tab @code{database} @tab @code{databases} @tab @code{date}
  245. @item @code{datetime} @tab @code{day} @tab @code{day_hour} @tab @code{day_minute}
  246. @item @code{day_second} @tab @code{dayofmonth} @tab @code{dayofweek} @tab @code{dayofyear}
  247. @item @code{dec} @tab @code{decimal} @tab @code{default} @tab @code{delayed}
  248. @item @code{delay_key_write} @tab @code{delete} @tab @code{desc} @tab @code{describe}
  249. @item @code{distinct} @tab @code{distinctrow} @tab @code{double} @tab @code{drop}
  250. @item @code{end} @tab @code{else} @tab @code{escape} @tab @code{escaped}
  251. @item @code{enclosed} @tab @code{enum} @tab @code{explain} @tab @code{exists}
  252. @item @code{fields} @tab @code{file} @tab @code{first} @tab @code{float}
  253. @item @code{float4} @tab @code{float8} @tab @code{flush} @tab @code{foreign}
  254. @item @code{from} @tab @code{for} @tab @code{full} @tab @code{function}
  255. @item @code{global} @tab @code{grant} @tab @code{grants} @tab @code{group}
  256. @item @code{having} @tab @code{heap} @tab @code{high_priority} @tab @code{hour}
  257. @item @code{hour_minute} @tab @code{hour_second} @tab @code{hosts} @tab @code{identified}
  258. @item @code{ignore} @tab @code{in} @tab @code{index} @tab @code{infile}
  259. @item @code{inner} @tab @code{insert} @tab @code{insert_id} @tab @code{int}
  260. @item @code{integer} @tab @code{interval} @tab @code{int1} @tab @code{int2}
  261. @item @code{int3} @tab @code{int4} @tab @code{int8} @tab @code{into}
  262. @item @code{if} @tab @code{is} @tab @code{isam} @tab @code{join}
  263. @item @code{key} @tab @code{keys} @tab @code{kill} @tab @code{last_insert_id}
  264. @item @code{leading} @tab @code{left} @tab @code{length} @tab @code{like}
  265. @item @code{lines} @tab @code{limit} @tab @code{load} @tab @code{local}
  266. @item @code{lock} @tab @code{logs} @tab @code{long} @tab @code{longblob}
  267. @item @code{longtext} @tab @code{low_priority} @tab @code{max} @tab @code{max_rows}
  268. @item @code{match} @tab @code{mediumblob} @tab @code{mediumtext} @tab @code{mediumint}
  269. @item @code{middleint} @tab @code{min_rows} @tab @code{minute} @tab @code{minute_second}
  270. @item @code{modify} @tab @code{month} @tab @code{monthname} @tab @code{myisam}
  271. @item @code{natural} @tab @code{numeric} @tab @code{no} @tab @code{not}
  272. @item @code{null} @tab @code{on} @tab @code{optimize} @tab @code{option}
  273. @item @code{optionally} @tab @code{or} @tab @code{order} @tab @code{outer}
  274. @item @code{outfile} @tab @code{pack_keys} @tab @code{partial} @tab @code{password}
  275. @item @code{precision} @tab @code{primary} @tab @code{procedure} @tab @code{process}
  276. @item @code{processlist} @tab @code{privileges} @tab @code{read} @tab @code{real}
  277. @item @code{references} @tab @code{reload} @tab @code{regexp} @tab @code{rename}
  278. @item @code{replace} @tab @code{restrict} @tab @code{returns} @tab @code{revoke}
  279. @item @code{rlike} @tab @code{row} @tab @code{rows} @tab @code{second}
  280. @item @code{select} @tab @code{set} @tab @code{show} @tab @code{shutdown}
  281. @item @code{smallint} @tab @code{soname} @tab @code{sql_big_tables} @tab @code{sql_big_selects}
  282. @item @code{sql_low_priority_updates} @tab @code{sql_log_off} @tab @code{sql_log_update} @tab @code{sql_select_limit}
  283. @item @code{sql_small_result} @tab @code{sql_big_result} @tab @code{sql_warnings} @tab @code{straight_join}
  284. @item @code{starting} @tab @code{status} @tab @code{string} @tab @code{table}
  285. @item @code{tables} @tab @code{temporary} @tab @code{terminated} @tab @code{text}
  286. @item @code{then} @tab @code{time} @tab @code{timestamp} @tab @code{tinyblob}
  287. @item @code{tinytext} @tab @code{tinyint} @tab @code{trailing} @tab @code{to}
  288. @item @code{type} @tab @code{use} @tab @code{using} @tab @code{unique}
  289. @item @code{unlock} @tab @code{unsigned} @tab @code{update} @tab @code{usage}
  290. @item @code{values} @tab @code{varchar} @tab @code{variables} @tab @code{varying}
  291. @item @code{varbinary} @tab @code{with} @tab @code{write} @tab @code{when}
  292. @item @code{where} @tab @code{year} @tab @code{year_month} @tab @code{zerofill}
  293. @end multitable
  294. The following symbols (from the table above) are disallowed by ANSI SQL
  295. but allowed by @strong{MySQL} as column/table names. This is because some
  296. of these names are very natural names and a lot of people have already
  297. used them.
  298. @itemize @bullet
  299. @item @code{ACTION}
  300. @item @code{BIT}
  301. @item @code{DATE}
  302. @item @code{ENUM}
  303. @item @code{NO}
  304. @item @code{TEXT}
  305. @item @code{TIME}
  306. @item @code{TIMESTAMP}
  307. @end itemize
  308. @cindex table types, choosing
  309. @cindex @code{BDB} table type
  310. @cindex @code{Berkeley_db} table type
  311. @cindex @code{GEMINI} table type
  312. @cindex @code{HEAP} table type
  313. @cindex @code{ISAM} table type
  314. @cindex @code{INNOBASE} table type
  315. @cindex @code{MERGE} table type
  316. @cindex MySQL table types
  317. @cindex @code{MyISAM} table type
  318. @cindex types, of tables
  319. @node Table types, Tutorial, Reference, Top
  320. @chapter MySQL Table Types
  321. As of @strong{MySQL} Version 3.23.6, you can choose between three basic
  322. table formats (@code{ISAM}, @code{HEAP} and @code{MyISAM}.  Newer
  323. @strong{MySQL} may support additional table type (@code{BDB},
  324. @code{GEMINI} or @code{INNOBASE}), depending on how you compile it.
  325.  
  326. When you create a new table, you can tell @strong{MySQL} which table
  327. type it should use for the table.  @strong{MySQL} will always create a
  328. @code{.frm} file to hold the table and column definitions.  Depending on
  329. the table type, the index and data will be stored in other files.
  330. The default table type in @strong{MySQL} is @code{MyISAM}. If you are
  331. trying to use a table type that is not incompiled or activated,
  332. @strong{MySQL} will instead create a table of type @code{MyISAM}.
  333. You can convert tables between different types with the @code{ALTER
  334. TABLE} statement. @xref{ALTER TABLE, , @code{ALTER TABLE}}.
  335. Note that @strong{MySQL} supports two different kinds of
  336. tables. Transaction-safe tables (@code{BDB}, @code{INNOBASE} or
  337. @code{GEMINI}) and not transaction-safe tables (@code{HEAP}, @code{ISAM},
  338. @code{MERGE}, and @code{MyISAM}).
  339. Advantages of transaction-safe tables (TST):
  340. @itemize @bullet
  341. @item
  342. Safer. Even if @strong{MySQL} crashes or you get hardware problems, you
  343. can get your data back, either by automatic recovery or from a backup
  344. + the transaction log.
  345. @item
  346. You can combine many statements and accept these all in one go with
  347. the @code{COMMIT} command.
  348. @item
  349. You can execute @code{ROLLBACK} to ignore your changes (if you are not
  350. running in auto commit mode).
  351. @item
  352. If an update fails, all your changes will be restored. (With NTST tables all
  353. changes that have taken place are permanent)
  354. @end itemize
  355. Advantages of not transaction-safe tables (NTST):
  356. @itemize @bullet
  357. @item
  358. Much faster as there is no transcation overhead.
  359. @item
  360. Will use less disk space as there is no overhead of transactions.
  361. @item
  362. Will use less memory to do updates.
  363. @end itemize
  364. You can combine TST and NTST tables in the same statements to get the best
  365. of both worlds.
  366. @menu
  367. * MyISAM::                      MyISAM tables
  368. * MERGE::                       MERGE tables
  369. * ISAM::                        ISAM tables
  370. * HEAP::                        HEAP tables
  371. * BDB::                         BDB or Berkeley_db tables
  372. * GEMINI::                      GEMINI tables
  373. * INNOBASE::                    INNOBASE tables
  374. @end menu
  375. @node MyISAM, MERGE, Table types, Table types
  376. @section MyISAM Tables
  377. @code{MyISAM} is the default table type in @strong{MySQL} Version 3.23. It's
  378. based on the @code{ISAM} code and has a lot of useful extensions.
  379. The index is stored in a file with the @code{.MYI} (MYIndex) extension,
  380. and the data is stored in a file with the @code{.MYD} (MYData) extension.
  381. You can check/repair @code{MyISAM} tables with the @code{myisamchk}
  382. utility. @xref{Crash recovery}.
  383. The following is new in @code{MyISAM}:
  384. @itemize @bullet
  385. @item
  386. There is a flag in the @code{MyISAM} file that indicates whether or not
  387. the table was closed correctly.  If @code{mysqld} is started with
  388. @code{--myisam-recover}, @code{MyISAM} tables will automaticly be
  389. checked and/or repaired on open if the table wasn't closed properly.
  390. @item
  391. You can @code{INSERT} new rows in a table without deleted rows,
  392. while other threads are reading from the table.
  393. @item
  394. Support for big files (63-bit) on filesystems/operating systems that
  395. support big files.
  396. @item
  397. All data is stored with the low byte first. This makes the data machine
  398. and OS independent. The only requirement is that the machine uses
  399. two's-complement signed integers (as every machine for the last 20 years
  400. has) and IEEE floating-point format (also totally dominant among
  401. mainstream machines). The only area of machines that may not support
  402. binary compatibility are embedded systems (because they sometimes have
  403. peculiar processors).
  404. There is no big speed penalty in storing data low byte first; The bytes
  405. in a table row is normally unaligned and it doesn't take that much more
  406. power to read an unaligned byte in order than in reverse order.  The
  407. actual fetch-column-value code is also not time critical compared to
  408. other code.
  409. @item
  410. All number keys are stored with high byte first to give better index
  411. compression.
  412. @item
  413. Internal handling of one @code{AUTO_INCREMENT} column. @code{MyISAM}
  414. will automatically update this on @code{INSERT/UPDATE}. The
  415. @code{AUTO_INCREMENT} value can be reset with @code{myisamchk}. This
  416. will make @code{AUTO_INCREMENT} columns faster (at least 10 %) and old
  417. numbers will not be reused as with the old ISAM. Note that when an
  418. @code{AUTO_INCREMENT} is defined on the end of a multi-part-key the old
  419. behavior is still present.
  420. @item
  421. When inserted in sorted order (as when you are using an @code{AUTO_INCREMENT}
  422. column) the key tree will be split so that the high node only contains one
  423. key. This will improve the space utilization in the key tree.
  424. @item
  425. @code{BLOB} and @code{TEXT} columns can be indexed.
  426. @item
  427. @code{NULL} values are allowed in indexed columns.  This takes 0-1
  428. bytes/key.
  429. @item
  430. Maximum key length is 500 bytes by default (can be changed by
  431. recompiling).  In cases of keys longer than 250 bytes, a bigger key
  432. block size than the default of 1024 bytes is used for this key.
  433. @item
  434. Maximum number of keys/table is 32 as default. This can be enlarged to 64 
  435. without having to recompile @code{myisamchk}.
  436. @item
  437. @code{myisamchk} will mark tables as checked if one runs it with
  438. @code{--update-state}. @code{myisamchk --fast} will only check those
  439. tables that don't have this mark.
  440. @item
  441. @code{myisamchk -a} stores statistics for key parts (and not only for
  442. whole keys as in @code{ISAM}).
  443. @item
  444. Dynamic size rows will now be much less fragmented when mixing deletes
  445. with updates and inserts.  This is done by automatically combining adjacent
  446. deleted blocks and by extending blocks if the next block is deleted.
  447. @item
  448. @code{myisampack} can pack @code{BLOB} and @code{VARCHAR} columns.
  449. @end itemize
  450. @code{MyISAM} also supports the following things, which @strong{MySQL}
  451. will be able to use in the near future:
  452. @itemize @bullet
  453. @item
  454. Support for a true @code{VARCHAR} type; A @code{VARCHAR} column starts
  455. with a length stored in 2 bytes.
  456. @item
  457. Tables with @code{VARCHAR} may have fixed or dynamic record length.
  458. @item
  459. @code{VARCHAR} and @code{CHAR} may be up to 64K.
  460. All key segments have their own language definition. This will enable
  461. @strong{MySQL} to have different language definitions per column.
  462. @item
  463. A hashed computed index can be used for @code{UNIQUE}. This will allow
  464. you to have @code{UNIQUE} on any combination of columns in a table. (You
  465. can't search on a @code{UNIQUE} computed index, however.)
  466. @end itemize
  467. Note that index files are usually much smaller with @code{MyISAM} than with
  468. @code{ISAM}. This means that @code{MyISAM} will normally use less
  469. system resources than @code{ISAM}, but will need more CPU when inserting
  470. data into a compressed index.
  471. The following options to @code{mysqld} can be used to change the behavior of
  472. @code{MyISAM} tables:
  473. @multitable @columnfractions .40 .60
  474. @item @strong{Option} @tab @strong{Meaning}
  475. @item @code{--myisam-recover=#} @tab Automatic recover of crashed tables.
  476. @item @code{-O myisam_sort_buffer_size=#} @tab Buffer used when recovering tables.
  477. @item @code{--delay-key-write-for-all-tables} @tab Don't flush key buffers between writes for any MyISAM table
  478. @end multitable
  479. The automatic recovery is activated if you start mysqld with
  480. @code{--myisam-recover=#}. @xref{Command-line options}.
  481. On open, the table is checked if it's marked as crashed or if the open
  482. count variable for the table is not 0 and you are running with
  483. @code{--skip-locking}.  If either of the above is true the following happens.
  484. @itemize @bullet
  485. @item
  486. The table is checked for errors.
  487. @item
  488. If we found an error, try to do a fast repair (with sorting and without
  489. re-creating the data file) of the table.
  490. @item
  491. If the repair fails because of an error in the data file (for example a
  492. duplicate key error), we try again, but this time we re-create the data file.
  493. @item
  494. If the repair fails, retry once more with the old repair option method
  495. (write row by row without sorting) which should be able to repair any
  496. type of error with little disk requirements..
  497. @end itemize
  498. If the recover wouldn't be able to recover all rows from a previous
  499. completed statement and you didn't specify @code{FORCE} as an option to
  500. @code{myisam-recover}, then the automatic repair will abort with an error
  501. message in the error file:
  502. @example
  503. Error: Couldn't repair table: test.g00pages
  504. @end example
  505. If you in this case had used the @code{FORCE} option you would instead have got
  506. a warning in the error file:
  507. @example
  508. Warning: Found 344 of 354 rows when repairing ./test/g00pages
  509. @end example
  510. Note that if you run automatic recover with the @code{BACKUP} option,
  511. you should have a cron script that automaticly moves file with names
  512. like @file{tablename-datetime.BAK} from the database directories to a
  513. backup media.
  514. @xref{Command-line options}.
  515. @menu
  516. * Key space::                   Space needed for keys
  517. * MyISAM table formats::        MyISAM table formats
  518. @end menu
  519. @cindex key space, MyISAM
  520. @node Key space, MyISAM table formats, MyISAM, MyISAM
  521. @subsection Space Needed for Keys
  522. @strong{MySQL} can support different index types, but the normal type is
  523. ISAM or MyISAM.  These use a B-tree index, and you can roughly calculate
  524. the size for the index file as @code{(key_length+4)/0.67}, summed over
  525. all keys.  (This is for the worst case when all keys are inserted in
  526. sorted order and we don't have any compressed keys.)
  527. String indexes are space compressed. If the first index part is a
  528. string, it will also be prefix compressed.  Space compression makes the
  529. index file smaller than the above figures if the string column has a lot
  530. of trailing space or is a @code{VARCHAR} column that is not always used
  531. to the full length. Prefix compression is used on keys that start
  532. with a string.  Prefix compression helps if there are many strings
  533. with an identical prefix.
  534. In @code{MyISAM} tables, you can also prefix compress numbers by specifying
  535. @code{PACK_KEYS=1} when you create the table.  This helps when you have
  536. many integer keys that have an identical prefix when the numbers are stored
  537. high-byte first.
  538. @node MyISAM table formats,  , Key space, MyISAM
  539. @subsection MyISAM Table Formats
  540. @strong{MyISAM} supports 3 different table types. Two of them are chosen
  541. automatically depending on the type of columns you are using. The third,
  542. compressed tables, can only be created with the @code{myisampack} tool.
  543. @menu
  544. * Static format::               Static (Fixed-length) table characteristics
  545. * Dynamic format::              Dynamic table characteristics
  546. * Compressed format::           Compressed table characteristics
  547. @end menu
  548. @node Static format, Dynamic format, MyISAM table formats, MyISAM table formats
  549. @subsubsection Static (Fixed-length) Table Characteristics
  550. This is the default format. It's used when the table contains no
  551. @code{VARCHAR}, @code{BLOB}, or @code{TEXT} columns.
  552. This format is the simplest and most secure format. It is also the
  553. fastest of the on-disk formats. The speed comes from the easy way data
  554. can be found on disk. When looking up something with an index and static
  555. format it is very simple. Just multiply the row number by the row length.
  556. Also, when scanning a table it is very easy to read a constant number of
  557. records with each disk read.
  558. The security is evidenced if your computer crashes when writing to a
  559. fixed-size MyISAM file, in which case @code{myisamchk} can easily figure out where each
  560. row starts and ends. So it can usually reclaim all records except the
  561. partially written one. Note that in @strong{MySQL} all indexes can always be
  562. reconstructed:
  563. @itemize @bullet
  564. @item
  565. All @code{CHAR}, @code{NUMERIC}, and @code{DECIMAL} columns are space-padded
  566. to the column width.
  567. @item
  568. Very quick.
  569. @item
  570. Easy to cache.
  571. @item
  572. Easy to reconstruct after a crash, because records are located in fixed
  573. positions.
  574. @item
  575. Doesn't have to be reorganized (with @code{myisamchk}) unless a huge number of
  576. records are deleted and you want to return free disk space to the operating
  577. system.
  578. @item
  579. Usually requires more disk space than dynamic tables.
  580. @end itemize
  581. @cindex dynamic table characteristics
  582. @cindex tables, dynamic
  583. @node Dynamic format, Compressed format, Static format, MyISAM table formats
  584. @subsubsection Dynamic Table Characteristics
  585. This format is used if the table contains any @code{VARCHAR}, @code{BLOB},
  586. or @code{TEXT} columns or if the table was created with
  587. @code{ROW_FORMAT=dynamic}.
  588. This format is a litte more complex because each row has to have a header
  589. that says how long it is. One record can also end up at more than one
  590. location when it is made longer at an update.
  591. @cindex tables, defragment
  592. You can use @code{OPTIMIZE table} or @code{myisamchk} to defragment a
  593. table. If you have static data that you access/change a lot in the same
  594. table as some @code{VARCHAR} or @code{BLOB} columns, it might be a good
  595. idea to move the dynamic columns to other tables just to avoid
  596. fragmentation:
  597. @itemize @bullet
  598. @item
  599. All string columns are dynamic (except those with a length less than 4).
  600. @item
  601. Each record is preceded by a bitmap indicating which columns are empty
  602. (@code{''}) for string columns, or zero for numeric columns. (This isn't
  603. the same as columns containing @code{NULL} values.) If a string column
  604. has a length of zero after removal of trailing spaces, or a numeric
  605. column has a value of zero, it is marked in the bit map and not saved to
  606. disk.  Non-empty strings are saved as a length byte plus the string
  607. contents.
  608. @item
  609. Usually takes much less disk space than fixed-length tables.
  610. @item
  611. Each record uses only as much space as is required. If a record becomes
  612. larger, it is split into as many pieces as are required.  This results in record
  613. fragmentation.
  614. @item
  615. If you update a row with information that extends the row length, the
  616. row will be fragmented.  In this case, you may have to run @code{myisamchk
  617. -r} from time to time to get better performance.  Use @code{myisamchk -ei
  618. tbl_name} for some statistics.
  619. @item
  620. Not as easy to reconstruct after a crash, because a record may be fragmented
  621. into many pieces and a link (fragment) may be missing.
  622. @item
  623. The expected row length for dynamic sized records is:
  624. @example
  625. 3
  626. + (number of columns + 7) / 8
  627. + (number of char columns)
  628. + packed size of numeric columns
  629. + length of strings
  630. + (number of NULL columns + 7) / 8
  631. @end example
  632. There is a penalty of 6 bytes for each link. A dynamic record is linked
  633. whenever an update causes an enlargement of the record. Each new link will be
  634. at least 20 bytes, so the next enlargement will probably go in the same link.
  635. If not, there will be another link. You may check how many links there are
  636. with @code{myisamchk -ed}. All links may be removed with @code{myisamchk -r}.
  637. @end itemize
  638. @cindex tables, compressed format
  639. @node Compressed format,  , Dynamic format, MyISAM table formats
  640. @subsubsection Compressed Table Characteristics
  641. This is a read-only type that is generated with the optional
  642. @code{myisampack} tool (@code{pack_isam} for @code{ISAM} tables):
  643. @itemize @bullet
  644. @item
  645. All MySQL distributions, even those that existed before @strong{MySQL}
  646. went GPL, can read tables that were compressed with @code{myisampack}.
  647. @item
  648. Compressed tables take very little disk space. This minimizes disk usage, which
  649. is very nice when using slow disks (like CD-ROMs).
  650. @item
  651. Each record is compressed separately (very little access overhead).  The
  652. header for a record is fixed (1-3 bytes) depending on the biggest record in the
  653. table.  Each column is compressed differently. Some of the compression types
  654. are:
  655. @itemize @minus
  656. @item
  657. There is usually a different Huffman table for each column.
  658. @item
  659. Suffix space compression.
  660. @item
  661. Prefix space compression.
  662. @item
  663. Numbers with value @code{0} are stored using 1 bit.
  664. @item
  665. If values in an integer column have a small range, the column is stored using
  666. the smallest possible type. For example, a @code{BIGINT} column (8 bytes) may
  667. be stored as a @code{TINYINT} column (1 byte) if all values are in the range
  668. @code{0} to @code{255}.
  669. @item
  670. If a column has only a small set of possible values, the column type is
  671. converted to @code{ENUM}.
  672. @item
  673. A column may use a combination of the above compressions.
  674. @end itemize
  675. @item
  676. Can handle fixed- or dynamic-length records, but not @code{BLOB} or @code{TEXT}
  677. columns.
  678. @item
  679. Can be uncompressed with @code{myisamchk}.
  680. @end itemize
  681. @cindex tables, merging
  682. @cindex MERGE tables, defined
  683. @node MERGE, ISAM, MyISAM, Table types
  684. @section MERGE Tables
  685. @code{MERGE} tables are new in @strong{MySQL} Version 3.23.25. The code
  686. is still in beta, but should stabilize soon!
  687. A @code{MERGE} table is a collection of identical @code{MyISAM} tables
  688. that can be used as one.  You can only @code{SELECT}, @code{DELETE}, and
  689. @code{UPDATE} from the collection of tables.  If you @code{DROP} the
  690. @code{MERGE} table, you are only dropping the @code{MERGE}
  691. specification.
  692. Note that @code{DELETE FROM merge_table} used without a @code{WHERE}
  693. will only clear the mapping for the table, not delete everything in the
  694. mapped tables. (We plan to fix this in 4.0).
  695. With identical tables we mean that all tables are created with identical
  696. column information.  You can't put a MERGE over tables where the columns
  697. are packed differently or doesn't have exactly the same columns.
  698. Some of the tables can however be compressed with @code{myisampack}.
  699. @xref{myisampack}.
  700. When you create a @code{MERGE} table, you will get a @code{.frm} table
  701. definition file and a @code{.MRG} table list file.  The @code{.MRG} just
  702. contains a list of the index files (@code{.MYI} files) that should
  703. be used as one.
  704. For the moment you need to have @code{SELECT}, @code{UPDATE}, and
  705. @code{DELETE} privileges on the tables you map to a @code{MERGE} table.
  706. @code{MERGE} tables can help you solve the following problems:
  707. @itemize @bullet
  708. @item
  709. Easily manage a set of log tables. For example, you can put data from
  710. different months into separate files, compress some of them with
  711. @code{myisampack}, and then create a @code{MERGE} to use these as one.
  712. @item
  713. Give you more speed. You can split a big read-only table based on some
  714. criteria and then put the different table part on different disks.
  715. A @code{MERGE} table on this could be much faster than using
  716. the big table. (You can, of course, also use a RAID to get the same
  717. kind of benefits.)
  718. @item
  719. Do more efficient searches. If you know exactly what you are looking
  720. after, you can search in just one of the split tables for some queries
  721. and use @strong{MERGE} table for others.  You can even have many
  722. different @code{MERGE} tables active, with possible overlapping files.
  723. @item
  724. More efficient repairs. It's easier to repair the individual files that
  725. are mapped to a @code{MERGE} file than trying to repair a real big file.
  726. @item
  727. Instant mapping of many files as one. A @code{MERGE} table uses the
  728. index of the individual tables. It doesn't need an index of its one.
  729. This makes @code{MERGE} table collections VERY fast to make or remap.
  730. @item
  731. If you have a set of tables that you join to a big table on demand or
  732. batch, you should instead create a @code{MERGE} table on them on demand.
  733. This is much faster and will save a lot of disk space.
  734. @item
  735. Go around the file size limit for the operating system.
  736. @item
  737. You can create an alias/synonym for a table by just using MERGE over one
  738. table. There shouldn't be any really notable performance impacts of doing this
  739. (only a couple of indirect calls and memcpy's for each read).
  740. @end itemize
  741. The disadvantages with @code{MERGE} tables are:
  742. @itemize @bullet
  743. @item
  744. You can't use @code{INSERT} on @code{MERGE} tables, as @strong{MySQL}
  745. can't know in which of the tables we should insert the row.
  746. @item
  747. You can only use identical @code{MyISAM} tables for a @code{MERGE} table.
  748. @item
  749. @code{MERGE} tables uses more file descriptors. If you are using a
  750. @strong{MERGE} that maps over 10 tables and 10 users are using this, you
  751. are using 10*10 + 10 file descriptors.  (10 data files for 10 users
  752. and 10 shared index files.)
  753. @item
  754. Key reads are slower. When you do a read on a key, the @code{MERGE}
  755. handler will need to issue a read on all underlying tables to check
  756. which one most closely matches the given key.  If you then do a 'read-next'
  757. then the merge table handler will need to search the read buffers
  758. to find the next key. Only when one key buffer is used up, the handler
  759. will need to read the next key block. This makes @code{MERGE} keys much slower
  760. on @code{eq_ref} searches, but not much slower on @code{ref} searches.
  761. @xref{EXPLAIN}.
  762. @item
  763. You can't do @code{DROP TABLE}, @code{ALTER TABLE} or @code{DELETE FROM
  764. table_name} without a @code{WHERE} clause on any of the table that is
  765. mapped by a @code{MERGE} table that is 'open'.  If you do this, the
  766. @code{MERGE} table may still refer to the original table and you will
  767. get unexpected results.
  768. @end itemize
  769. The following example shows you how to use @code{MERGE} tables:
  770. @example
  771. CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
  772. CREATE TABLE t2 (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
  773. INSERT INTO t1 (message) VALUES ("Testing"),("table"),("t1");
  774. INSERT INTO t2 (message) VALUES ("Testing"),("table"),("t2");
  775. CREATE TABLE total (a INT NOT NULL, message CHAR(20), KEY(a)) TYPE=MERGE UNION=(t1,t2);
  776. @end example
  777. Note that we didn't create a @code{UNIQUE} or @code{PRIMARY KEY} in the
  778. @code{total} table as the key isn't going to be unique in the @code{total}
  779. table.
  780. Note that you can also manipulate the @code{.MRG} file directly from
  781. the outside of the @strong{MySQL} server:
  782. @example
  783. shell> cd /mysql-data-directory/current-database
  784. shell> ls -1 t1.MYI t2.MYI > total.MRG
  785. shell> mysqladmin flush-tables
  786. @end example
  787. Now you can do things like:
  788. @example
  789. mysql> select * from total;
  790. +---+---------+
  791. | a | message |
  792. +---+---------+
  793. | 1 | Testing |
  794. | 2 | table   |
  795. | 3 | t1      |
  796. | 1 | Testing |
  797. | 2 | table   |
  798. | 3 | t2      |
  799. +---+---------+
  800. @end example
  801. To remap a @code{MERGE} table you can do one of the following:
  802. @itemize @bullet
  803. @item
  804. @code{DROP} the table and re-create it
  805. @item
  806. Use @code{ALTER TABLE table_name UNION(...)}
  807. @item
  808. Change the @code{.MRG} file and issue a @code{FLUSH TABLE} on the
  809. @code{MERGE} table and all underlying tables to force the handler to
  810. read the new definition file.
  811. @end itemize
  812. @cindex tables, ISAM
  813. @node ISAM, HEAP, MERGE, Table types
  814. @section ISAM Tables
  815. You can also use the deprecated ISAM table type. This will disappear
  816. rather soon because @code{MyISAM} is a better implementation of the same
  817. thing. ISAM uses a @code{B-tree} index. The index is stored in a file
  818. with the @code{.ISM} extension, and the data is stored in a file with the
  819. @code{.ISD} extension.  You can check/repair ISAM tables with the
  820. @code{isamchk} utility. @xref{Crash recovery}.
  821. @code{ISAM} has the following features/properties:
  822. @itemize @bullet
  823. @item Compressed and fixed-length keys
  824. @item Fixed and dynamic record length
  825. @item 16 keys with 16 key parts/key
  826. @item Max key length 256 (default)
  827. @item Data is stored in machine format; this is fast, but is machine/OS dependent.
  828. @end itemize
  829. Most of the things true for @code{MyISAM} tables are also true for @code{ISAM}
  830. tables. @xref{MyISAM}. The major differences compared to @code{MyISAM}
  831. tables are:
  832. @itemize @bullet
  833. @item ISAM tables are not binary portable across OS/Platforms.
  834. @item Can't handle tables > 4G.
  835. @item Only support prefix compression on strings.
  836. @item Smaller key limits.
  837. @item Dynamic tables get more fragmented.
  838. @item Tables are compressed with @code{pack_isam} rather than with @code{myisampack}.
  839. @end itemize
  840. @cindex tables, @code{HEAP}
  841. @node HEAP, BDB, ISAM, Table types
  842. @section HEAP Tables
  843. @code{HEAP} tables use a hashed index and are stored in memory.  This
  844. makes them very fast, but if @strong{MySQL} crashes you will lose all
  845. data stored in them.  @code{HEAP} is very useful for temporary tables!
  846. The @strong{MySQL} internal HEAP tables use 100% dynamic hashing
  847. without overflow areas. There is no extra space needed for free lists.
  848. @code{HEAP} tables also don't have problems with delete + inserts, which
  849. normally is common with hashed tables:
  850. @example
  851. mysql> CREATE TABLE test TYPE=HEAP SELECT ip,SUM(downloads) as down
  852.         FROM log_table GROUP BY ip;
  853. mysql> SELECT COUNT(ip),AVG(down) FROM test;
  854. mysql> DROP TABLE test;
  855. @end example
  856. Here are some things you should consider when you use @code{HEAP} tables:
  857. @itemize @bullet
  858. @item
  859. You should always use specify @code{MAX_ROWS} in the @code{CREATE} statement
  860. to ensure that you accidently do not use all memory.
  861. @item
  862. Indexes will only be used with @code{=} and @code{<=>} (but are VERY fast).
  863. @item
  864. @code{HEAP} tables can only use whole keys to search for a row; compare this
  865. to @code{MyISAM} tables where any prefix of the key can be used to find rows.
  866. @item
  867. @code{HEAP} tables use a fixed record length format.
  868. @item
  869. @code{HEAP} doesn't support @code{BLOB}/@code{TEXT} columns.
  870. @item
  871. @code{HEAP} doesn't support @code{AUTO_INCREMENT} columns.
  872. @item
  873. @code{HEAP} doesn't support an index on a @code{NULL} column.
  874. @item
  875. You can have non-unique keys in a @code{HEAP} table (this isn't common for
  876. hashed tables).
  877. @item
  878. @code{HEAP} tables are shared between all clients (just like any other
  879. table).
  880. @item
  881. You can't search for the next entry in order (that is, to use the index
  882. to do an @code{ORDER BY}).
  883. @item
  884. Data for @code{HEAP} tables are allocated in small blocks. The tables
  885. are 100% dynamic (on inserting). No overflow areas and no extra key
  886. space are needed.  Deleted rows are put in a linked list and are
  887. reused when you insert new data into the table.
  888. @item
  889. You need enough extra memory for all HEAP tables that you want to use at
  890. the same time.
  891. @item
  892. To free memory, you should execute @code{DELETE FROM heap_table},
  893. @code{TRUNCATE heap_table} or @code{DROP TABLE heap_table}.
  894. @item
  895. @strong{MySQL} cannot find out approximately how many rows there
  896. are between two values (this is used by the range optimizer to decide which
  897. index to use).  This may affect some queries if you change a @code{MyISAM}
  898. table to a @code{HEAP} table.
  899. @item
  900. To ensure that you accidentally don't do anything foolish, you can't create
  901. @code{HEAP} tables bigger than @code{max_heap_table_size}.
  902. @end itemize
  903. The memory needed for one row in a @code{HEAP} table is:
  904. @example
  905. SUM_OVER_ALL_KEYS(max_length_of_key + sizeof(char*) * 2)
  906. + ALIGN(length_of_row+1, sizeof(char*))
  907. @end example
  908. @code{sizeof(char*)} is 4 on 32-bit machines and 8 on 64-bit machines.
  909. @cindex tables, @code{BDB}
  910. @cindex tables, @code{Berkeley DB}
  911. @node BDB, GEMINI, HEAP, Table types
  912. @section BDB or Berkeley_db Tables
  913. @menu
  914. * BDB overview::                
  915. * BDB install::                 
  916. * BDB start::                   
  917. * BDB characteristic::          
  918. * BDB TODO::                    
  919. * BDB errors::                  
  920. @end menu
  921. @node BDB overview, BDB install, BDB, BDB
  922. @subsection Overview over BDB tables
  923. BDB tables are included in the @strong{MySQL} source distribution
  924. starting from 3.23.34 and will be activated in the @strong{MySQL}-max
  925. binary.
  926. Berkeley DB (@uref{http://www.sleepycat.com}) has provided
  927. @strong{MySQL} with a transaction-safe table handler. This will survive
  928. crashes and also provides @code{COMMIT} and @code{ROLLBACK} on
  929. transactions. The @strong{MySQL} source distribution comes with a BDB
  930. distribution that has a couple of small patches to make it work more
  931. smoothly with @strong{MySQL}.  You can't use a not-patched @code{BDB}
  932. version with @strong{MySQL}.
  933. @node BDB install, BDB start, BDB overview, BDB
  934. @subsection Installing BDB
  935. If you have downloaded a binary version of @strong{MySQL} that includes
  936. support for Berkeley DB, simply follow the instructions for
  937. installing a binary version of @strong{MySQL}. @xref{Installing binary}.
  938. To compile MySQL with Berkeley DB support, download @strong{MySQL}
  939. 3.23.34 or newer and configure @code{MySQL} with the
  940. @code{--with-berkeley-db} option. @xref{Installing source}.
  941. @example
  942. cd /path/to/source/of/mysql-3.23.34
  943. ./configure --with-berkeley-db
  944. @end example
  945. Please refer to the manual provided by @code{BDB} distribution for
  946. more/updated information.
  947. Even though Berkeley DB is in itself very tested and reliable,
  948. the @strong{MySQL} interface is still considered beta quality.
  949. We are actively improving and optimizing it to get it stable very
  950. soon.
  951. @node BDB start, BDB characteristic, BDB install, BDB
  952. @subsection BDB startup options
  953. If you are running with @code{AUTOCOMMIT=0} then your changes in @code{BDB}
  954. tables will not be updated until you execute @code{COMMIT}.  Instead of commit
  955. you can execute @code{ROLLBACK} to forget your changes. @xref{COMMIT}.
  956. If you are running with @code{AUTOCOMMIT=1} (the default), your changes
  957. will be committed immediately.  You can start an extended transaction with
  958. the @code{BEGIN WORK} SQL command, after which your changes will not be
  959. committed until you execute @code{COMMIT} (or decide to @code{ROLLBACK}
  960. the changes).
  961. The following options to @code{mysqld} can be used to change the behavior of
  962. BDB tables:
  963. @multitable @columnfractions .30 .70
  964. @item @strong{Option} @tab @strong{Meaning}
  965. @item @code{--bdb-home=directory} @tab  Base directory for BDB tables. This should be the same directory you use for --datadir.
  966. @item @code{--bdb-lock-detect=#} @tab  Berkeley lock detect. One of (DEFAULT, OLDEST, RANDOM, or YOUNGEST).
  967. @item @code{--bdb-logdir=directory} @tab Berkeley DB log file directory.
  968. @item @code{--bdb-no-sync} @tab Don't synchronously flush logs.
  969. @item @code{--bdb-no-recover} @tab Don't start Berkeley DB in recover mode.
  970. @item @code{--bdb-shared-data} @tab Start Berkeley DB in multi-process mode (Don't use @code{DB_PRIVATE} when initializing Berkeley DB)
  971. @item @code{--bdb-tmpdir=directory} @tab Berkeley DB tempfile name.
  972. @item @code{--skip-bdb} @tab Don't use berkeley db.
  973. @item @code{-O bdb_max_lock=1000} @tab Set the maximum number of locks possible. @xref{SHOW VARIABLES}.
  974. @end multitable
  975. If you use @code{--skip-bdb}, @strong{MySQL} will not initialize the
  976. Berkeley DB library and this will save a lot of memory. Of course,
  977. you cannot use @code{BDB} tables if you are using this option.
  978. Normally you should start mysqld without @code{--bdb-no-recover} if you
  979. intend to use BDB tables.  This may, however, give you problems when you
  980. try to start mysqld if the BDB log files are corrupted. @xref{Starting
  981. server}.
  982. With @code{bdb_max_lock} you can specify the maximum number of locks
  983. (10000 by default) you can have active on a BDB table. You should
  984. increase this if you get errors of type @code{bdb: Lock table is out of
  985. available locks} or @code{Got error 12 from ...}  when you have do long
  986. transactions or when @code{mysqld} has to examine a lot of rows to
  987. calculate the query.
  988. You may also want to change @code{binlog_cache_size} and
  989. @code{max_binlog_cache_size} if you are using big multi-line transactions.
  990. @xref{COMMIT}.
  991. @node BDB characteristic, BDB TODO, BDB start, BDB
  992. @subsection Some characteristic of @code{BDB} tables:
  993. @itemize @bullet
  994. @item
  995. To be able to rollback transactions BDB maintain log files.  For maximum
  996. performance you should place these on another disk than your databases
  997. by using the @code{--bdb_log_dir} options.
  998. @item
  999. @strong{MySQL} performs a checkpoint each time a new BDB log
  1000. file is started, and removes any log files that are not needed for
  1001. current transactions.  One can also run @code{FLUSH LOGS} at any time
  1002. to checkpoint the Berkeley DB tables.
  1003. For disaster recovery, one should use table backups plus
  1004. @strong{MySQL}'s binary log. @xref{Backup}.
  1005. @strong{Warning}: If you delete old log files that are in use, BDB will
  1006. not be able to do recovery at all and you may loose data if something
  1007. goes wrong.
  1008. @item
  1009. @strong{MySQL} requires a @code{PRIMARY KEY} in each BDB table to be
  1010. able to refer to previously read rows. If you don't create one,
  1011. @strong{MySQL} will create an maintain a hidden @code{PRIMARY KEY} for
  1012. you.  The hidden key has a length of 5 bytes and is incremented for each
  1013. insert attempt.
  1014. @item
  1015. If all columns you access in a @code{BDB} table are part of the same index or
  1016. part of the primary key, then @strong{MySQL} can execute the query
  1017. without having to access the actual row.  In a @code{MyISAM} table the
  1018. above holds only if the columns are part of the same index.
  1019. @item
  1020. The @code{PRIMARY KEY} will be faster than any other key, as the
  1021. @code{PRIMARY KEY} is stored together with the row data.  As the other keys are
  1022. stored as the key data + the @code{PRIMARY KEY}, it's important to keep the
  1023. @code{PRIMARY KEY} as short as possible to save disk and get better speed.
  1024. @item
  1025. @code{LOCK TABLES} works on @code{BDB} tables as with other tables.  If
  1026. you don't use @code{LOCK TABLE}, @strong{MYSQL} will issue an internal
  1027. multiple-write lock on the table to ensure that the table will be
  1028. properly locked if another thread issues a table lock.
  1029. @item
  1030. Internal locking in @code{BDB} tables is done on page level.
  1031. @item
  1032. @code{SELECT COUNT(*) FROM table_name} is slow as @code{BDB} tables doesn't
  1033. maintain a count of the number of rows in the table.
  1034. @item
  1035. Scanning is slower than with @code{MyISAM} tables as one has data in BDB
  1036. tables stored in B-trees and not in a separate data file.
  1037. @item
  1038. The application must always be prepared to handle cases where
  1039. any change of a @code{BDB} table may make an automatic rollback and any
  1040. read may fail with a deadlock error.
  1041. @item
  1042. Keys are not compressed to previous keys as with ISAM or MyISAM
  1043. tables. In other words, the key information will take a little more
  1044. space in @code{BDB} tables compared to MyISAM tables which don't use
  1045. @code{PACK_KEYS=0}.
  1046. @item
  1047. There is often holes in the BDB table to allow you to insert new rows in
  1048. the middle of the key tree.  This makes BDB tables somewhat larger than
  1049. MyISAM tables.
  1050. @item
  1051. The optimizer needs to know an approximation of the number of rows in
  1052. the table.  @strong{MySQL} solves this by counting inserts and
  1053. maintaining this in a separate segment in each BDB table.  If you don't
  1054. do a lot of @code{DELETE} or @code{ROLLBACK}:s this number should be
  1055. accurate enough for the @strong{MySQL} optimizer, but as @strong{MySQL}
  1056. only store the number on close, it may be wrong if @strong{MySQL} dies
  1057. unexpectedly. It should not be fatal even if this number is not 100 %
  1058. correct.  One can update the number of rows by executing @code{ANALYZE
  1059. TABLE} or @code{OPTIMIZE TABLE}. @xref{ANALYZE TABLE} . @xref{OPTIMIZE
  1060. TABLE}.
  1061. @item
  1062. If you get full disk with a @code{BDB} table, you will get an error
  1063. (probably error 28) and the transaction should roll back.  This is in
  1064. contrast with @code{MyISAM} and @code{ISAM} tables where mysqld will
  1065. wait for enough free disk before continuing.
  1066. @end itemize
  1067. @node BDB TODO, BDB errors, BDB characteristic, BDB
  1068. @subsection Some things we need to fix for BDB in the near future:
  1069. @itemize @bullet
  1070. @item
  1071. It's very slow to open many BDB tables at the same time. If you are
  1072. going to use BDB tables, you should not have a very big table cache (>
  1073. 256 ?) and you should use @code{--no-auto-rehash} with the @code{mysql}
  1074. client.  We plan to partly fix this in 4.0.
  1075. @item
  1076. @code{SHOW TABLE STATUS} doesn't yet provide that much information for BDB
  1077. tables.
  1078. @item
  1079. Optimize performance.
  1080. @item
  1081. Change to not use page locks at all when we are scanning tables.
  1082. @end itemize
  1083. @node BDB errors,  , BDB TODO, BDB
  1084. @subsection Errors You May Get When Using BDB Tables
  1085. @itemize @bullet
  1086. @item
  1087. If you get the following error in the @code{hostname.err log} when
  1088. starting @code{mysqld}:
  1089. @example
  1090. bdb:  Ignoring log file: .../log.XXXXXXXXXX: unsupported log version #
  1091. @end example
  1092. it means that the new @code{BDB} version doesn't support the old log
  1093. file format.  In this case you have to delete all @code{BDB} log BDB
  1094. from your database directory (the files that has the format
  1095. @code{log.XXXXXXXXXX} ) and restart @code{mysqld}.  We would also
  1096. recommend you to do a @code{mysqldump --opt} of your old @code{BDB}
  1097. tables, delete the old table and restore the dump.
  1098. @item
  1099. If you are running in not @code{auto_commit} mode and delete a table you
  1100. are using by another thread you may get the following error messages in
  1101. the @strong{MySQL} error file:
  1102. @example
  1103. 001119 23:43:56  bdb:  Missing log fileid entry
  1104. 001119 23:43:56  bdb:  txn_abort: Log undo failed for LSN: 1 3644744: Invalid
  1105. @end example
  1106. This is not fatal but we don't recommend that you delete tables if you are
  1107. not in @code{auto_commit} mode, until this problem is fixed (the fix is
  1108. not trivial).
  1109. @end itemize
  1110. @cindex tables, @code{GEMINI}
  1111. @node GEMINI, INNOBASE, BDB, Table types
  1112. @section GEMINI Tables
  1113. @menu
  1114. * GEMINI overview::             
  1115. * GEMINI start::                
  1116. * GEMINI features::             
  1117. * GEMINI TODO::                 
  1118. @end menu
  1119. @node GEMINI overview, GEMINI start, GEMINI, GEMINI
  1120. @subsection Overview of GEMINI tables
  1121. The @code{GEMINI} table type is developed and supported by NuSphere Corporation
  1122. (@uref{http://www.nusphere.com}).  It features row-level locking, transaction
  1123. support (@code{COMMIT} and @code{ROLLBACK}), and automatic crash recovery.
  1124. @code{GEMINI} tables will be included in the @strong{MySQL} 3.23.35 source
  1125. distribution.
  1126. @node GEMINI start, GEMINI features, GEMINI overview, GEMINI
  1127. @subsection GEMINI startup options
  1128. If you are running with @code{AUTOCOMMIT=0} then your changes in @code{GEMINI}
  1129. tables will not be updated until you execute @code{COMMIT}.  Instead of commit
  1130. you can execute @code{ROLLBACK} to forget your changes. @xref{COMMIT}.
  1131. If you are running with @code{AUTOCOMMIT=1} (the default), your changes
  1132. will be committed immediately.  You can start an extended transaction with
  1133. the @code{BEGIN WORK} SQL command, after which your changes will not be
  1134. committed until you execute @code{COMMIT} (or decide to @code{ROLLBACK}
  1135. the changes).
  1136. The following options to @code{mysqld} can be used to change the behavior of
  1137. GEMINI tables:
  1138. @multitable @columnfractions .30 .70
  1139. @item @strong{Option} @tab @strong{Meaning}
  1140. @item @code{--gemini-full-recovery} @tab Default.
  1141. @item @code{--gemini-no-recovery} @tab Turn off recovery logging.  Not recommended.
  1142. @item @code{--gemini-lazy-commit} @tab Relaxes the flush log at commit rule.
  1143. @item @code{--gemini-unbuffered-io} @tab All database writes bypass OS cache.
  1144. @item @code{--skip-gemini} @tab Don't use Gemini.
  1145. @item @code{--O gemini_db_buffers=#} @tab Number of database buffers in database cache.
  1146. @item @code{--O gemini_connection_limit=#} @tab Maximum number of connections to Gemini.
  1147. @item @code{--O gemini_spin_retries=#} @tab Spin lock retries (optimization).
  1148. @item @code{--O gemini_io_threads=#} @tab Number of background I/O threads.
  1149. @item @code{--O gemini_lock_table_size=#} @tab Set the maximum number of locks.  Default 4096.
  1150. @end multitable
  1151. If you use @code{--skip-gemini}, @strong{MySQL} will not initialize the
  1152. Gemini table handler, saving memory; you cannot use Gemini tables if you
  1153. use @code{--skip-gemini}.
  1154. @node GEMINI features, GEMINI TODO, GEMINI start, GEMINI
  1155. @subsection Features of @code{GEMINI} tables:
  1156. @itemize @bullet
  1157. @item
  1158. If a query result can be resolved solely from the index key, Gemini will
  1159. not read the actual row stored in the database.
  1160. @item
  1161. Locking on Gemini tables is done at row level.
  1162. @item
  1163. @code{SELECT COUNT(*) FROM table_name} is fast; Gemini maintains a count
  1164. of the number of rows in the table.
  1165. @end itemize
  1166. @node GEMINI TODO,  , GEMINI features, GEMINI
  1167. @subsection Current limitations of @code{GEMINI} tables:
  1168. @itemize @bullet
  1169. @item
  1170. BLOB columns are not supported in @code{GEMINI} tables.
  1171. @item
  1172. The maximum number of concurrent users accessing @code{GEMINI} tables is
  1173. limited by @code{gemini_connection_limit}.  The default is 100 users.
  1174. @end itemize
  1175. NuSphere is working on removing these limitations.
  1176. @node INNOBASE,  , GEMINI, Table types
  1177. @section INNOBASE Tables
  1178. @menu
  1179. * INNOBASE overview::           
  1180. * INNOBASE start::              INNOBASE startup options
  1181. * Using INNOBASE tables::       Using INNOBASE tables
  1182. * INNOBASE restrictions::       Some restrictions on @code{INNOBASE} tables:
  1183. @end menu
  1184. @node INNOBASE overview, INNOBASE start, INNOBASE, INNOBASE
  1185. @subsection INNOBASE Tables overview
  1186. Innobase tables are included in the @strong{MySQL} source distribution
  1187. starting from 3.23.34 and will be activated in the @strong{MySQL}-max
  1188. binary.
  1189. If you have downloaded a binary version of @strong{MySQL} that includes
  1190. support for Innobase, simply follow the instructions for
  1191. installing a binary version of @strong{MySQL}. @xref{Installing binary}.
  1192. To compile @strong{MySQL} with Innobase support, download @strong{MySQL}
  1193. 3.23.34 or newer and configure @code{MySQL} with the
  1194. @code{--with-innobase} option. @xref{Installing source}.
  1195. @example
  1196. cd /path/to/source/of/mysql-3.23.34
  1197. ./configure --with-innobase
  1198. @end example
  1199. Innobase provides MySQL with a transaction safe table handler with
  1200. commit, rollback, and crash recovery capabilities.  Innobase does
  1201. locking on row level, and also provides an Oracle-style consistent
  1202. non-locking read in @code{SELECTS}, which increases transaction
  1203. concurrency. There is neither need for lock escalation in Innobase,
  1204. because row level locks in Innobase fit in very small space.
  1205. Innobase is a table handler that is under the GNU GPL License Version 2
  1206. (of June 1991). In the source distribution of MySQL, Innobase appears as
  1207. a subdirectory.
  1208. @node INNOBASE start, Using INNOBASE tables, INNOBASE overview, INNOBASE
  1209. @subsection INNOBASE startup options
  1210. To use Innobase tables you must specify configuration parameters
  1211. in the MySQL configuration file in the @code{[mysqld]} section of
  1212. the configuration file. Below is an example of possible configuration
  1213. parameters in my.cnf for Innobase:
  1214. @example
  1215. innobase_data_home_dir = c:ibdata
  1216. innobase_data_file_path = ibdata1:25M;ibdata2:37M;ibdata3:100M;ibdata4:300M
  1217. set-variable = innobase_mirrored_log_groups=1
  1218. innobase_log_group_home_dir = c:iblogs
  1219. set-variable = innobase_log_files_in_group=3
  1220. set-variable = innobase_log_file_size=5M
  1221. set-variable = innobase_log_buffer_size=8M
  1222. innobase_flush_log_at_trx_commit=1
  1223. innobase_log_arch_dir = c:iblogs
  1224. innobase_log_archive=0
  1225. set-variable = innobase_buffer_pool_size=16M
  1226. set-variable = innobase_additional_mem_pool_size=2M
  1227. set-variable = innobase_file_io_threads=4
  1228. set-variable = innobase_lock_wait_timeout=50
  1229. @end example
  1230. The meanings of the configuration parameters are the following:
  1231. @multitable @columnfractions .30 .70
  1232. @item @code{innobase_data_home_dir} @tab
  1233. The common part of the directory path for all innobase data files.
  1234. @item @code{innobase_data_file_path} @tab
  1235. Paths to individual data files and their sizes. The full directory path
  1236. to each data file is acquired by concatenating innobase_data_home_dir to
  1237. the paths specified here. The file sizes are specified in megabytes,
  1238. hence the 'M' after the size specification above. Do not set a file size
  1239. bigger than 4000M, and on most operating systems not bigger than 2000M.
  1240. innobase_mirrored_log_groups Number of identical copies of log groups we
  1241. keep for the database. Currently this should be set to 1.
  1242. @item @code{innobase_log_group_home_dir} @tab
  1243. Directory path to Innobase log files.
  1244. @item @code{innobase_log_files_in_group} @tab
  1245. Number of log files in the log group. Innobase writes to the files in a
  1246. circular fashion.  Value 3 is recommended here.
  1247. @item @code{innobase_log_file_size} @tab
  1248. Size of each log file in a log group in megabytes. Sensible values range
  1249. from 1M to the size of the buffer pool specified below. The bigger the
  1250. value, the less checkpoint flush activity is needed in the buffer pool,
  1251. saving disk i/o. But bigger log files also mean that recovery will be
  1252. slower in case of a crash. File size restriction as for a data file.
  1253. @item @code{innobase_log_buffer_size} @tab
  1254. The size of the buffer which Innobase uses to write log to the log files
  1255. on disk.  Sensible values range from 1M to half the combined size of log
  1256. files. A big log buffer allows large transactions to run without a need
  1257. to write the log to disk until the transaction commit. Thus, if you have
  1258. big transactions, making the log buffer big will save disk i/o.
  1259. @item @code{innobase_flush_log_at_trx_commit} @tab
  1260. Normally this is set to 1, meaning that at a transaction commit the log
  1261. is flushed to disk, and the modifications made by the transaction become
  1262. permanent, and survive a database crash. If you are willing to
  1263. compromise this safety, and you are running small transactions, you may
  1264. set this to 0 to reduce disk i/o to the logs.
  1265. @item @code{innobase_log_arch_dir} @tab
  1266. The directory where fully written log files would be archived if we used
  1267. log archiving.  The value of this parameter should currently be set the
  1268. same as @code{innobase_log_group_home_dir}.
  1269. @item  @code{innobase_log_archive} @tab
  1270. This value should currently be set to 0.  As recovery from a backup is
  1271. done by MySQL using its own log files, there is currently no need to
  1272. archive Innobase log files.
  1273. @item @code{innobase_buffer_pool_size} @tab
  1274. The size of the memory buffer Innobase uses to cache data and indexes of
  1275. its tables.  The bigger you set this the less disk i/o is needed to
  1276. access data in tables. On a dedicated database server you may set this
  1277. parameter up to 90 % of the machine physical memory size. Do not set it
  1278. too large, though, because competition of the physical memory may cause
  1279. paging in the operating system.
  1280. @item @code{innobase_additional_mem_pool_size} @tab
  1281. Size of a memory pool Innobase uses to store data dictionary information
  1282. and other internal data structures. A sensible value for this might be
  1283. 2M, but the more tables you have in your application the more you will
  1284. need to allocate here. If Innobase runs out of memory in this pool, it
  1285. will start to allocate memory from the operating system, and write
  1286. warning messages to the MySQL error log.
  1287. @item @code{innobase_file_io_threads} @tab
  1288. Number of file i/o threads in Innobase. Normally, this should be 4, but
  1289. on Windows NT disk i/o may benefit from a larger number.
  1290. @item @code{innobase_lock_wait_timeout} @tab
  1291. Timeout in seconds an Innobase transaction may wait for a lock before
  1292. being rolled back.  Innobase automatically detects transaction deadlocks
  1293. in its own lock table and rolls back the transaction. If you use
  1294. @code{LOCK TABLES} command, or other transaction safe table handlers
  1295. than Innobase in the same transaction, then a deadlock may arise which
  1296. Innobase cannot notice. In cases like this the timeout is useful to
  1297. resolve the situation.
  1298. @end multitable
  1299. @node Using INNOBASE tables, INNOBASE restrictions, INNOBASE start, INNOBASE
  1300. @subsection Using INNOBASE tables
  1301. Technically, Innobase is a database backend placed under MySQL. Innobase
  1302. has its own buffer pool for caching data and indexes in main
  1303. memory. Innobase stores its tables and indexes in a tablespace, which
  1304. may consist of several files. This is different from, for example,
  1305. @code{MyISAM} tables where each table is stored as a separate file.
  1306. To create a table in the Innobase format you must specify
  1307. @code{TYPE = INNOBASE} in the table creation SQL command:
  1308. @example
  1309. CREATE TABLE CUSTOMERS (A INT, B CHAR (20), INDEX (A)) TYPE = INNOBASE;
  1310. @end example
  1311. A consistent non-locking read is the default locking behavior when you
  1312. do a @code{SELECT} from an Innobase table. For a searched update and an
  1313. insert row level exclusive locking is performed.
  1314. You can query the amount of free space in the Innobase tablespace (=
  1315. data files you specified in my.cnf) by issuing the table status command
  1316. of @strong{MySQL} for any table you have created with @code{TYPE =
  1317. INNOBASE}.  Then the amount of free space in the tablespace appears in
  1318. the table comment section in the output of SHOW. An example:
  1319. @example
  1320. SHOW TABLE STATUS FROM TEST LIKE 'CUSTOMER'
  1321. @end example
  1322. if you have created a table of name CUSTOMER in a database you have named
  1323. TEST. Note that the statistics SHOW gives about Innobase tables
  1324. are only approximate: they are used in SQL optimization. Table and
  1325. index reserved sizes in bytes are accurate, though.
  1326. NOTE: DROP DATABASE does not currently work for Innobase tables!
  1327. You must drop the tables individually.
  1328. Note that in addition to your tables, the rollback segment uses space
  1329. from the tablespace.
  1330. Since Innobase is a multiversioned database, it must keep information
  1331. of old versions of rows in the tablespace. This information is stored
  1332. in a data structure called a rollback segment, like in Oracle. In contrast
  1333. to Oracle, you do not need to configure the rollback segment in any way in
  1334. Innobase. If you issue SELECTs, which by default do a consistent read in
  1335. Innobase, remember to commit your transaction regularly. Otherwise
  1336. the rollback segment will grow because it has to preserve the information
  1337. needed for further consistent reads in your transaction: in Innobase
  1338. all consistent reads within one transaction will see the same timepoint
  1339. snapshot of the database: the reads are also 'consistent' with
  1340. respect to each other. 
  1341. Some Innobase errors: If you run out of file space in the tablespace,
  1342. you will get the MySQL 'Table is full' error. If you want to make your
  1343. tablespace bigger, you have to shut down MySQL and add a new datafile
  1344. specification to my.conf, to the innobase_data_file_path parameter.
  1345. A transaction deadlock or a timeout in a lock wait will give 'Table handler
  1346. error 1000000'.
  1347. Contact information of Innobase Oy, producer of the Innobase engine:
  1348. Website: @uref{http://www.innobase.fi}.
  1349. @email{Heikki.Tuuri@@innobase.inet.fi}
  1350. @example
  1351. phone: 358-9-6969 3250 (office) 358-40-5617367 (mobile)
  1352. Innobase Oy Inc.
  1353. World Trade Center Helsinki
  1354. Aleksanterinkatu 17
  1355. P.O.Box 800
  1356. 00101 Helsinki
  1357. Finland
  1358. @end example
  1359. @node INNOBASE restrictions,  , Using INNOBASE tables, INNOBASE
  1360. @subsection Some restrictions on @code{INNOBASE} tables:
  1361. @itemize @bullet
  1362. @item
  1363. You can't have a key on a @code{BLOB} or @code{TEXT} column.
  1364. @item
  1365. @code{DELETE FROM TABLE} doesn't re-generate the table but instead deletes all
  1366. rows, one by one, which isn't that fast.
  1367. @item
  1368. The maximum blob size is 8000 bytes.
  1369. @item
  1370. Before dropping a database with @code{INNOBASE} tables one has to drop
  1371. the individual tables first.  If one doesn't do that, the space in the
  1372. Innobase table space will not be reclaimed.
  1373. @end itemize
  1374. @cindex tutorial
  1375. @cindex terminal monitor, defined
  1376. @cindex monitor, terminal
  1377. @cindex options, provided by MySQL
  1378. @node Tutorial, Server, Table types, Top
  1379. @chapter MySQL Tutorial
  1380. @menu
  1381. * Connecting-disconnecting::    Connecting to and disconnecting from the server
  1382. * Entering queries::            Entering queries
  1383. * Examples::                    Examples
  1384. * Searching on two keys::       Searching on two keys
  1385. * Database use::                Creating and using a database
  1386. * Getting information::         Getting information about databases and tables
  1387. * Batch mode::                  Using @code{mysql} in batch mode
  1388. * Twin::                        Queries from twin project
  1389. @end menu
  1390. This chapter provides a tutorial introduction to @strong{MySQL} by showing
  1391. how to use the @code{mysql} client program to create and use a simple
  1392. database.  @code{mysql} (sometimes referred to as the ``terminal monitor'' or
  1393. just ``monitor'') is an interactive program that allows you to connect to a
  1394. @strong{MySQL} server, run queries, and view the results.  @code{mysql} may
  1395. also be used in batch mode: you place your queries in a file beforehand, then
  1396. tell @code{mysql} to execute the contents of the file.  Both ways of using
  1397. @code{mysql} are covered here.
  1398. To see a list of options provided by @code{mysql}, invoke it with
  1399. the @code{--help} option:
  1400. @example
  1401. shell> mysql --help
  1402. @end example
  1403. This chapter assumes that @code{mysql} is installed on your machine and that
  1404. a @strong{MySQL} server is available to which you can connect.  If this is
  1405. not true, contact your @strong{MySQL} administrator.  (If @emph{you} are the
  1406. administrator, you will need to consult other sections of this manual.)
  1407. This chapter describes the entire process of setting up and using a
  1408. database.  If you are interested only in accessing an already-existing
  1409. database, you may want to skip over the sections that describe how to
  1410. create the database and the tables it contains.
  1411. Because this chapter is tutorial in nature, many details are necessarily left
  1412. out.  Consult the relevant sections of the manual for more
  1413. information on the topics covered here.
  1414. @cindex connecting, to the server
  1415. @cindex disconnecting, from the server
  1416. @cindex server, connecting
  1417. @cindex server, disconnecting
  1418. @node Connecting-disconnecting, Entering queries, Tutorial, Tutorial
  1419. @section Connecting to and Disconnecting from the Server
  1420. To connect to the server, you'll usually need to provide a @strong{MySQL}
  1421. user name when you invoke @code{mysql} and, most likely, a password.  If the
  1422. server runs on a machine other than the one where you log in, you'll also
  1423. need to specify a hostname.  Contact your administrator to find out what
  1424. connection parameters you should use to connect (that is, what host, user name,
  1425. and password to use).  Once you know the proper parameters, you should be
  1426. able to connect like this:
  1427. @example
  1428. shell> mysql -h host -u user -p
  1429. Enter password: ********
  1430. @end example
  1431. The @code{********} represents your password; enter it when @code{mysql}
  1432. displays the @code{Enter password:} prompt.
  1433. If that works, you should see some introductory information followed by a
  1434. @code{mysql>} prompt:
  1435. @example
  1436. shell> mysql -h host -u user -p
  1437. Enter password: ********
  1438. Welcome to the MySQL monitor.  Commands end with ; or g.
  1439. Your MySQL connection id is 459 to server version: 3.22.20a-log
  1440. Type 'help' for help.
  1441. mysql>
  1442. @end example
  1443. The prompt tells you that @code{mysql} is ready for you to enter commands.
  1444. Some @strong{MySQL} installations allow users to connect as the anonymous
  1445. (unnamed) user to the server running on the local host.  If this is the case
  1446. on your machine, you should be able to connect to that server by invoking
  1447. @code{mysql} without any options:
  1448. @example
  1449. shell> mysql
  1450. @end example
  1451. After you have connected successfully, you can disconnect any time by typing
  1452. @code{QUIT} at the @code{mysql>} prompt:
  1453. @example
  1454. mysql> QUIT
  1455. Bye
  1456. @end example
  1457. You can also disconnect by pressing Control-D.
  1458. Most examples in the following sections assume you are connected to the
  1459. server.  They indicate this by the @code{mysql>} prompt.
  1460. @cindex running, queries
  1461. @cindex queries, entering
  1462. @cindex entering, queries
  1463. @node Entering queries, Examples, Connecting-disconnecting, Tutorial
  1464. @section Entering Queries
  1465. Make sure you are connected to the server, as discussed in the previous
  1466. section.  Doing so will not in itself select any database to work with, but
  1467. that's okay.  At this point, it's more important to find out a little about
  1468. how to issue queries than to jump right in creating tables, loading data
  1469. into them, and retrieving data from them.  This section describes the basic
  1470. principles of entering commands, using several queries you can try out to
  1471. familiarize yourself with how @code{mysql} works.
  1472. Here's a simple command that asks the server to tell you its version number
  1473. and the current date.  Type it in as shown below following the @code{mysql>}
  1474. prompt and hit the RETURN key:
  1475. @example
  1476. mysql> SELECT VERSION(), CURRENT_DATE;
  1477. +--------------+--------------+
  1478. | version()    | CURRENT_DATE |
  1479. +--------------+--------------+
  1480. | 3.22.20a-log | 1999-03-19   |
  1481. +--------------+--------------+
  1482. 1 row in set (0.01 sec)
  1483. mysql>
  1484. @end example
  1485. This query illustrates several things about @code{mysql}:
  1486. @itemize @bullet
  1487. @item
  1488. A command normally consists of a SQL statement followed by a semicolon.
  1489. (There are some exceptions where a semicolon is not needed.  @code{QUIT},
  1490. mentioned earlier, is one of them.  We'll get to others later.)
  1491. @item
  1492. When you issue a command, @code{mysql} sends it to the server for execution
  1493. and displays the results, then prints another @code{mysql>} to indicate
  1494. that it is ready for another command.
  1495. @item
  1496. @code{mysql} displays query output as a table (rows and columns).  The first
  1497. row contains labels for the columns.  The rows following are the query
  1498. results.  Normally, column labels are the names of the columns you fetch from
  1499. database tables.  If you're retrieving the value of an expression rather than
  1500. a table column (as in the example just shown), @code{mysql} labels the column
  1501. using the expression itself.
  1502. @item
  1503. @code{mysql} shows how many rows were returned and how long the query took
  1504. to execute, which gives you a rough idea of server performance.  These values
  1505. are imprecise because they represent wall clock time (not CPU or machine
  1506. time), and because they are affected by factors such as server load and
  1507. network latency.  (For brevity, the ``rows in set'' line is not shown in
  1508. the remaining examples in this chapter.)
  1509. @end itemize
  1510. Keywords may be entered in any lettercase.  The following queries are
  1511. equivalent:
  1512. @example
  1513. mysql> SELECT VERSION(), CURRENT_DATE;
  1514. mysql> select version(), current_date;
  1515. mysql> SeLeCt vErSiOn(), current_DATE;
  1516. @end example
  1517. Here's another query.  It demonstrates that you can use @code{mysql} as a
  1518. simple calculator:
  1519. @example
  1520. mysql> SELECT SIN(PI()/4), (4+1)*5;
  1521. +-------------+---------+
  1522. | SIN(PI()/4) | (4+1)*5 |
  1523. +-------------+---------+
  1524. |    0.707107 |      25 |
  1525. +-------------+---------+
  1526. @end example
  1527. The commands shown thus far have been relatively short, single-line
  1528. statements.  You can even enter multiple statements on a single line.
  1529. Just end each one with a semicolon:
  1530. @example
  1531. mysql> SELECT VERSION(); SELECT NOW();
  1532. +--------------+
  1533. | version()    |
  1534. +--------------+
  1535. | 3.22.20a-log |
  1536. +--------------+
  1537. +---------------------+
  1538. | NOW()               |
  1539. +---------------------+
  1540. | 1999-03-19 00:15:33 |
  1541. +---------------------+
  1542. @end example
  1543. A command need not be given all on a single line, so lengthy commands that
  1544. require several lines are not a problem.  @code{mysql} determines where your
  1545. statement ends by looking for the terminating semicolon, not by looking for
  1546. the end of the input line.  (In other words, @code{mysql}
  1547. accepts free-format input:  it collects input lines but does not execute them
  1548. until it sees the semicolon.)
  1549. Here's a simple multiple-line statement:
  1550. @example
  1551. mysql> SELECT
  1552.     -> USER()
  1553.     -> ,
  1554.     -> CURRENT_DATE;
  1555. +--------------------+--------------+
  1556. | USER()             | CURRENT_DATE |
  1557. +--------------------+--------------+
  1558. | joesmith@@localhost | 1999-03-18   |
  1559. +--------------------+--------------+
  1560. @end example
  1561. In this example, notice how the prompt changes from @code{mysql>} to
  1562. @code{->} after you enter the first line of a multiple-line query.  This is
  1563. how @code{mysql} indicates that it hasn't seen a complete statement and is
  1564. waiting for the rest.  The prompt is your friend, because it provides
  1565. valuable feedback.  If you use that feedback, you will always be aware of
  1566. what @code{mysql} is waiting for.
  1567. If you decide you don't want to execute a command that you are in the
  1568. process of entering, cancel it by typing @code{c}:
  1569. @example
  1570. mysql> SELECT
  1571.     -> USER()
  1572.     -> c
  1573. mysql>
  1574. @end example
  1575. Here, too, notice the prompt.  It switches back to @code{mysql>} after you
  1576. type @code{c}, providing feedback to indicate that @code{mysql} is ready
  1577. for a new command.
  1578. The following table shows each of the prompts you may see and summarizes what
  1579. they mean about the state that @code{mysql} is in:
  1580. @cindex prompts, meanings
  1581. @multitable @columnfractions .10 .9
  1582. @item @strong{Prompt} @tab @strong{Meaning}
  1583. @item @code{mysql>} @tab Ready for new command.
  1584. @item @code{@ @ @ @ ->} @tab Waiting for next line of multiple-line command.
  1585. @item @code{@ @ @ @ '>} @tab Waiting for next line, collecting a string that begins
  1586. with a single quote (@samp{'}).
  1587. @item @code{@ @ @ @ ">} @tab Waiting for next line, collecting a string that begins
  1588. with a double quote (@samp{"}).
  1589. @end multitable
  1590. Multiple-line statements commonly occur by accident when you intend to
  1591. issue a command on a single line, but forget the terminating semicolon.  In
  1592. this case, @code{mysql} waits for more input:
  1593. @example
  1594. mysql> SELECT USER()
  1595.     ->
  1596. @end example
  1597. If this happens to you (you think you've entered a statement but the only
  1598. response is a @code{->} prompt), most likely @code{mysql} is waiting for the
  1599. semicolon.  If you don't notice what the prompt is telling you, you might sit
  1600. there for a while before realizing what you need to do.  Enter a semicolon to
  1601. complete the statement, and @code{mysql} will execute it:
  1602. @example
  1603. mysql> SELECT USER()
  1604.     -> ;
  1605. +--------------------+
  1606. | USER()             |
  1607. +--------------------+
  1608. | joesmith@@localhost |
  1609. +--------------------+
  1610. @end example
  1611. The @code{'>} and @code{">} prompts occur during string collection.
  1612. In @strong{MySQL}, you can write strings surrounded by either @samp{'}
  1613. or @samp{"} characters (for example, @code{'hello'} or @code{"goodbye"}),
  1614. and @code{mysql} lets you enter strings that span multiple lines.  When you
  1615. see a @code{'>} or @code{">} prompt, it means that you've entered a line
  1616. containing a string that begins with a @samp{'} or @samp{"} quote character,
  1617. but have not yet entered the matching quote that terminates the string.
  1618. That's fine if you really are entering a multiple-line string, but how likely
  1619. is that?  Not very.  More often, the @code{'>} and @code{">} prompts indicate
  1620. that you've inadvertantly left out a quote character.  For example:
  1621. @example
  1622. mysql> SELECT * FROM my_table WHERE name = "Smith AND age < 30;
  1623.     ">
  1624. @end example
  1625. If you enter this @code{SELECT} statement, then hit RETURN and wait for the
  1626. result, nothing will happen.  Instead of wondering why this
  1627. query takes so long, notice the clue provided by the @code{">} prompt.  It
  1628. tells you that @code{mysql} expects to see the rest of an unterminated
  1629. string.  (Do you see the error in the statement?  The string @code{"Smith} is
  1630. missing the second quote.)
  1631. At this point, what do you do?  The simplest thing is to cancel the command.
  1632. However, you cannot just type @code{c} in this case, because @code{mysql}
  1633. interprets it as part of the string that it is collecting!  Instead, enter
  1634. the closing quote character (so @code{mysql} knows you've finished the
  1635. string), then type @code{c}:
  1636. @example
  1637. mysql> SELECT * FROM my_table WHERE name = "Smith AND age < 30;
  1638.     "> "c
  1639. mysql>
  1640. @end example
  1641. The prompt changes back to @code{mysql>}, indicating that @code{mysql}
  1642. is ready for a new command.
  1643. It's important to know what the @code{'>} and @code{">} prompts signify,
  1644. because if you mistakenly enter an unterminated string, any further lines you
  1645. type will appear to be ignored by @code{mysql} --- including a line
  1646. containing @code{QUIT}!  This can be quite confusing, especially if you
  1647. don't know that you need to supply the terminating quote before you can
  1648. cancel the current command.
  1649. @cindex queries, examples
  1650. @cindex examples, queries
  1651. @node Examples, Searching on two keys, Entering queries, Tutorial
  1652. @section Examples of Common Queries
  1653. Here are examples of how to solve some common problems with
  1654. @strong{MySQL}.
  1655. Some of the examples use the table @code{shop} to hold the price of each
  1656. article (item number) for certain traders (dealers).  Supposing that each
  1657. trader has a single fixed price per article, then (@code{item},
  1658. @code{trader}) is a primary key for the records.
  1659. Start the command line tool @code{mysql} and select a database:
  1660. @example
  1661. mysql your-database-name
  1662. @end example
  1663. (In most @strong{MySQL} installations, you can use the database-name 'test').
  1664. You can create the example table as:
  1665. @example
  1666. CREATE TABLE shop (
  1667.  article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
  1668.  dealer  CHAR(20)                 DEFAULT ''     NOT NULL,
  1669.  price   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL,
  1670.  PRIMARY KEY(article, dealer));
  1671. INSERT INTO shop VALUES
  1672. (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69),
  1673. (3,'D',1.25),(4,'D',19.95);
  1674. @end example
  1675. Okay, so the example data is:
  1676. @example
  1677. mysql> SELECT * FROM shop;
  1678. +---------+--------+-------+
  1679. | article | dealer | price |
  1680. +---------+--------+-------+
  1681. |    0001 | A      |  3.45 |
  1682. |    0001 | B      |  3.99 |
  1683. |    0002 | A      | 10.99 |
  1684. |    0003 | B      |  1.45 |
  1685. |    0003 | C      |  1.69 |
  1686. |    0003 | D      |  1.25 |
  1687. |    0004 | D      | 19.95 |
  1688. +---------+--------+-------+
  1689. @end example
  1690. @menu
  1691. * example-Maximum-column::      The maximum value for a column
  1692. * example-Maximum-row::         The row holding the maximum of a certain column
  1693. * example-Maximum-column-group::  Maximum of column per group
  1694. * example-Maximum-column-group-row::  The rows holding the group-wise maximum of a certain field
  1695. * example-user-variables::      Using user variables
  1696. * example-Foreign keys::        Using foreign keys
  1697. @end menu
  1698. @node example-Maximum-column, example-Maximum-row, Examples, Examples
  1699. @subsection The Maximum Value for a Column
  1700. ``What's the highest item number?''
  1701. @example
  1702. SELECT MAX(article) AS article FROM shop
  1703. +---------+
  1704. | article |
  1705. +---------+
  1706. |       4 |
  1707. +---------+
  1708. @end example
  1709. @node example-Maximum-row, example-Maximum-column-group, example-Maximum-column, Examples
  1710. @subsection The Row Holding the Maximum of a Certain Column
  1711. ``Find number, dealer, and price of the most expensive article.''
  1712. In ANSI SQL this is easily done with a sub-query:
  1713. @example
  1714. SELECT article, dealer, price
  1715. FROM   shop
  1716. WHERE  price=(SELECT MAX(price) FROM shop)
  1717. @end example
  1718. In @strong{MySQL} (which does not yet have sub-selects), just do it in
  1719. two steps:
  1720. @enumerate
  1721. @item
  1722. Get the maximum price value from the table with a @code{SELECT} statement.
  1723. @item
  1724. Using this value compile the actual query:
  1725. @example
  1726. SELECT article, dealer, price
  1727. FROM   shop
  1728. WHERE  price=19.95
  1729. @end example
  1730. @end enumerate
  1731. Another solution is to sort all rows descending by price and only
  1732. get the first row using the @strong{MySQL} specific @code{LIMIT} clause:
  1733. @example
  1734. SELECT article, dealer, price
  1735. FROM   shop
  1736. ORDER BY price DESC
  1737. LIMIT 1
  1738. @end example
  1739. @strong{NOTE}:  If there are several most expensive articles (for example, each 19.95)
  1740. the @code{LIMIT} solution shows only one of them!
  1741. @node example-Maximum-column-group, example-Maximum-column-group-row, example-Maximum-row, Examples
  1742. @subsection Maximum of Column per Group
  1743. ``What's the highest price per article?''
  1744. @example
  1745. SELECT article, MAX(price) AS price
  1746. FROM   shop
  1747. GROUP BY article
  1748. +---------+-------+
  1749. | article | price |
  1750. +---------+-------+
  1751. |    0001 |  3.99 |
  1752. |    0002 | 10.99 |
  1753. |    0003 |  1.69 |
  1754. |    0004 | 19.95 |
  1755. +---------+-------+
  1756. @end example
  1757. @node example-Maximum-column-group-row, example-user-variables, example-Maximum-column-group, Examples
  1758. @subsection The Rows Holding the Group-wise Maximum of a Certain Field
  1759. ``For each article, find the dealer(s) with the most expensive price.''
  1760. In ANSI SQL, I'd do it with a sub-query like this:
  1761. @example
  1762. SELECT article, dealer, price
  1763. FROM   shop s1
  1764. WHERE  price=(SELECT MAX(s2.price)
  1765.               FROM shop s2
  1766.               WHERE s1.article = s2.article)
  1767. @end example
  1768. In @strong{MySQL} it's best do it in several steps:
  1769. @enumerate
  1770. @item
  1771. Get the list of (article,maxprice).
  1772. @item
  1773. For each article get the corresponding rows that have the stored maximum
  1774. price.
  1775. @end enumerate
  1776. This can easily be done with a temporary table:
  1777. @example
  1778. CREATE TEMPORARY TABLE tmp (
  1779.         article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
  1780.         price   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL);
  1781. LOCK TABLES shop read;
  1782. INSERT INTO tmp SELECT article, MAX(price) FROM shop GROUP BY article;
  1783. SELECT shop.article, dealer, shop.price FROM shop, tmp
  1784. WHERE shop.article=tmp.article AND shop.price=tmp.price;
  1785. UNLOCK TABLES;
  1786. DROP TABLE tmp;
  1787. @end example
  1788. If you don't use a @code{TEMPORARY} table, you must also lock the 'tmp' table.
  1789. ``Can it be done with a single query?''
  1790. Yes, but only by using a quite inefficient trick that I call the
  1791. ``MAX-CONCAT trick'':
  1792. @example
  1793. SELECT article,
  1794.        SUBSTRING( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 7) AS dealer,
  1795.   0.00+LEFT(      MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 6) AS price
  1796. FROM   shop
  1797. GROUP BY article;
  1798. +---------+--------+-------+
  1799. | article | dealer | price |
  1800. +---------+--------+-------+
  1801. |    0001 | B      |  3.99 |
  1802. |    0002 | A      | 10.99 |
  1803. |    0003 | C      |  1.69 |
  1804. |    0004 | D      | 19.95 |
  1805. +---------+--------+-------+
  1806. @end example
  1807. The last example can, of course, be made a bit more efficient by doing the
  1808. splitting of the concatenated column in the client.
  1809. @node example-user-variables, example-Foreign keys, example-Maximum-column-group-row, Examples
  1810. @subsection Using user variables
  1811. You can use @strong{MySQL} user variables to remember results without
  1812. having to store them in a temporary variables in the client.
  1813. @xref{Variables}.
  1814. For example, to find the articles with the highest and lowest price you
  1815. can do:
  1816. @example
  1817. select @@min_price:=min(price),@@max_price:=max(price) from shop;
  1818. select * from shop where price=@@min_price or price=@@max_price;
  1819. +---------+--------+-------+
  1820. | article | dealer | price |
  1821. +---------+--------+-------+
  1822. |    0003 | D      |  1.25 |
  1823. |    0004 | D      | 19.95 |
  1824. +---------+--------+-------+
  1825. @end example
  1826. @cindex foreign keys
  1827. @cindex keys, foreign
  1828. @node example-Foreign keys,  , example-user-variables, Examples
  1829. @subsection Using Foreign Keys
  1830. You don't need foreign keys to join 2 tables.
  1831. The only thing @strong{MySQL} doesn't do is @code{CHECK} to make sure that
  1832. the keys you use really exist in the table(s) you're referencing and it
  1833. doesn't automatically delete rows from table with a foreign key
  1834. definition. If you use your keys like normal, it'll work just fine:
  1835. @example
  1836. CREATE TABLE persons (
  1837.     id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
  1838.     name CHAR(60) NOT NULL,
  1839.     PRIMARY KEY (id)
  1840. );
  1841. CREATE TABLE shirts (
  1842.     id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
  1843.     style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
  1844.     color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
  1845.     owner SMALLINT UNSIGNED NOT NULL REFERENCES persons,
  1846.     PRIMARY KEY (id)
  1847. );
  1848. INSERT INTO persons VALUES (NULL, 'Antonio Paz');
  1849. INSERT INTO shirts VALUES
  1850. (NULL, 'polo', 'blue', LAST_INSERT_ID()),
  1851. (NULL, 'dress', 'white', LAST_INSERT_ID()),
  1852. (NULL, 't-shirt', 'blue', LAST_INSERT_ID());
  1853. INSERT INTO persons VALUES (NULL, 'Lilliana Angelovska');
  1854. INSERT INTO shirts VALUES
  1855. (NULL, 'dress', 'orange', LAST_INSERT_ID()),
  1856. (NULL, 'polo', 'red', LAST_INSERT_ID()),
  1857. (NULL, 'dress', 'blue', LAST_INSERT_ID()),
  1858. (NULL, 't-shirt', 'white', LAST_INSERT_ID());
  1859. SELECT * FROM persons;
  1860. +----+---------------------+
  1861. | id | name                |
  1862. +----+---------------------+
  1863. |  1 | Antonio Paz         |
  1864. |  2 | Lilliana Angelovska |
  1865. +----+---------------------+
  1866. SELECT * FROM shirts;
  1867. +----+---------+--------+-------+
  1868. | id | style   | color  | owner |
  1869. +----+---------+--------+-------+
  1870. |  1 | polo    | blue   |     1 |
  1871. |  2 | dress   | white  |     1 |
  1872. |  3 | t-shirt | blue   |     1 |
  1873. |  4 | dress   | orange |     2 |
  1874. |  5 | polo    | red    |     2 |
  1875. |  6 | dress   | blue   |     2 |
  1876. |  7 | t-shirt | white  |     2 |
  1877. +----+---------+--------+-------+
  1878. SELECT s.* FROM persons p, shirts s
  1879.  WHERE p.name LIKE 'Lilliana%'
  1880.    AND s.owner = p.id
  1881.    AND s.color <> 'white';
  1882. +----+-------+--------+-------+
  1883. | id | style | color  | owner |
  1884. +----+-------+--------+-------+
  1885. |  4 | dress | orange |     2 |
  1886. |  5 | polo  | red    |     2 |
  1887. |  6 | dress | blue   |     2 |
  1888. +----+-------+--------+-------+
  1889. @end example
  1890. @findex UNION
  1891. @cindex searching, two keys
  1892. @cindex keys, searching on two
  1893. @node Searching on two keys, Database use, Examples, Tutorial
  1894. @section Searching on Two Keys
  1895. @strong{MySQL} doesn't yet optimize when you search on two different
  1896. keys combined with @code{OR} (Searching on one key with different @code{OR}
  1897. parts is optimized quite good):
  1898. @example
  1899. SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1'
  1900. OR  field2_index = '1'
  1901. @end example
  1902. The reason is that we haven't yet had time to come up with an efficient
  1903. way to handle this in the general case. (The @code{AND} handling is,
  1904. in comparison, now completely general and works very well).
  1905. For the moment you can solve this very efficently by using a
  1906. @code{TEMPORARY} table. This type of optimization is also very good if
  1907. you are using very complicated queries where the SQL server does the
  1908. optimizations in the wrong order.
  1909. @example
  1910. CREATE TEMPORARY TABLE tmp
  1911. SELECT field1_index, field2_index FROM test_table WHERE field1_index = '1';
  1912. INSERT INTO tmp
  1913. SELECT field1_index, field2_index FROM test_table WHERE field2_index = '1';
  1914. SELECT * from tmp;
  1915. DROP TABLE tmp;
  1916. @end example
  1917. The above way to solve this query is in effect an @code{UNION} of two queries.
  1918. @cindex databases, creating
  1919. @cindex databases, using
  1920. @cindex creating, databases
  1921. @node Database use, Getting information, Searching on two keys, Tutorial
  1922. @section Creating and Using a Database
  1923. @menu
  1924. * Creating database::           Creating a database
  1925. * Creating tables::             Creating a table
  1926. * Loading tables::              Loading data into a table
  1927. * Retrieving data::             Retrieving information from a table
  1928. * Multiple tables::             Using more than one table
  1929. @end menu
  1930. Now that you know how to enter commands, it's time to access a database.
  1931. Suppose you have several pets in your home (your menagerie) and you'd
  1932. like to keep track of various types of information about them.  You can do so
  1933. by creating tables to hold your data and loading them with the desired
  1934. information.  Then you can answer different sorts of questions about your
  1935. animals by retrieving data from the tables.  This section shows you how to:
  1936. @itemize @bullet
  1937. @item
  1938. Create a database
  1939. @item
  1940. Create a table
  1941. @item
  1942. Load data into the table
  1943. @item
  1944. Retrieve data from the table in various ways
  1945. @item
  1946. Use multiple tables
  1947. @end itemize
  1948. The menagerie database will be simple (deliberately), but it is not difficult
  1949. to think of real-world situations in which a similar type of database might
  1950. be used.  For example, a database like this could be used by a farmer to keep
  1951. track of livestock, or by a veterinarian to keep track of patient records.
  1952. Use the @code{SHOW} statement to find out what databases currently exist
  1953. on the server:
  1954. @example
  1955. mysql> SHOW DATABASES;
  1956. +----------+
  1957. | Database |
  1958. +----------+
  1959. | mysql    |
  1960. | test     |
  1961. | tmp      |
  1962. +----------+
  1963. @end example
  1964. The list of databases is probably different on your machine, but the
  1965. @code{mysql} and @code{test} databases are likely to be among them.  The
  1966. @code{mysql} database is required because it describes user access
  1967. privileges.  The @code{test} database is often provided as a workspace for
  1968. users to try things out.
  1969. If the @code{test} database exists, try to access it:
  1970. @example
  1971. mysql> USE test
  1972. Database changed
  1973. @end example
  1974. Note that @code{USE}, like @code{QUIT}, does not require a semicolon.  (You
  1975. can terminate such statements with a semicolon if you like; it does no harm.)
  1976. The @code{USE} statement is special in another way, too:  it must be given on
  1977. a single line.
  1978. You can use the @code{test} database (if you have access to it) for the
  1979. examples that follow, but anything you create in that database can be
  1980. removed by anyone else with access to it.  For this reason, you should
  1981. probably ask your @strong{MySQL} administrator for permission to use a
  1982. database of your own.  Suppose you want to call yours @code{menagerie}.  The
  1983. administrator needs to execute a command like this:
  1984. @example
  1985. mysql> GRANT ALL ON menagerie.* TO your_mysql_name;
  1986. @end example
  1987. where @code{your_mysql_name} is the @strong{MySQL} user name assigned to
  1988. you.
  1989. @cindex selecting, databases
  1990. @cindex databases, selecting
  1991. @node Creating database, Creating tables, Database use, Database use
  1992. @subsection Creating and Selecting a Database
  1993. If the administrator creates your database for you when setting up your
  1994. permissions, you can begin using it.  Otherwise, you need to create it
  1995. yourself:
  1996. @example
  1997. mysql> CREATE DATABASE menagerie;
  1998. @end example
  1999. Under Unix, database names are case sensitive (unlike SQL keywords), so you
  2000. must always refer to your database as @code{menagerie}, not as
  2001. @code{Menagerie}, @code{MENAGERIE}, or some other variant.  This is also true
  2002. for table names.  (Under Windows, this restriction does not apply, although
  2003. you must refer to databases and tables using the same lettercase throughout a
  2004. given query.)
  2005. Creating a database does not select it for use; you must do that explicitly.
  2006. To make @code{menagerie} the current database, use this command:
  2007. @example
  2008. mysql> USE menagerie
  2009. Database changed
  2010. @end example
  2011. Your database needs to be created only once, but you must select it for use
  2012. each time you begin a @code{mysql} session.  You can do this by issuing a
  2013. @code{USE} statement as shown above.  Alternatively, you can select the
  2014. database on the command line when you invoke @code{mysql}.  Just specify its
  2015. name after any connection parameters that you might need to provide.  For
  2016. example:
  2017. @example
  2018. shell> mysql -h host -u user -p menagerie
  2019. Enter password: ********
  2020. @end example
  2021. Note that @code{menagerie} is not your password on the command just shown.
  2022. If you want to supply your password on the command line after the @code{-p}
  2023. option, you must do so with no intervening space (for example, as
  2024. @code{-pmypassword}, not as @code{-p mypassword}).  However, putting your
  2025. password on the command line is not recommended, because doing so exposes it
  2026. to snooping by other users logged in on your machine.
  2027. @cindex tables, creating
  2028. @cindex creating, tables
  2029. @node Creating tables, Loading tables, Creating database, Database use
  2030. @subsection Creating a Table
  2031. Creating the database is the easy part, but at this point it's empty, as
  2032. @code{SHOW TABLES} will tell you:
  2033. @example
  2034. mysql> SHOW TABLES;
  2035. Empty set (0.00 sec)
  2036. @end example
  2037. The harder part is deciding what the structure of your database should be:
  2038. what tables you will need and what columns will be in each of them.
  2039. You'll want a table that contains a record for each of your pets.  This can
  2040. be called the @code{pet} table, and it should contain, as a bare minimum,
  2041. each animal's name.  Because the name by itself is not very interesting, the
  2042. table should contain other information.  For example, if more than one person
  2043. in your family keeps pets, you might want to list each animal's owner.  You
  2044. might also want to record some basic descriptive information such as species
  2045. and sex.
  2046. How about age?  That might be of interest, but it's not a good thing to store
  2047. in a database.  Age changes as time passes, which means you'd have to update
  2048. your records often.  Instead, it's better to store a fixed value such as
  2049. date of birth.  Then, whenever you need age, you can calculate it as the
  2050. difference between the current date and the birth date.  @strong{MySQL}
  2051. provides functions for doing date arithmetic, so this is not difficult.
  2052. Storing birth date rather than age has other advantages, too:
  2053. @itemize @bullet
  2054. @item
  2055. You can use the database for tasks such as generating reminders for upcoming
  2056. pet birthdays.  (If you think this type of query is somewhat silly, note that
  2057. it is the same question you might ask in the context of a business database
  2058. to identify clients to whom you'll soon need to send out birthday greetings,
  2059. for that computer-assisted personal touch.)
  2060. @item
  2061. You can calculate age in relation to dates other than the current date.  For
  2062. example, if you store death date in the database, you can easily calculate
  2063. how old a pet was when it died.
  2064. @end itemize
  2065. You can probably think of other types of information that would be useful in
  2066. the @code{pet} table, but the ones identified so far are sufficient for now:
  2067. name, owner, species, sex, birth, and death.
  2068. Use a @code{CREATE TABLE} statement to specify the layout of your table:
  2069. @example
  2070. mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
  2071.     -> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
  2072. @end example
  2073. @code{VARCHAR} is a good choice for the @code{name}, @code{owner}, and
  2074. @code{species} columns because the column values will vary in length.  The
  2075. lengths of those columns need not all be the same, and need not be
  2076. @code{20}.  You can pick any length from @code{1} to @code{255}, whatever
  2077. seems most reasonable to you.  (If you make a poor choice and it turns
  2078. out later that you need a longer field, @strong{MySQL} provides an
  2079. @code{ALTER TABLE} statement.)
  2080. Animal sex can be represented in a variety of ways, for example, @code{"m"}
  2081. and @code{"f"}, or perhaps @code{"male"} and @code{"female"}.  It's simplest
  2082. to use the single characters @code{"m"} and @code{"f"}.
  2083. The use of the @code{DATE} data type for the @code{birth} and @code{death}
  2084. columns is a fairly obvious choice.
  2085. Now that you have created a table, @code{SHOW TABLES} should produce some
  2086. output:
  2087. @example
  2088. mysql> SHOW TABLES;
  2089. +---------------------+
  2090. | Tables in menagerie |
  2091. +---------------------+
  2092. | pet                 |
  2093. +---------------------+
  2094. @end example
  2095. To verify that your table was created the way you expected, use
  2096. a @code{DESCRIBE} statement:
  2097. @example
  2098. mysql> DESCRIBE pet;
  2099. +---------+-------------+------+-----+---------+-------+
  2100. | Field   | Type        | Null | Key | Default | Extra |
  2101. +---------+-------------+------+-----+---------+-------+
  2102. | name    | varchar(20) | YES  |     | NULL    |       |
  2103. | owner   | varchar(20) | YES  |     | NULL    |       |
  2104. | species | varchar(20) | YES  |     | NULL    |       |
  2105. | sex     | char(1)     | YES  |     | NULL    |       |
  2106. | birth   | date        | YES  |     | NULL    |       |
  2107. | death   | date        | YES  |     | NULL    |       |
  2108. +---------+-------------+------+-----+---------+-------+
  2109. @end example
  2110. You can use @code{DESCRIBE} any time, for example, if you forget the names of
  2111. the columns in your table or what types they are.
  2112. @cindex loading, tables
  2113. @cindex tables, loading data
  2114. @cindex data, loading into tables
  2115. @node Loading tables, Retrieving data, Creating tables, Database use
  2116. @subsection Loading Data into a Table
  2117. After creating your table, you need to populate it.  The @code{LOAD DATA} and
  2118. @code{INSERT} statements are useful for this.
  2119. Suppose your pet records can be described as shown below.
  2120. (Observe that @strong{MySQL} expects dates in @code{YYYY-MM-DD} format;
  2121. this may be different than what you are used to.)
  2122. @multitable @columnfractions .16 .16 .16 .16 .16 .16
  2123. @item @strong{name} @tab @strong{owner} @tab @strong{species} @tab @strong{sex} @tab @strong{birth} @tab @strong{death}
  2124. @item Fluffy @tab Harold @tab cat @tab f @tab 1993-02-04 @tab
  2125. @item Claws @tab Gwen @tab cat @tab m @tab 1994-03-17 @tab
  2126. @item Buffy @tab Harold @tab dog @tab f @tab 1989-05-13 @tab
  2127. @item Fang @tab Benny @tab dog @tab m @tab 1990-08-27 @tab
  2128. @item Bowser @tab Diane @tab dog @tab m @tab 1998-08-31 @tab 1995-07-29
  2129. @item Chirpy @tab Gwen @tab bird @tab f @tab 1998-09-11 @tab
  2130. @item Whistler @tab Gwen @tab bird @tab @tab 1997-12-09 @tab
  2131. @item Slim @tab Benny @tab snake @tab m @tab 1996-04-29 @tab
  2132. @end multitable
  2133. Because you are beginning with an empty table, an easy way to populate it is to
  2134. create a text file containing a row for each of your animals, then load the
  2135. contents of the file into the table with a single statement.
  2136. You could create a text file @file{pet.txt} containing one record per line,
  2137. with values separated by tabs, and given in the order in which the columns
  2138. were listed in the @code{CREATE TABLE} statement.  For missing values (such
  2139. as unknown sexes or death dates for animals that are still living), you can
  2140. use @code{NULL} values.  To represent these in your text file, use
  2141. @code{N}.  For example, the record for Whistler the bird would look like
  2142. this (where the whitespace between values is a single tab character):
  2143. @multitable @columnfractions .15 .15 .15 .15 .25 .15
  2144. @item @code{Whistler} @tab @code{Gwen} @tab @code{bird} @tab @code{N} @tab @code{1997-12-09} @tab @code{N}
  2145. @end multitable
  2146. To load the text file @file{pet.txt} into the @code{pet} table, use this
  2147. command:
  2148. @example
  2149. mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;
  2150. @end example
  2151. You can specify the column value separator and end of line marker explicitly
  2152. in the @code{LOAD DATA} statement if you wish, but the defaults are tab and
  2153. linefeed.  These are sufficient for the statement to read the file
  2154. @file{pet.txt} properly.
  2155. When you want to add new records one at a time, the @code{INSERT} statement
  2156. is useful.  In its simplest form, you supply values for each column, in the
  2157. order in which the columns were listed in the @code{CREATE TABLE} statement.
  2158. Suppose Diane gets a new hamster named Puffball.  You could add a new record
  2159. using an @code{INSERT} statement like this:
  2160. @example
  2161. mysql> INSERT INTO pet
  2162.     -> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
  2163. @end example
  2164. Note that string and date values are specified as quoted strings here.  Also,
  2165. with @code{INSERT}, you can insert @code{NULL} directly to represent a
  2166. missing value.  You do not use @code{N} like you do with @code{LOAD DATA}.
  2167. From this example, you should be able to see that there would be a lot more
  2168. typing involved to load
  2169. your records initially using several @code{INSERT} statements rather
  2170. than a single @code{LOAD DATA} statement.
  2171. @cindex data, retrieving
  2172. @cindex tables, retrieving data
  2173. @cindex retrieving, data from tables
  2174. @cindex unloading, tables
  2175. @node Retrieving data, Multiple tables, Loading tables, Database use
  2176. @subsection Retrieving Information from a Table
  2177. @menu
  2178. * Selecting all::               Selecting all data
  2179. * Selecting rows::              Selecting particular rows
  2180. * Selecting columns::           Selecting particular columns
  2181. * Sorting rows::                Sorting rows
  2182. * Date calculations::           Date calculations
  2183. * Working with NULL::           Working with @code{NULL} values
  2184. * Pattern matching::            Pattern matching
  2185. * Counting rows::               Counting rows
  2186. @end menu
  2187. The @code{SELECT} statement is used to pull information from a table.
  2188. The general form of the statement is:
  2189. @example
  2190. SELECT what_to_select
  2191. FROM which_table
  2192. WHERE conditions_to_satisfy
  2193. @end example
  2194. @code{what_to_select} indicates what you want to see.  This can be a list of
  2195. columns, or @code{*} to indicate ``all columns.'' @code{which_table}
  2196. indicates the table from which you want to retrieve data.  The @code{WHERE}
  2197. clause is optional.  If it's present, @code{conditions_to_satisfy} specifies
  2198. conditions that rows must satisfy to qualify for retrieval.
  2199. @node Selecting all, Selecting rows, Retrieving data, Retrieving data
  2200. @subsubsection Selecting All Data
  2201. The simplest form of @code{SELECT} retrieves everything from a table:
  2202. @example
  2203. mysql> SELECT * FROM pet;
  2204. +----------+--------+---------+------+------------+------------+
  2205. | name     | owner  | species | sex  | birth      | death      |
  2206. +----------+--------+---------+------+------------+------------+
  2207. | Fluffy   | Harold | cat     | f    | 1993-02-04 | NULL       |
  2208. | Claws    | Gwen   | cat     | m    | 1994-03-17 | NULL       |
  2209. | Buffy    | Harold | dog     | f    | 1989-05-13 | NULL       |
  2210. | Fang     | Benny  | dog     | m    | 1990-08-27 | NULL       |
  2211. | Bowser   | Diane  | dog     | m    | 1998-08-31 | 1995-07-29 |
  2212. | Chirpy   | Gwen   | bird    | f    | 1998-09-11 | NULL       |
  2213. | Whistler | Gwen   | bird    | NULL | 1997-12-09 | NULL       |
  2214. | Slim     | Benny  | snake   | m    | 1996-04-29 | NULL       |
  2215. | Puffball | Diane  | hamster | f    | 1999-03-30 | NULL       |
  2216. +----------+--------+---------+------+------------+------------+
  2217. @end example
  2218. This form of @code{SELECT} is useful if you want to review your entire table,
  2219. for instance, after you've just loaded it with your initial dataset.  As it
  2220. happens, the output just shown reveals an error in your data file:  Bowser
  2221. appears to have been born after he died!  Consulting your original pedigree
  2222. papers, you find that the correct birth year is 1989, not 1998.
  2223. There are are least a couple of ways to fix this:
  2224. @itemize @bullet
  2225. @item
  2226. Edit the file @file{pet.txt} to correct the error, then empty the table
  2227. and reload it using @code{DELETE} and @code{LOAD DATA}:
  2228. @example
  2229. mysql> SET AUTOCOMMIT=1;  # Used for quick re-create of the table
  2230. mysql> DELETE FROM pet;
  2231. mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;
  2232. @end example
  2233. However, if you do this, you must also re-enter the record for Puffball.
  2234. @item
  2235. Fix only the erroneous record with an @code{UPDATE} statement:
  2236. @example
  2237. mysql> UPDATE pet SET birth = "1989-08-31" WHERE name = "Bowser";
  2238. @end example
  2239. @end itemize
  2240. As shown above, it is easy to retrieve an entire table.  But typically you
  2241. don't want to do that, particularly when the table becomes large.  Instead,
  2242. you're usually more interested in answering a particular question, in which
  2243. case you specify some constraints on the information you want.  Let's look at
  2244. some selection queries in terms of questions about your pets that they
  2245. answer.
  2246. @cindex rows, selecting
  2247. @cindex tables, selecting rows
  2248. @node Selecting rows, Selecting columns, Selecting all, Retrieving data
  2249. @subsubsection Selecting Particular Rows
  2250. You can select only particular rows from your table.  For example, if you want
  2251. to verify the change that you made to Bowser's birth date, select Bowser's
  2252. record like this:
  2253. @example
  2254. mysql> SELECT * FROM pet WHERE name = "Bowser";
  2255. +--------+-------+---------+------+------------+------------+
  2256. | name   | owner | species | sex  | birth      | death      |
  2257. +--------+-------+---------+------+------------+------------+
  2258. | Bowser | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
  2259. +--------+-------+---------+------+------------+------------+
  2260. @end example
  2261. The output confirms that the year is correctly recorded now as 1989, not 1998.
  2262. String comparisons are normally case insensitive, so you can specify the
  2263. name as @code{"bowser"}, @code{"BOWSER"}, etc.  The query result will be
  2264. the same.
  2265. You can specify conditions on any column, not just @code{name}.  For example,
  2266. if you want to know which animals were born after 1998, test the @code{birth}
  2267. column:
  2268. @example
  2269. mysql> SELECT * FROM pet WHERE birth >= "1998-1-1";
  2270. +----------+-------+---------+------+------------+-------+
  2271. | name     | owner | species | sex  | birth      | death |
  2272. +----------+-------+---------+------+------------+-------+
  2273. | Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  |
  2274. | Puffball | Diane | hamster | f    | 1999-03-30 | NULL  |
  2275. +----------+-------+---------+------+------------+-------+
  2276. @end example
  2277. You can combine conditions, for example, to locate female dogs:
  2278. @example
  2279. mysql> SELECT * FROM pet WHERE species = "dog" AND sex = "f";
  2280. +-------+--------+---------+------+------------+-------+
  2281. | name  | owner  | species | sex  | birth      | death |
  2282. +-------+--------+---------+------+------------+-------+
  2283. | Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
  2284. +-------+--------+---------+------+------------+-------+
  2285. @end example
  2286. The preceding query uses the @code{AND} logical operator.  There is also an
  2287. @code{OR} operator:
  2288. @example
  2289. mysql> SELECT * FROM pet WHERE species = "snake" OR species = "bird";
  2290. +----------+-------+---------+------+------------+-------+
  2291. | name     | owner | species | sex  | birth      | death |
  2292. +----------+-------+---------+------+------------+-------+
  2293. | Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  |
  2294. | Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL  |
  2295. | Slim     | Benny | snake   | m    | 1996-04-29 | NULL  |
  2296. +----------+-------+---------+------+------------+-------+
  2297. @end example
  2298. @code{AND} and @code{OR} may be intermixed.  If you do that, it's a good idea
  2299. to use parentheses to indicate how conditions should be grouped:
  2300. @example
  2301. mysql> SELECT * FROM pet WHERE (species = "cat" AND sex = "m")
  2302.     -> OR (species = "dog" AND sex = "f");
  2303. +-------+--------+---------+------+------------+-------+
  2304. | name  | owner  | species | sex  | birth      | death |
  2305. +-------+--------+---------+------+------------+-------+
  2306. | Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
  2307. | Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
  2308. +-------+--------+---------+------+------------+-------+
  2309. @end example
  2310. @cindex columns, selecting
  2311. @cindex tables, selecting columns
  2312. @node Selecting columns, Sorting rows, Selecting rows, Retrieving data
  2313. @subsubsection Selecting Particular Columns
  2314. If you don't want to see entire rows from your table, just name the columns
  2315. in which you're interested, separated by commas.  For example, if you want to
  2316. know when your animals were born, select the @code{name} and @code{birth}
  2317. columns:
  2318. @example
  2319. mysql> SELECT name, birth FROM pet;
  2320. +----------+------------+
  2321. | name     | birth      |
  2322. +----------+------------+
  2323. | Fluffy   | 1993-02-04 |
  2324. | Claws    | 1994-03-17 |
  2325. | Buffy    | 1989-05-13 |
  2326. | Fang     | 1990-08-27 |
  2327. | Bowser   | 1989-08-31 |
  2328. | Chirpy   | 1998-09-11 |
  2329. | Whistler | 1997-12-09 |
  2330. | Slim     | 1996-04-29 |
  2331. | Puffball | 1999-03-30 |
  2332. +----------+------------+
  2333. @end example
  2334. To find out who owns pets, use this query:
  2335. @example
  2336. mysql> SELECT owner FROM pet;
  2337. +--------+
  2338. | owner  |
  2339. +--------+
  2340. | Harold |
  2341. | Gwen   |
  2342. | Harold |
  2343. | Benny  |
  2344. | Diane  |
  2345. | Gwen   |
  2346. | Gwen   |
  2347. | Benny  |
  2348. | Diane  |
  2349. +--------+
  2350. @end example
  2351. @findex DISTINCT
  2352. However, notice that the query simply retrieves the @code{owner} field from
  2353. each record, and some of them appear more than once.  To minimize the output,
  2354. retrieve each unique output record just once by adding the keyword
  2355. @code{DISTINCT}:
  2356. @example
  2357. mysql> SELECT DISTINCT owner FROM pet;
  2358. +--------+
  2359. | owner  |
  2360. +--------+
  2361. | Benny  |
  2362. | Diane  |
  2363. | Gwen   |
  2364. | Harold |
  2365. +--------+
  2366. @end example
  2367. You can use a @code{WHERE} clause to combine row selection with column
  2368. selection.  For example, to get birth dates for dogs and cats only,
  2369. use this query:
  2370. @example
  2371. mysql> SELECT name, species, birth FROM pet
  2372.     -> WHERE species = "dog" OR species = "cat";
  2373. +--------+---------+------------+
  2374. | name   | species | birth      |
  2375. +--------+---------+------------+
  2376. | Fluffy | cat     | 1993-02-04 |
  2377. | Claws  | cat     | 1994-03-17 |
  2378. | Buffy  | dog     | 1989-05-13 |
  2379. | Fang   | dog     | 1990-08-27 |
  2380. | Bowser | dog     | 1989-08-31 |
  2381. +--------+---------+------------+
  2382. @end example
  2383. @cindex rows, sorting
  2384. @cindex sorting, table rows
  2385. @cindex sorting, data
  2386. @cindex tables, sorting rows
  2387. @node Sorting rows, Date calculations, Selecting columns, Retrieving data
  2388. @subsubsection Sorting Rows
  2389. You may have noticed in the preceding examples that the result rows are
  2390. displayed in no particular order.  However, it's often easier to examine
  2391. query output when the rows are sorted in some meaningful way.  To sort a
  2392. result, use an @code{ORDER BY} clause.
  2393. Here are animal birthdays, sorted by date:
  2394. @example
  2395. mysql> SELECT name, birth FROM pet ORDER BY birth;
  2396. +----------+------------+
  2397. | name     | birth      |
  2398. +----------+------------+
  2399. | Buffy    | 1989-05-13 |
  2400. | Bowser   | 1989-08-31 |
  2401. | Fang     | 1990-08-27 |
  2402. | Fluffy   | 1993-02-04 |
  2403. | Claws    | 1994-03-17 |
  2404. | Slim     | 1996-04-29 |
  2405. | Whistler | 1997-12-09 |
  2406. | Chirpy   | 1998-09-11 |
  2407. | Puffball | 1999-03-30 |
  2408. +----------+------------+
  2409. @end example
  2410. To sort in reverse order, add the @code{DESC} (descending) keyword to the
  2411. name of the column you are sorting by:
  2412. @example
  2413. mysql> SELECT name, birth FROM pet ORDER BY birth DESC;
  2414. +----------+------------+
  2415. | name     | birth      |
  2416. +----------+------------+
  2417. | Puffball | 1999-03-30 |
  2418. | Chirpy   | 1998-09-11 |
  2419. | Whistler | 1997-12-09 |
  2420. | Slim     | 1996-04-29 |
  2421. | Claws    | 1994-03-17 |
  2422. | Fluffy   | 1993-02-04 |
  2423. | Fang     | 1990-08-27 |
  2424. | Bowser   | 1989-08-31 |
  2425. | Buffy    | 1989-05-13 |
  2426. +----------+------------+
  2427. @end example
  2428. You can sort on multiple columns.  For example, to sort by type of
  2429. animal, then by birth date within animal type with youngest animals first,
  2430. use the following query:
  2431. @example
  2432. mysql> SELECT name, species, birth FROM pet ORDER BY species, birth DESC;
  2433. +----------+---------+------------+
  2434. | name     | species | birth      |
  2435. +----------+---------+------------+
  2436. | Chirpy   | bird    | 1998-09-11 |
  2437. | Whistler | bird    | 1997-12-09 |
  2438. | Claws    | cat     | 1994-03-17 |
  2439. | Fluffy   | cat     | 1993-02-04 |
  2440. | Fang     | dog     | 1990-08-27 |
  2441. | Bowser   | dog     | 1989-08-31 |
  2442. | Buffy    | dog     | 1989-05-13 |
  2443. | Puffball | hamster | 1999-03-30 |
  2444. | Slim     | snake   | 1996-04-29 |
  2445. +----------+---------+------------+
  2446. @end example
  2447. Note that the @code{DESC} keyword applies only to the column name immediately
  2448. preceding it (@code{birth}); @code{species} values are still sorted in
  2449. ascending order.
  2450. @cindex date calculations
  2451. @cindex calculating, dates
  2452. @cindex extracting, dates
  2453. @cindex age, calculating
  2454. @node Date calculations, Working with NULL, Sorting rows, Retrieving data
  2455. @subsubsection Date Calculations
  2456. @strong{MySQL} provides several functions that you can use to perform
  2457. calculations on dates, for example, to calculate ages or extract
  2458. parts of dates.
  2459. To determine how many years old each of your pets is, compute age as the
  2460. difference between the birth date and the current date.  Do this by
  2461. converting the two dates to days, take the difference, and divide by 365 (the
  2462. number of days in a year):
  2463. @example
  2464. mysql> SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 FROM pet;
  2465. +----------+-------------------------------------+
  2466. | name     | (TO_DAYS(NOW())-TO_DAYS(birth))/365 |
  2467. +----------+-------------------------------------+
  2468. | Fluffy   |                                6.15 |
  2469. | Claws    |                                5.04 |
  2470. | Buffy    |                                9.88 |
  2471. | Fang     |                                8.59 |
  2472. | Bowser   |                                9.58 |
  2473. | Chirpy   |                                0.55 |
  2474. | Whistler |                                1.30 |
  2475. | Slim     |                                2.92 |
  2476. | Puffball |                                0.00 |
  2477. +----------+-------------------------------------+
  2478. @end example
  2479. Although the query works, there are some things about it that could be
  2480. improved.  First, the result could be scanned more easily if the rows were
  2481. presented in some order.  Second, the heading for the age column isn't very
  2482. meaningful.
  2483. The first problem can be handled by adding an @code{ORDER BY name} clause to
  2484. sort the output by name.  To deal with the column heading, provide a name for
  2485. the column so that a different label appears in the output (this is called a
  2486. column alias):
  2487. @example
  2488. mysql> SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 AS age
  2489.     -> FROM pet ORDER BY name;
  2490. +----------+------+
  2491. | name     | age  |
  2492. +----------+------+
  2493. | Bowser   | 9.58 |
  2494. | Buffy    | 9.88 |
  2495. | Chirpy   | 0.55 |
  2496. | Claws    | 5.04 |
  2497. | Fang     | 8.59 |
  2498. | Fluffy   | 6.15 |
  2499. | Puffball | 0.00 |
  2500. | Slim     | 2.92 |
  2501. | Whistler | 1.30 |
  2502. +----------+------+
  2503. @end example
  2504. To sort the output by @code{age} rather than @code{name}, just use a
  2505. different @code{ORDER BY} clause:
  2506. @example
  2507. mysql>  SELECT name, (TO_DAYS(NOW())-TO_DAYS(birth))/365 AS age
  2508.     ->  FROM pet ORDER BY age;
  2509. +----------+------+
  2510. | name     | age  |
  2511. +----------+------+
  2512. | Puffball | 0.00 |
  2513. | Chirpy   | 0.55 |
  2514. | Whistler | 1.30 |
  2515. | Slim     | 2.92 |
  2516. | Claws    | 5.04 |
  2517. | Fluffy   | 6.15 |
  2518. | Fang     | 8.59 |
  2519. | Bowser   | 9.58 |
  2520. | Buffy    | 9.88 |
  2521. +----------+------+
  2522. @end example
  2523. A similar query can be used to determine age at death for animals that have
  2524. died.  You determine which animals these are by checking whether or not the
  2525. @code{death} value is @code{NULL}.  Then, for those with non-@code{NULL}
  2526. values, compute the difference between the @code{death} and @code{birth}
  2527. values:
  2528. @example
  2529. mysql>  SELECT name, birth, death, (TO_DAYS(death)-TO_DAYS(birth))/365 AS age
  2530.     ->  FROM pet WHERE death IS NOT NULL ORDER BY age;
  2531. +--------+------------+------------+------+
  2532. | name   | birth      | death      | age  |
  2533. +--------+------------+------------+------+
  2534. | Bowser | 1989-08-31 | 1995-07-29 | 5.91 |
  2535. +--------+------------+------------+------+
  2536. @end example
  2537. The query uses @code{death IS NOT NULL} rather than @code{death != NULL}
  2538. because @code{NULL} is a special value.  This is explained later.
  2539. @xref{Working with NULL,  , Working with @code{NULL}}.
  2540. What if you want to know which animals have birthdays next month?  For this
  2541. type of calculation, year and day are irrelevant; you simply want to extract
  2542. the month part of the @code{birth} column.  @strong{MySQL} provides several
  2543. date-part extraction functions, such as @code{YEAR()}, @code{MONTH()}, and
  2544. @code{DAYOFMONTH()}.  @code{MONTH()} is the appropriate function here.  To
  2545. see how it works, run a simple query that displays the value of both
  2546. @code{birth} and @code{MONTH(birth)}:
  2547. @example
  2548. mysql> SELECT name, birth, MONTH(birth) FROM pet;
  2549. +----------+------------+--------------+
  2550. | name     | birth      | MONTH(birth) |
  2551. +----------+------------+--------------+
  2552. | Fluffy   | 1993-02-04 |            2 |
  2553. | Claws    | 1994-03-17 |            3 |
  2554. | Buffy    | 1989-05-13 |            5 |
  2555. | Fang     | 1990-08-27 |            8 |
  2556. | Bowser   | 1989-08-31 |            8 |
  2557. | Chirpy   | 1998-09-11 |            9 |
  2558. | Whistler | 1997-12-09 |           12 |
  2559. | Slim     | 1996-04-29 |            4 |
  2560. | Puffball | 1999-03-30 |            3 |
  2561. +----------+------------+--------------+
  2562. @end example
  2563. Finding animals with birthdays in the upcoming month is easy, too.  Suppose
  2564. the current month is April.  Then the month value is @code{4} and you look
  2565. for animals born in May (month 5) like this:
  2566. @example
  2567. mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5;
  2568. +-------+------------+
  2569. | name  | birth      |
  2570. +-------+------------+
  2571. | Buffy | 1989-05-13 |
  2572. +-------+------------+
  2573. @end example
  2574. There is a small complication if the current month is December, of course.
  2575. You don't just add one to the month number (@code{12}) and look for animals
  2576. born in month 13, because there is no such month.  Instead, you look for
  2577. animals born in January (month 1).
  2578. You can even write the query so that it works no matter what the current
  2579. month is.  That way you don't have to use a particular month number
  2580. in the query.  @code{DATE_ADD()} allows you to add a time interval to a
  2581. given date.  If you add a month to the value of @code{NOW()}, then extract
  2582. the month part with @code{MONTH()}, the result produces the month in which to
  2583. look for birthdays:
  2584. @example
  2585. mysql> SELECT name, birth FROM pet
  2586.     -> WHERE MONTH(birth) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH));
  2587. @end example
  2588. A different way to accomplish the same task is to add @code{1} to get the
  2589. next month after the current one (after using the modulo function (@code{MOD})
  2590. to wrap around the month value to @code{0} if it is currently
  2591. @code{12}):
  2592. @example
  2593. mysql> SELECT name, birth FROM pet
  2594.     -> WHERE MONTH(birth) = MOD(MONTH(NOW()), 12) + 1;
  2595. @end example
  2596. Note that @code{MONTH} returns a number between 1 and 12. And
  2597. @code{MOD(something,12)} returns a number between 0 and 11. So the
  2598. addition has to be after the @code{MOD()} otherwise we would go from
  2599. November (11) to January (1).
  2600. @findex NULL
  2601. @cindex NULL value
  2602. @node Working with NULL, Pattern matching, Date calculations, Retrieving data
  2603. @subsubsection Working with @code{NULL} Values
  2604. The @code{NULL} value can be surprising until you get used to it.
  2605. Conceptually, @code{NULL} means missing value or unknown value and it
  2606. is treated somewhat differently than other values.  To test for @code{NULL},
  2607. you cannot use the arithmetic comparison operators such as @code{=}, @code{<},
  2608. or @code{!=}.  To demonstrate this for yourself, try the following query:
  2609. @example
  2610. mysql> SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL;
  2611. +----------+-----------+----------+----------+
  2612. | 1 = NULL | 1 != NULL | 1 < NULL | 1 > NULL |
  2613. +----------+-----------+----------+----------+
  2614. |     NULL |      NULL |     NULL |     NULL |
  2615. +----------+-----------+----------+----------+
  2616. @end example
  2617. Clearly you get no meaningful results from these comparisons.  Use
  2618. the @code{IS NULL} and @code{IS NOT NULL} operators instead:
  2619. @example
  2620. mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
  2621. +-----------+---------------+
  2622. | 1 IS NULL | 1 IS NOT NULL |
  2623. +-----------+---------------+
  2624. |         0 |             1 |
  2625. +-----------+---------------+
  2626. @end example
  2627. In @strong{MySQL}, 0 or @code{NULL} means false and anything else means true.
  2628. The default trueth value from a boolean operation is 1.
  2629. This special treatment of @code{NULL} is why, in the previous section, it
  2630. was necessary to determine which animals are no longer alive using
  2631. @code{death IS NOT NULL} instead of @code{death != NULL}.
  2632. @cindex pattern matching
  2633. @cindex matching, patterns
  2634. @cindex expressions, extended
  2635. @node Pattern matching, Counting rows, Working with NULL, Retrieving data
  2636. @subsubsection Pattern Matching
  2637. @strong{MySQL} provides standard SQL pattern matching as well as a form of
  2638. pattern matching based on extended regular expressions similar to those used
  2639. by Unix utilities such as @code{vi}, @code{grep}, and @code{sed}.
  2640. SQL pattern matching allows you to use @samp{_} to match any single
  2641. character and @samp{%} to match an arbitrary number of characters (including
  2642. zero characters).  In @strong{MySQL}, SQL patterns are case insensitive by
  2643. default.  Some examples are shown below.  Note that you do not use @code{=}
  2644. or @code{!=} when you use SQL patterns; use the @code{LIKE} or @code{NOT
  2645. LIKE} comparison operators instead.
  2646. To find names beginning with @samp{b}:
  2647. @example
  2648. mysql> SELECT * FROM pet WHERE name LIKE "b%";
  2649. +--------+--------+---------+------+------------+------------+
  2650. | name   | owner  | species | sex  | birth      | death      |
  2651. +--------+--------+---------+------+------------+------------+
  2652. | Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
  2653. | Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
  2654. +--------+--------+---------+------+------------+------------+
  2655. @end example
  2656. To find names ending with @samp{fy}:
  2657. @example
  2658. mysql> SELECT * FROM pet WHERE name LIKE "%fy";
  2659. +--------+--------+---------+------+------------+-------+
  2660. | name   | owner  | species | sex  | birth      | death |
  2661. +--------+--------+---------+------+------------+-------+
  2662. | Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
  2663. | Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
  2664. +--------+--------+---------+------+------------+-------+
  2665. @end example
  2666. To find names containing a @samp{w}:
  2667. @example
  2668. mysql> SELECT * FROM pet WHERE name LIKE "%w%";
  2669. +----------+-------+---------+------+------------+------------+
  2670. | name     | owner | species | sex  | birth      | death      |
  2671. +----------+-------+---------+------+------------+------------+
  2672. | Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
  2673. | Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
  2674. | Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
  2675. +----------+-------+---------+------+------------+------------+
  2676. @end example
  2677. To find names containing exactly five characters, use the @samp{_} pattern
  2678. character:
  2679. @example
  2680. mysql> SELECT * FROM pet WHERE name LIKE "_____";
  2681. +-------+--------+---------+------+------------+-------+
  2682. | name  | owner  | species | sex  | birth      | death |
  2683. +-------+--------+---------+------+------------+-------+
  2684. | Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
  2685. | Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
  2686. +-------+--------+---------+------+------------+-------+
  2687. @end example
  2688. The other type of pattern matching provided by @strong{MySQL} uses extended
  2689. regular expressions.  When you test for a match for this type of pattern, use
  2690. the @code{REGEXP} and @code{NOT REGEXP} operators (or @code{RLIKE} and
  2691. @code{NOT RLIKE}, which are synonyms).
  2692. Some characteristics of extended regular expressions are:
  2693. @itemize @bullet
  2694. @item
  2695. @samp{.} matches any single character.