Announce

PukiWiki contents have been moved into SONOTS Plugin (20070703)

sql

SQLのメモ

Table of Contents

Oracle

データベース一覧

テーブル一覧

SELECT * FROM USER_TABLES;

テーブルのフィールド一覧

desc <テーブル名>;

トランザクション

デフォルトで、COMMIT or するまでが、1トランザクション。

MySQL

mysql --user=root db_name < create_db.sql

データベース作成

root ユーザでログイン(パスワードはインストール時に設定)

CREATE DATABASE <データベース名>

データベース削除

root ユーザでログイン(パスワードはインストール時に設定)

DROP DATABASE <データベース名>

一般ユーザ作成

root ユーザでログイン(パスワードはインストール時に設定)

CREATE USER <ユーザ名> IDENTIFIED BY '<ユーザ名>';

データベースへのアクセスを許可する

GRANT ALL ON <データベース名>.* TO <ユーザ名>;

.* はワイルドカードか?

一般ユーザ削除

root ユーザでログイン(パスワードはインストール時に設定)

まず(?)、データベースへのアクセス許可を削除する。

REVOKE ALL ON <データベース名>.* FROM <ユーザ名>;
DROP USER <ユーザ名>

起動

mysql -u <ユーザ名> -p<パスワード> -D <データベース名> --default-character-set=sjis

データベース一覧

show databases;

制約一覧

SELECT * FROM information_schema.table_constraints;

テーブル一覧

show tables;

テーブルのフィールド一覧

desc <テーブル名>

テーブル作成情報の表示

show create table <テーブル名>

制約名もみれたりする。

トランザクション

START TRANSACTION; // これで、SET AUTOCOMMIT = 0
COMMIT or ROLLBACK; // これで、前の AUTOCOMMIT 状態に戻る。通常 AUTOCOMMIT = 1

全般

alter table

制約を追加、変更

NOT NULL制約を追加する

	alter table <テーブル名> modify <フィールド名> not null

DEFAULT値「001」を追加する

	alter table <テーブル名> modify <フィールド名> default '001'

NOT NULL制約を削除する

	alter table <テーブル名> modify <フィールド名> null

制約を追加

プライマリキーを追加する

	alter table <テーブル名> add constraint <コンストレイント名> primary key(<フィールド名>)

制約を削除

       alter table <テーブル名> drop constraint <コンストレイント名>

AUTO_INCREMENT

キーでないとだめ。

create table employee {
    id integer not null auto_increment,
    name varchar(50),
    primary key(id,name)
}

AUTO_INCREMENT は何行か削除しても、リセットせずに、続きから番号付けする。 番号が抜けることはよくある。

AUTO_INCREMENT が設定されている場合は、insert 文で省略はできるが、

insert employee values ('name','hoge@hoge.com');

ではだめで、

insert employee (name,email) values ('name','hoge@hoge.com');

のように、フィールドも指定しないといけない。

AUTO_INCREMENT せずに自分で設定することも可能。

insert employee values (1,'name','hoge@hoge.com');

この場合、この id が最大値の場合、その番号が、max_id_number にセットされ、 AUTO_INCREMENT は次の番号から始まるが、 id が最大値でない場合、特に max_id_number は代わらないので、 次に始まる番号は変わらない。

DELETE して、空きができたことが気になるなら、UPDATE で1つずつ、 上にずらしてやることもできなくはない。その後

alter table employee AUTO_INCREMENT=[max_id_number]

のように、最大値を設定しなおしてやれば、続きからはじめられる。 ただ、普通はやらない。

create table

PRIMARY KEY

主キー、複合キーを作る。

create table employee {
    id integer not null auto_increment,
    name varchar(50),
    primary key(id,name)
}

複合キーの場合でも、各々に NULL をいれることは許されない。 複合キーの組み合わせで、UNIQUE 制約になる。

DATE

create table employee {
  birthday DATE NOT NULL,
}

DATE 型には、'2009-02-02' もしくは '2009/02/02' のように指定する。 この書式はロケールによる。上は日本の場合。 存在しない日付はエラーがでる。

where

NULL 値との比較は IS NULL または IS NOT NULL。 = NULL はだめ。 = '' は意味が違う。

LIKE (ワイルドカード)

where a like 'hoge%'

%: 0文字以上の任意の文字列 _: 1文字の任意の文字列

全角文字も _ 1つ。

ORDER BY

select * from table ORDER BY name DESC;

漢字の場合、音読み順かなにかになっているよう。文字コード順かなにかだろう。

JOIN

INNER JOINで結合する場合と、WHERE句で結合する場合の違い。は、なし。 実際の処理が同じらしい。

select 文内キーワードの必須順番

select
from
where
group by
having
order by