タグ

sqlに関するkathewのブックマーク (180)

  • http://asklife.info/archives/1912

    http://asklife.info/archives/1912
  • TO_CHAR(日付) - オラクル・Oracle SQL 関数リファレンス

    日付のフォーマット使用例 DATE 型のデフォルトの書式は NLS_DATE_FORMAT でフォーマットされる。TIMESTAMP 型は NLS_TIMESTAMP_FORMAT。タイムゾーン付きの場合には NLS_TIMESTAMP_TZ_FORMAT によってフォーマットされる。 TO_CHAR( DATE '2005-06-07', 'RRMMDD') ⇒ '050607' 日付と時刻のフォーマット使用例 TO_CHAR ( TIMESTAMP '2000-01-02 04:05:06', 'YYYY/MM/DD HH24:MI:SS DAY') ⇒ 2000/01/02 04:05:06 日曜日 日付に関する豆知識 曜日を求める TO_CHAR 関数で曜日を取得することも可能(和名、または、英名) 曜日を取得するには 書式指定に 'DAY' を指定する。 日の曜日はすべて同じ長

  • トランザクションの定義および制御

    7 トランザクションの定義および制御 この章では、トランザクション処理の実行方法について説明します。Oracleデータへの変更を確定するかまたは取り消すかの制御方法など、データベースの一貫性を保護する基的な方法を学習します。内容は次のとおりです。 基用語 トランザクションによるデータベースの保護 トランザクションの開始および終了方法 FOR句の使用方法 ROLLBACK文の使用方法 SAVEPOINT文の使用方法 RELEASEオプションの使用方法 SET TRANSACTION文の使用方法 デフォルト・ロックのオーバーライド 複数のコミットにわたるフェッチ 分散トランザクションの処理 ガイドライン 基用語 トランザクションの題に入る前に、この項で定義されている用語を理解する必要があります。 Oracleが管理するジョブまたはタスクは、セッションと呼ばれます。アプリケーション・プロ

  • SUBSTR、SUBSTRB - オラクル・Oracle SQL 関数リファレンス

    SUBSTR、SUBSTRB 関数の内容 SUBSTR は取り出す文字列をキャラクタ単位、 SUBSTRB はバイト単位で部分文字列の取り出しを行なう。 文字列 string の 開始位置 position から legnth 文字、または、バイト分 の部分文字列 (SUBSTRING) を戻す。 開始位置 position は 1 オリジンで始まるが 0 でも有効で 1 を指定したことになる。また、開始位置 position にマイナス値を指定すると文末から position 逆行した位置から文字列を取り出す。 文字列長 length を省略すると文字の最後までが対象となり、0 以下の数値も指定できるが結果は常に NULL を戻す。 BASIC にあるような左から length 文字 (left) 、右から length 文字 (right) のような個別の関数は用意されていない。 SU

  • CHAR と VARCHAR2 の違い - オラクル・Oracleをマスターするための基本と仕組み

    この比較は RTRIM('abc') 比較条件 RTRIM('abc______') のようにも見えるが実際は反対?でちょっと違う。 名前の通りスペースを PADDING した(満たした※) 後に比較する。短い方の文字列が長い方の文字列と同じ長さになるまでスペースが充填される。TRIM より PADDING をエミュレーションする方がメモリ使用量が少なくて速いのかも。 つまり「空白埋め」とは TRIM (FM 書式修飾子の FILL) ではなく PADDING であるということ。 vLength := GREATEST(length('abc'), length('abc______')); RPAD('abc', vLength ) 比較条件 RPAD('abc______', vLength) というイメージ 参考: RTRIM 関数、RPAD 関数、NLS_COMP 初期化パラメータ

  • 【MySQL】大文字小文字、全角半角区別しないでマッチする検索をしたい at softelメモ

    問題 select * from member where namae like '%サトウ%'; こんなSQLで、namaeがサトウ、サトウ、さとう、サトウ(一部半角)何でもマッチさせたい! 答え では、これで。 select * from member where namae collate utf8_unicode_ci like '%サトウ%'; データベースがutf8でないときは、もうひとつ変換を入れて、 /* ERROR 1253: COLLATION 'utf8_unicode_ci' is not valid for CHARACTER SET 'ujis' など言われたら */ select * from member where convert(namae using utf8) collate utf8_unicode_ci like '%サトウ%'; 数字の全角/半

    【MySQL】大文字小文字、全角半角区別しないでマッチする検索をしたい at softelメモ
    kathew
    kathew 2016/12/19
    MySQL賢いなー(・ω・`
  • MySQLのViewのDefinerを変更する - Qiita

    $ mysqldump -uhogeuser -p some_db > /tmp/some_db.dmp Warning: Using a password on the command line interface can be insecure. mysqldump: Got error: 1449: The user specified as a definer ('fugauser'@'%') does not exist when using LOCK TABLES DBを移行したときに、some_dbに含まれるviewを作成したときのユーザを削除したか、Import時に別のユーザで実行してしまったのが原因。 viewの定義をみると CREATE ALGORITHM=UNDEFINED DEFINER=`fugauser`@`%` SQL SECURITY DEFINER VIE

    MySQLのViewのDefinerを変更する - Qiita
  • 引用符と引用識別子 - オラクル・Oracleをマスターするための基本と仕組み

    引用符 単一引用符(シングルクォート)と二重引用符(ダブルクォート) 多くの開発言語では単一引用符(') と二重引用符(") は以下の例のように相互に置き換え可能である。 vData = "文字列" vData = '文字列' しかし Oracle において二重引用符(") は リテラル をクォートするための文字ではなく、引用識別子をあらわす引用符である。 以下の代入文はエラーとなる。 vData := "無効な識別子となる文字列"; vData := ""; ORA-01741: 長さゼロの識別子は無効です。になるのが望ましいと思うが再帰SQLエラーになる。 関連事項 ⇒ リテラル内での単一引用符の表現方法:代替引用符 引用識別子と非引用識別子 二重引用符(") は引用識別子をあらわすために使用する。 通常の利用では、ほとんどが二重引用符(") でクォートされない(囲まれていない)非引用

    kathew
    kathew 2016/11/09
    や、ややこしい‥‥。例を見て具体的な意味はわかった
  • 本来空行を返すSQLで1行返す - ぐるぐる~

    例えば、ユーザIDからユーザの今の状態を引っ張ってきたいときに、 SELECT state FROM Users WHERE id = @uid; とかってやると、見つからなかった場合に空行が返ってくる。 これがいやな場合はこうする*1。 SELECT state FROM Users WHERE id = @uid UNION ALL -- 見つからなかった場合、stateとして-1を返す SELECT -1 WHERE NOT EXISTS(SELECT * FROM Users WHERE id = @uid); これで、元のSQLで見つかった場合は空行がUNION ALLされ、見つからなかった場合は空行に-1がUNION ALLされるから、絶対に空行を返さない。 元のSQLでidがPKなら、常に1行返ってくることが保証されるから、ホスト言語側で場合分けをする必要がなくなる。 *1:

    本来空行を返すSQLで1行返す - ぐるぐる~
    kathew
    kathew 2016/09/08
    MySQLでできた。これは素敵。UNION ALL 以下のSELECT文でFROMが省略できなかったので、適当なテーブルを指定してLIMIT 1をして解決。
  • 第9回 SELECT 文の FROM 句の省略|オススメ!OSS-DB情報|OSS-DB道場|受験対策|DBスペシャリストを認定する資格 OSS-DB技術者認定試験

  • [SQL] 12. カーソル 2

    12.2. カーソル 前節でも述べましたが、SQL はデータベースから複数行のデータを取り出し、一括して処理することに向いています。しかし、他のプログラムや SQL 非標準のストアドプロシージャにおけるループでは、一行ごとにデータを処理したい場合があります。このような場合にカーソルを利用します。カーソルとは、クエリの結果集合を一時的に蓄えておくための仮想的な作業領域のことです。この中の現在位置を示すポインタと呼ばれるものが、ループ処理が実行されるたびに一行ずつ進んでいき、次の処理対象を示します。カーソルは非手続き型の SQL で、C や JAVA などの手続き型言語と同様の処理形態を可能とする手法と言えます。 カーソルを利用することにより、よりきめ細かな処理が可能になります。 カーソルを使用するときの手順は次のようになっています。 カーソルの宣言 カーソルを開く 一行ごとにデータを取り出す

    kathew
    kathew 2016/08/09
  • カーソル

  • FETCH (Transact-SQL) - SQL Server

    適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance Transact-SQL サーバー カーソルから特定の行を取得します。 Transact-SQL 構文表記規則 構文 FETCH [ [ NEXT | PRIOR | FIRST | LAST | ABSOLUTE { n | @nvar } | RELATIVE { n | @nvar } ] FROM ] { { [ GLOBAL ] cursor_name } | @cursor_variable_name } [ INTO @variable_name [ ,...n ] ] 引数 NEXT 現在の行の直後にある行を結果行として返し、この返した行に現在の行を加えます。 カーソルに対する最初のフェッチが FETCH NEXT の場合、結果セットの先頭の行が返ります。

    FETCH (Transact-SQL) - SQL Server
  • ストアドプロシージャの花形“カーソル”を使おう

    主な内容 --Page 1-- ▼カーソルの概念 ▼カーソルの使い方 -カーソルの宣言 -カーソルを開く -1行ごとにデータを取り出す --Page 2-- -ループ処理によるFETCH文の実行 -カーソルを閉じる --Page 3-- ▼カーソルを利用したストアドプロシージャの作成 ▼まとめ 前々回「Transact-SQLでストアドプロシージャを作成する」、前回「IF文による条件分岐でSQLを動的に変化させる」と続けてストアドプロシージャを取り上げてきました。今回も同じくストアドプロシージャを取り上げます。題材とするのは「カーソル」です。 カーソルの概念 SQLは複数行のデータを一括して処理することに適しています。1000行のデータを一括して取得したり、一括して更新を行うなど大量のデータに対する一括した処理を行えます。しかしながら、一括したデータ処理ではなく、1行ずつデータを読み取り、

    ストアドプロシージャの花形“カーソル”を使おう
  • MySQL のNULL ではまったことあれこれ - LukeSilvia’s diary

    MySQL に限らず、SQL のNULL の仕様には何回か「えっ」と驚くことがあったのでメモしておこうと思います。5.1 版の日語マニュアルがなかったものについては、4.1 のマニュアルを参照しました。 そもそもNULL は何を意味するか NULL は未定義または、不明を意味する。「電話番号を持たない」ということを表現する場合は、NULL ではなく、空の文字列を使う。 NULL 値というものを SQL 初心者はよく混乱します。SQL 初心者は、多くの場合、NULL が空文字 "" と同じであると考えてしまいます。これは違います。たとえば、以下のステートメントは完全に別のものです。 mysql> INSERT INTO my_table (phone) VALUES (NULL); mysql> INSERT INTO my_table (phone) VALUES (""); どちらのス

    MySQL のNULL ではまったことあれこれ - LukeSilvia’s diary
    kathew
    kathew 2016/05/31
    日常的に使用していたけど、予想以上にややこしいモノのようだ‥‥
  • ビットフラグをDBのテーブル設計に用いてみる – sawara.me

    DBのテーブル設計を行うときにフラグを持つフィールドは、それぞれtinyint(1)とかでフィールドを作って0 or 1を入れるようにしていました。 [sql title=”こんなかんじで”] CREATE TABLE `sample_old` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘ID’, `flg1` tinyint(1) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘フラグ1’, `flg2` tinyint(1) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘フラグ2’, `flg3` tinyint(1) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘フラグ3’, `flg4` tinyint(1) unsig

    ビットフラグをDBのテーブル設計に用いてみる – sawara.me
  • 隠されていたSQLインジェクション ― @IT

    星野君は赤坂さんと一緒にお客さんのWebアプリケーションの検査をすることになった。辛うじて「不必要情報」の脆弱性を見つけたものの、赤坂さんは不満げだ。 「だって、これ、ほかにもっと危険な脆弱性あるよ……」。 赤坂さん 「ってことで、今回は50点ってとこかな」 星野君 「うわっ。厳しいですね……。一応脆弱性は見つけたんだからもう少し……」 赤坂さん 「え。だって、これ、ほかにもっと危険な脆弱性あるよ」 星野君 「(ほかにも脆弱性あるっていってもなぁ……)」 赤坂さんに「ほかにもっと危険な脆弱性あるよ」と指摘されたにもかかわらず、星野君にはサッパリ見当が付かなかった。不必要情報(Unnecessary Information)の脆弱性に気付くまでの作業で、一通り思い付くことはやりつくしていた。 そうこうしているうちに時間は過ぎ、結局ほかの脆弱性を見つけられないまま、お客さんと約束した時間になっ

    隠されていたSQLインジェクション ― @IT
  • select * は禁じ手で、必ず列名を列挙すべしとされている理由 - 極北データモデリング

    select * from ... と書いてはダメ、たとえ全列取得する場合でも select a, b, c, d from ... と書くのが常識、という話をずいぶん前に聞いたことがあって、意味がわからないので人力検索に投げてみた。 いただいた回答を整理しておく。 テーブル内の一部の列を参照したい場合 例えばクライアント側では1列しか見ないのにワイルドカードで全列取得することには、パフォーマンス上の問題がある。 select * from ... でも select a from ... でもディスクI/Oのコストは基的に変わらないが*1、それ以外のところに問題がある。 ネットワークの問題。DBサーバからクライアントに転送するデータが無駄に大きくなる メモリの問題。DBMSのデータキャッシュやOSのファイルキャッシュが無駄遣いされる テーブルの全ての列を参照したい場合 全列取得したい場

    select * は禁じ手で、必ず列名を列挙すべしとされている理由 - 極北データモデリング
  • 裏MySQL入門(17) 基礎編11 REPLACE or INSERT ON DUPLICATE KEY UPDATE - イノベートな非日常

    MERGE,UPSERTと言われる、UPDATE文とINSERT文を条件によって自動的に切り替えることができるSQL文は、MySQLでは2種類用意されています。 REPLACE、INSERT ON DUPLICATE KEY UPDATEです。 それぞれの違いは REPLACE INSERT文と同じ構文でINSERTの部分をREPLACEに置き換えたもの 動作としては通常のINSERTと同じでDUPLICATE KEYが発生した場合に該当のレコードを削除してINSERT INSERT ON DUPLICATE KEY UPDATE INSERT文のオプションとして記述 動作としては通常のINSERTと同じでDUPLICATE KEYが発生した場合にオプションで指定したUPDATE文を実行 REPLACE文は憶えやすいこともあって、知っている人も多いかと思いますが、アプリケーションで実際に使

    裏MySQL入門(17) 基礎編11 REPLACE or INSERT ON DUPLICATE KEY UPDATE - イノベートな非日常
  • mysqlでjoinした結果をupdate - Qiita

    mysqljoinした結果をupdateする場合の構文を忘れがちなので備忘録としてメモ。 テーブル作成 --- ユーザーメインテーブル CREATE TABLE `user_main`( `user_id` int, `name` text, PRIMARY KEY (`user_id`) ); --- ユーザーサブテーブル CREATE TABLE `user_sub`( `user_id` int, `type` int, PRIMARY KEY (`user_id`) ); INSERT INTO user_main values(1, 'name1'); INSERT INTO user_main values(2, 'name2'); INSERT INTO user_main values(3, 'name3'); INSERT INTO user_sub values(1,

    mysqlでjoinした結果をupdate - Qiita