箱庭ハーブblog

元平日プログラマの趣味の小部屋

SQLまとめ-2

供養シリーズ 文字数制限食らったのでもう一つ

DB RDB 7、SQLの相関サブクエリ
________________________________________________________________
SQLの相関サブクエリ 通常のサブクエリの例
select  (select sum(score) / count(*)
      from Members subm left join Results subr on subm.MemberID=subr.MemberID
      where SubjectID='国語')
    as AgvScore, m.Name, m.Sex, r.Score
  from Members m left join Results r on m.MemberID=r.MemberID and r.SubjectID='国語'
 
SQLの相関サブクエリ 相関サブクエリの例
select  (select sum(score) / count(*)
      from Members subm left join Results subr on subm.MemberID=subr.MemberID 
      where SubjectID='国語' and subm.Sex=m.Sex)
    as AgvScore, m.Name, m.Sex r.Score
  from Members m left join Results r on m.MemberID=r.MemberID and r.SubjectID='国語'
 
平均点を求める場合は、「欠席した人(NULLの人)」を除くので抽出条件
得点を出力する場合は、「欠席した人(NULLの人)」の人も出力するので外部結合条件
 
SQLの相関サブクエリ 相関サブクエリによる連番付加
select  (select count(subm.MemberID) + 1
    from Members subm left join Results subr on subm.MemberID=subr.MemberID and subr.SubjectID='国語'
    where subm.Sex=m.Sex and subr.Score>r.Score)
  as Rank, m.Name, r.Score
from Members m left join Results r on m.MemberID=r.MemberID and r.SubjectID='国語'
order by A,B
 
from句は、親クエリと同一
where句は、親クエリと同一に加え、以下のようにする
partition byしたい列で、subT.A=mainT.A
order byしたい列で、subT.B<mainT.B(小さい順の場合)
 
SQLの相関サブクエリ クロス結合と相関サブクエリによる応用
select
    S1.Year as NowYear, S1.Sales as NowSales
    S2.Year as PreYear, S2.Sales as PreSales
    S1.Sales - S2.Sales as Difference
  from Sales S1, Sales S2
  where  S2.Year= (select max(S3.Year) from Sales S3 S1.Year > S3.Year)

SQLまとめ

供養するシリーズ

DB RDB 4、SQLの基礎
________________________________________________________________
SQLの基礎 SQLの考え方
1、SQLは関数型言語に近い
2、手続き型言語は文単位で分岐する。SQLは式の内部で分岐する
3、手続き型言語ではループはFor文である。SQLではループはgroup byや相関サブクエリである
4、テーブルの行に順序はない
5、テーブルは集合である
6、exists、not existsに慣れよ
7、having句に慣れよ
SQLの基礎 ANSI標準
SQL86  :DMLの仕様策定
SQL89  :DDLの一部の仕様策定。DEFAULTやPK制約などを策定
SQL92  :DDLの残りの仕様策定。データ型拡張、外部結合、一時表
SQL1999:正規表現、再帰クエリ、UNION、ストアドプロシージャ
SQL2003:過渡期。マイナーチェンジ
SQL2008:過渡期。マイナーチェンジ
________________________________________________________________
SQLの基礎 SELECTの処理順序
相関ではないサブクエリ:外側のクエリより先に実行される
from句:集合を指定する。左外部結合は純粋に表を結合する効果、内部結合は抽出も行なう結合効果がある
where句:集合の要素を調べ、条件を満たしたものだけ取り出す
group by句:集合を複数に分割し、分割された部分集合ごとに集計して1レコードとする
having句:分割された部分集合ごとに集合の性質を調べ、条件を満たした部分集合だけ取り出す
select句:通常時は集合の各要素、group by句やhaving句が指定された場合は集計結果から選択する
union構文
order by句
distinctオプション
 
SQLの基礎 句や結合の効果
結合条件(from句外部結合)  :条件を満たさない行は取得されるが、対応する右表の列がNULLになる
結合条件(from句内部結合)  :条件を満たさない行は取得されない
抽出条件(where句)     :条件を満たさない行は取得されない
集合条件(group by句)    :条件ごとに集合が分割される。最終的な取得内容を部分集合の集計結果にする
検索条件(having句)     :条件を満たさない集合は取得されない
select句の集計関数&case式:条件を満たしたものだけ集計対象にして集計する
group by句のcase式    :case式の評価値ごとに集合が分割される
 
SQLの基礎 列の扱い
1、列の種類は、通常列、定数列、集計式の3種類がある
2、group by句に指定された列や式は、集計式扱いである。group byにcase式を指定することも可能である
3、select句において通常列と集計式の混在できない
4、select句において通常列または定数列のみがある場合、各レコードを出力する
6、select句において集計式または定数列のみがある場合、集計の結果を出力する
7、集計の際、複数の集計式を一度に出すことが可能である。select min(a), max(b) from t1 など
8、集計の際、集計関数の中身は、数式表現でも可能である。select max(case when ... end) from t1 など
 
SQLの基礎 NULLの扱い
NULL=NULLはNULL、NULL<>NULLもNULL
算術演算にNULLがあると、答えはNULL
比較演算にNULLがあると、答えはNULL
述語演算のNULL or TRUEは真、NULL and FALSEは偽
集計関数はNULLな行は算出から除外される
IN句のサブクエリにNULLが含まれると、FALSEを返さない
EXIST句のサブクエリにNULLが含まれると、無視する
 
SQLの基礎 相関サブクエリ
where句:from句で得られた集合の要素ごとにサブクエリが実行される
select句:from句、where句で得られた集合の要素or部分集合ごとにサブクエリが実行される



DB RDB 5、SQLの文法
________________________________________________________________
SQLの文法 SQLの表記
<式>:各式やオブジェクト権限など
f、w、g、h、o:<それぞれの句>
<列定義>:<列名> <型> [PRIMARY KEY]
<列変更>:{ADD <列定義> | MODIFY <列定義> | DROP <列>}
<鍵変更>:{ADD PRIMARY KEY <列> | DROP PRIMARY KEY <列>}
<システム権限>:<権限> TO <ユーザ>
<オブジェクト権限>:<権限> ON <オブジェクト> TO <ユーザ>
 
SQLの文法 基本
DML1:SELECT <式>s f [w] [g [h]] [o]
DML2:INSERT INTO(<列名>s) {VALUES(<式>s) | <インラインビュー>}
DML3:DELETE FROM <表名> [w]
DML4:UPDATE <表名> SET {<列>=<式>}s [w]
DDL1:CREATE TABLE <表名>(<列定義>s [, PRIMARY KEY(<列名>s)] )
DDL2:ALTER TABLE <表名> {<列変更> | <鍵変更>}(※1)
DDL3:DROP TABLE <表名>
DDL4:GRANT {<システム権限句> | <オブジェクト権限句>}
DDL5:REVOKE {<システム権限句> | <オブジェクト権限句>}
・insertの被代入列は省略できる
・order by 1で、選択列の1列目を利用できる
 
SQLの文法 演算子
和集合:UNION [ALL]
算術演算子:+、-、*、/、MOD(a,b)、MOD、%
比較演算子:=、>、<、>=、<=、<>
述語演算子:AND、OR、NOT
NULL述語句:式 IS NULL、式 IS NOT NULL
BETWEEN句:左辺 BETWEEN 定数1 AND 定数2
LIKE句:左辺 LIKE '<文字列。任意の文字列は%、任意の1字は_>'
副問合せ: IN(サブクエリ)、EXISTS(サブクエリ)
集計関数:AVG、COUNT、MAX、MIN、SUM(※2)
CASE:CASE {WHEN 条件 THEN 式}s [ELSE 式]END(※3)
 
(※1)Oracleでは列追加や列削除、列修正にも括弧が必要
(※2)AccessではDISTINCT集計できない
(※3)AccessではCASE演算子は利用できない
SQLの文法 結合
t1,t2:クロス結合
t1 left join t2 on ...:左外部結合
t1 right join t2 on ...:右外部結合
t1 inner join t2 on ...:内部結合
t1 cross join t2 on ...:クロス結合
t1,t2 ... where t1.col=t2.col ...:クロス結合からt1.colとt2.colが一致するものだけ。=内部結合
SQLの文法 共通関数
連番     :ROW_NUMBER() OVER ([PARTITION BY <式>s] ORDER BY <列>s)(※4)
文字結合   :CONCAT(str,...)
文字置換   :Replace(str,findStr,replaceStr)
文字トリム  :LTRIM(str)、RTRIM(str)、TRIM(str)
行数     :COUNT(value)
最大     :MAX(value)。nullは除外される。文字列もOK
最小     :MIN(value)。nullは除外される。文字列もOK
合計     :SUM(number)。nullは除外される。文字列は許可されない
平均     :AVG(number)。nullは除外される。文字列は許可されない
標準偏差   :STDDEV(number)。取得されるnumberを標本と考えた時の標準偏差
累積標準偏差 :STDDEV_SAMP(number)。STDDEVとほぼ同一。対象が1行の場合nullを返す
母集団標準偏差:STDDEV_POP(number)。取得されるnumberを母集団と考えた時の標準偏差(※5)
 
(※4)MySQL、Accessは未実装
(※5)Accessの場合、母集団標準偏差はSTDEVP
________________________________________________________________
SQLの文法 DB固有文法
少なくともAccess2007の時点で、distinct集計には対応していない
少なくともAccess2007の時点で、case演算子には対応していない
Oracle・Postgresは、||で文字列結合が可能
Accessの場合、&で文字列結合をする
SQLの文法 DB固有文法 Oracle
ヌルチェック :NVL(value, replaceValue)
文字列長   :LENGTH(str)、LENGTHB(str)
部分文字列  :SUBSTR(string, position[, length])
数値→文字列 :TO_CHAR(num[, format])
日付→文字列 :TO_CHAR(date[, format])
文字列→日付 :TO_DATE(str, format)
文字列→数値 :TO_NUMBER(num[, format])
SQLの文法 DB固有文法 SQL Server
ヌルチェック :ISNULL(value, replaceValue)
文字列長   :LEN(str)、DATALENGTH(str)
部分文字列  :SUBSTRING(string, position, length)
数値→文字列 :STR(num[, length[, decimal]])
日付→文字列 :CONVERT(VARCHAR, date, 111)
文字列→日付 :CONVERT(DATETIME, str, 111)
文字列→数値 :CONVERT(int, str)
 
SQLの文法 DB固有文法 MySQL
ヌルチェック :IFNULL(value, replaceValue)
文字列長   :LENGTH(str)。Byte数が返る
部分文字列  :SQL Serverと同一
数値→文字列 :LPAD(str, length, char)
日付→文字列 :DATE_FORMAT(date, format)
文字列→日付 :STR_TO_DATE(str, format)
文字列→数値 :-
 
SQLの文法 DB固有文法 Postgres
ヌルチェック :COALESCE(value, replaceValue)
連番     :Oracleと同一
文字列長   :Oracleと同一。ただしByte版はない
部分文字列  :Oracleと同一
数値→文字列 :Oracleと同一
日付→文字列 :Oracleと同一
文字列→日付 :Oracleと同一
文字列→数値 :-
 
SQLの文法 DB固有文法 Access
ヌルチェック :-
文字列長   :Len(str)
部分文字列  :Left(str, length)、Right(str, length)
数値→文字列 :Format(num, format)
日付→文字列 :Format(date, format)
文字列→日付 :CDate(str)。yyyy-mm-ddなどを変換
文字列→数値 :CInt(str)、CDec(str)



DB RDB 6、SQLのTips
________________________________________________________________
SQLのTips 1、select句のcase式で、計算をはさんで結果を出力
select
    MemberCode
    ,MemberName
    ,case
      when (Height / nvl(Weight,1)) <= 18  then '痩せている'
      when 18 < (Height / nvl(Weight,1)) and (Height / nvl(Weight,1)) <= 22 then '普通'
      else '太っている' end as Figure
  from Members
SQLのTips 2、select句のcase式で集計条件を分岐
select
    sum(case when Sex='男' then 1 else 0 end) as ManNumber
    ,sum(case when Sex='女' then 1 else 0 end) as WomenNumber
  from Members
 
SQLのTips 3、select句のcase式で、in句を利用
select
    sp.ProdCode
    ,p.ProdName
    case when sp.ProdCode in (select c.ProdCode from Campaigns c) then 'キャンペーン中'
      else null end as Status
  from OnSalesProducts sp left join Products p on sp.ProdCode=p.ProdCode
SQLのTips 4、select句のcase式で、集計結果が特定のものだけ取り出す
select
    sp.ProdCode
    ,max(p.ProdName) as ProdName
    ,case
      when Count(*) > 1 then '複数のキャンペーンが存在!'
      when Count(*) = 1 then max(c.CampaignName)
      else null end
  from OnSalesProducts sp
    left join Products p on sp.ProdCode=p.ProdCode
    left join Campaigns c on sp.ProdCode=c.ProdCode
  group by sp.ProdCode
SQLのTips 5、group by時に非通常列を通常列のように出す
最大値:max(<対象の列>)
最小値:min(<対象の列>)
 
SQLのTips 6、要素のnullと集合
「ある列がNULL」を含まないグループ:having count(<Pキー列>)=count(<NULLを含んで欲しくない列>)
「ある列がNULL」を含むグループ  :having count(<Pキー列>)<>count(<NULLを含んで欲しい列>)
SQLのTips 7、T1 left join T2 のそれぞれの集計方法
A、T1:T2=1:n、T1列毎、T1列集計の場合:group by T1.列、集計関数(T1.列)
B、T1:T2=1:n、T1列毎、T2列集計の場合:group by T1.列、集計関数(T2.列)
C、T1:T2=1:n、T2列毎、T1列集計の場合:from T1 left join サブクエリ(group by T2.列, 結合キー)、group by T2.列、集計関数(T1.列)
D、T1:T2=1:n、T2列毎、T2列集計の場合:group by T2.列、集計関数(T2.列)
単純な集計だが別テーブルの列でWhereしたい時などが、AやD
T1がステータスを持っていたとして、そのステータス毎の明細列の値を集計したい場合などはB
T2に含む列を属性扱いして、のべ集計したい場合などはC
SQLのTips 8、連番付加の方法
select  row_number() over(partition by m.Sex, order by r.Score) as Rank, m.Name, r.Score
  from Members m left join Results r on m.MemberID=r.MemberID and r.SubjectID='国語'
  order by A,B
 
SQLのTips 9、2000/01/01からカレンダーが連続しているか調べる
select CalendarValue,TrueValue
  from (select
        c.CalendarDate as CalendarValue
        ,to_date('2000/01/01') + row_number() over(order by c.CalendarDate) - 1 as TrueValue
      from  Calendar c
      order by CalendarValue)
  where CalenderValue<>TrueValue

DBやRDB用語や概要まとめ

昔のメモを供養シリーズ
今回は面倒なのでがっつりまとめて。

用語 概要
DB          :=DataBase。データベース
DBA         :DataBase Administrator。1、DB管理者。2、Oracleにおける特殊な権限のこと
DBMS        :DataBase Management System。DBのシステム部分を指したい場合の呼称
クエリ         :query。SQL全般やAPIへの問い合わせ全般のこと
権限          :privilege
ロール         :role。複数の権限をひとまとめにした権限セットのこと
RDB         :Relational DataBase。最も一般的なDB
NoSQL       :RDBでないDBの総称
  KVS       :Key Value Store。RDBより分散化や高可用化しやすい
  分散型DB     :Distributed DataBase。いわゆるGoogle BigTableやHadoopファミリのこと
用語 トランザクション
トランザクション    :transaction。DBへの一連の更新処理を一括キャンセルできるようにする仕組み
コミット        :commit。トランザクションの内容を確定して、DBに反映すること
ロールバック      :rollback。トランザクションを中断してトランザクション前の状態に戻すこと
用語 論理構造
マスタ         :master、master table。システム運用開始前に準備する必要があるデータのこと
トラ、トランザクション :1、=transaction。2、=transaction table
トランザクションテーブル:transaction table。利用者が日々追加や変更を行うデータを持つ表のこと
スキーマ        :scheme。DBの構造のこと
PK          :=プライマリキー
キー          :たいていの場合、プライマリキーを指す
プライマリキー     :Primary Key。主キー。表の行を一意に定めるための属性の組み合わせのこと
候補キー        :candidate key。テーブルに対してPKなることができる属性の組み合わせのこと
レコード        :record。行のこと
コピーカラム      :copy column。別のテーブルの従属列の値をコピーして保持する列。基本的に好ましくない
スマートカラム     :smart column。値に連番以外の意味を複数も持たせた列。基本的に好ましくない
用語 オンプレミス用語
SAN     :ストレージ専用ネットワーク網や機能そのものを指す。自動フェールオーバーに必須
  FCーSAN:専用のファイバチャネルによるSAN。銅線や光ファイバなど
  IPーSAN:iSCSIなどによるSAN
iSCSI   :SAN構築の規格の一つ。IPネットワーク機器・配線類でSANを構築する規格の1つ



DB RDB 1、概要
________________________________________________________________
概要 RDBの機能
テーブル    :キーとそれに従属する属性群で定義される表
CRUD    :Insert、Select、Update、Deleteが対応する
トランザクション:一連の処理をまとめ、その単位で実行や処理キャンセルを行う仕組み
ロック     :ある処理セッションの間、別の処理セッションが割り込まないようにできる仕組み
リレーション  :テーブルとテーブルの間にある関連性。1:1、1:n、n:m
 
概要 トランザクションの詳細
分離レベル
  非コミット読み込み      :phantom read, non-repeatable read, dirty read
  コミット読み込み       :phantom read, non-repeatable read。コミットされるまで前も保持
  再読み込み可能        :phantom read。参照行は全て共有ロック(他からは読み取り専用)
  逐次化            :参照テーブルが全てロック(厳密にはWhere句でロック範囲が決定される)
DDLの扱い
  事前の暗黙コミット      :Oracle、InnoDB(MySQL)で採用されている。DDL実行直前にコミットされる
  ロールバック可能       :Oracle、InnoDB(MySQL)以外で採用されている。DDLもロールバック可能である
トランザクション中の制約エラー等
  無視             :Oracleで採用されている
  トランザクション全体が取り消し:Oracle以外で採用されている
未コミット正常切断時の挙動
  コミット           :Oracleで採用されている。ただし、異常終了の場合はロールバック
  ロールバック         :Oracle以外で採用されている
 
概要 ロック
ロックの種類
  排他ロック  :他のトランザクションは取得もできない。UPDATE実行中など
  共有ロック  :他のトランザクションからは読み取り専用。SELECT実行中など
ロックの範囲
  行ロック   :行単位でロックする
  条件範囲ロック:Where条件から行ロックする範囲を確定する
  テーブルロック:テーブル単位でロックする。分離レベルは条件範囲ロックと同じ
概要 RDB接続の歴史
新しい
ADO.NET(ADOと非互換)、その他の独自ドライバ
ADO
DAO(Data Access Objects。JET Engine=Access用)
OLE DB(OLEはCOM、ActiveX(ocx)、ADO、DAOの共通の祖先)
ODBC
古い
________________________________________________________________
概要 RDBの種類
Oracle    :世界最大手のDBソフトウェア。Ellison氏がCodd氏の論文を見たことがきっかけ
SQL Server:安価な実装が可能なMicrosft製ソフトウェア
IBM DB2   :Oracleを追いかける形で公開された3番手
MySQL     :オープンソース最大手
MariaDB   :オープンソース。2013年にOracleによるMySQL買収を受け、MySQLの作者がフォークした製品
Postgres  :オープンソース。日本での普及率が高い。Stonebraker氏から繋がるRDBの一つ
Firebird  :オープンソース。InterBaseを前身とする、軽量でシンプルなRDB
SQLite    :組み込みDBコンポーネント
Access    :DBMSとDBが分離していないDB
 
今から始めるなら、MariaDBがおすすめ
 
概要 RDBの種類 機能比較
DB                 :       O       S       M       P(※1)
Unicode            :     5.0     3.2     3.2     3.2(※2)
固定長文字列(Byte)       :    2000    8000   255文字      なし
可変長文字列(Byte)       :    4000    2^31    2^16  約200文字
空文字の扱い             :    NULL     文字列     文字列     文字列
既定の自動コミット          :      なし      有効      有効      有効
既定の分離レベル           :  コミット読込  コミット読込  再読み込み可  コミット読込
DDLとコミット           :  事前コミット ロールバック可  事前コミット  ロールバック可
既定のトランザクション中の制約エラー等:      続行  ロールバック  ロールバック  ロールバック
コミット忘れ正常切断         :    コミット  ロールバック  ロールバック  ロールバック
無償版の制限
  対応OS             :      両方     Win      両方      両方
  CPU制限(コア)        :       1       1     無制限      32
  メモリ制限(GB)        :       1       1    OS準拠    OS準拠
  サイズ制限(GB)        :      11      10    OS準拠    OS準拠
 
(※1)
O=Oracle 11g XE
S=SQL Server 2012 Express
M=MySQL ver.5.5.3 + InnoDB autocommit=0(これより前はUTF-8の4Byte文字が非対応)
P=Postgre SQL ver.9.4.4
(※2)
Unicode3.2、つまりいずれも第4水準漢字までは完全にサポートしている



DB RDB 2、用語
________________________________________________________________
用語
DBオブジェクト :DB object。DDLによって作成される構造と、それが持つデータの総称
  関数     :function
  インデックス :index
  プロシージャ :procedure
  テーブル   :table
  ビュー    :view
ER図      :Entity Relation Diagram。ER図
SQL      :RDBを操作するための言語。DDL、DML、権限管理の3つに分けられる
  DDL    :Data Definition Language。DBオブジェクト自体の変更を行うSQL
  DML    :Data manipulation Language。DBオブジェクトが持つ値の取得や変更を行うSQL
  サブクエリ  :クエリの中にネストされたクエリ
  相関サブクエリ:サブクエリの一種。1行ずつ条件が検証される
用語 設計用語
第1正規形     :1st normal form。非正規形から属性の値が集合になっているものを無くしたもの
第2正規形     :2nd normal form。第1正規形から部分関数従属性を無くし、PKが存在するもの
第3正規形     :3rd normal form。第2正規形から推移関数従属性を無くしたもの
属性        :attribute。列のこと
定義域       :domain。ある表が取りうる値の組み合わせ全体のこと
エンティティ    :entity。属性となりうる何かのこと
イベントエンティティ:event entity。動詞で表せる要素と、それに従属する要素
関数従属性     :functional dependency。F:X → Yのこと
部分従属      :partial dependency。あるPKの部分キーと、それをキーとして一意に定まる属性による関係
リレーション    :relation。テーブルのこと
リレーショナルモデル:relational model。RDBの論理構造はこれの実装
リソースエンティティ:resource entity。event entityではない要素
推移従属      :transitive dependency。非PKの属性と、それをキーとして一意に定まる属性による関係
非正規形      :unnormalized form。属性が単一になっていない表





DB RDB 3、設計
________________________________________________________________
設計 典型的な手法
1.エンティティ抽出。5W2Hを抽出
2.エンティティ検証。業務を過不足なく表現できるか検証
3.属性の記述。エンティティに属性を記述する
4.キーの記述。エンティティからキーを選出する
5.関連の記述。エンティティの関連を確認する
設計 テーブル設計の鉄則
鉄則1、1つのテーブルに複数の意味を持たせてはならない。問題発生時のリスクが高くなる
鉄則2、1つのカラムに複数の意味を持たせてはならない。管理コストが跳ね上がり、状態遷移ミスも発生する
鉄則3、トリガーは使用しない・使うとしても重複定義してはならない。暴発時のリスクが高い
鉄則4、12ヶ月分・曜日分・星座等を列として持ってはならない。結合や選択が煩雑・複雑になる
推奨1、カラムはスキーマに対してユニークにする。運用・保守において勘違いを事前に防ぐ
推奨2、コピーカラムを作らない。速度面に問題がない限り、ビュー等で対処する
推奨3、スマートカラムを使わない。値が増えた時に対処できなくなる場合がある
推奨4、登録日付・更新日付を保持し、どちらもにデフォルト値を入れる
推奨5、登録者・更新者を保持し、どちらにもデフォルト値を入れる。更新者は適切に更新する
 
設計 プログラム側の鉄則
鉄則1、NVL処理を省略してはならない
鉄則2、プログラム内のINSERT文では、列を省略してはならない
鉄則3、ワークテーブルのデータ取得時、ORDER BYを忘れてはならない
鉄則4、削除フラグの立ったマスタデータを持つトランザクションがあることを想定すること
設計 頻出設計
帳票に対する印刷フラグの用意:納品書や請求書において、印刷した/していないを知りたくなる場合が多い
別々に持つべき情報1    :会社、拠点、部署それぞれの情報
別々に持つべき情報2    :商品マスタの種別分類と経理分類
設計 DBアンチパターン
目標の無いチューニング:aimless tuning。チューニングは目標(現状問題)ありきである
インデックスの妄信  :always index。indexはSELECTと他のDMLの処理速度をトレードオフする機能である
でかすぎるテーブル  :fat table。一般に30近い列を持つとまずい
使われないテーブル  :garbage table。明らかに不要なテーブルが残っているとまずい
管理者が不明瞭    :indeterminate DBA。DBAがいない、DBAの役割があいまい、DBAの役割が大きすぎる
長すぎるSQL    :long sql。3段以上ネストしたり、サブクエリ同士を3つ以上ジョインするSQL
手続き指向なエンジニア:procedure oriented DB engineer。forを止めてGROUP BYしよう
ビューによるビュー  :view from view。ビューがビューで構成される

Cコンパイラとgcc

昔のメモを供養するシリーズ

C系 5、Cコンパイラとgcc
________________________________________________________________
Cコンパイラとgcc ビルド用語
compile unit:=翻訳単位。コンパイル単位
inner linkage:リンゲージ時に衝突した識別子を、それぞれを独立した実体として扱うようにすること
linkage:リンゲージ。単体コンパイルされたオブジェクトモジュール内の識別子を、翻訳単位間でリンクすること
object module:オブジェクトモジュール(.o)。単体コンパイルされたファイルのこと
outer linkage:リンゲージ時に衝突した識別子を、互いに同じ識別子として扱うようにすること
pre-process:プリプロセス。コンパイル前にプリプロセッサの内容をソースコードに反映すること
tentative definition:仮定義。記憶クラス指定子も初期化子を伴わない大域変数の宣言のこと
translation unit:翻訳単位。Cでは、プリプロセスが終了した後のソースファイルが翻訳単位である
 
Cコンパイラとgcc ライブラリ用語
DLL:dynamic link library。=共有ライブラリ。DLLの呼称は、Windows環境での呼び名
dynamic link:動的リンク。実行可能ファイルにライブラリファイル(lib<hoge>.so)が組み込まれないリンク方法
dynamic load:動的読み込み。いわゆるプラグイン等を実現する概念
library:ライブラリ(lib<hoge>.a、lib<hoge>.so)。1つ以上のオブジェクトモジュールをまとめた単位のこと
loader:ローダ。実行ファイルが実行時に共有ライブラリリンクする時、そのリンクを行なうシステムのこと
shared library:シェアードライブラリ、共有ライブラリ。動的リンクを目的としたライブラリ(※1)
static library:静的ライブラリ。ビルド時に実行ファイルに含まれることを目的としたライブラリ
static link:静的リンク。実行可能ファイルにライブラリファイル(lib<hoge>.a)が組み込まれるリンク方法
symbol table:シンボルテーブル。動的リンクのために、ビルド時に予め用意される識別子-アドレス空間表のこと
 
(※1)狭義には、メモリ上のコードが複数のプロセスで共有されるライブラリを指す
________________________________________________________________
Cコンパイラとgcc ビルド 実行可能形式
1、プリプロセッサが処理される
2、翻訳単位ごとにコンパイルされる
2-1、翻訳単位を上から順に読み取り、extern宣言・定義・仮定義を記憶しながら構文解析を進める
2-2、仮定義は、定義の存在が確認されるか、全翻訳単位同士のリンゲージ終了時まで保留となる
2-3、翻訳単位でコンパイルを行い、オブジェクトモジュールを生成する
3、各オブジェクトモジュールをリンゲージする
 
Cコンパイラとgcc ビルド 
gcc access.c -L/usr/local/pgsql/lib  -I/usr/local/pgsql/include -labc
・access.cというソースファイルをコンパイルする
/usr/local/pgsql/lib からライブラリファイル(lib<hoge>.aやlib<hoge>.so)を検索する
/usr/local/pgsql/include からヘッダファイル(.h)を検索する
・libabc.aやlibabc.soをリンゲージ時に含める
 
Cコンパイラとgcc ビルド ccコンパイラのコマンドの詳細
cc [-[C][c][o <ファイル名>]] {<ソースファイル名>}s [-L<ディレクトリ>]s [-l<ライブラリファイル名>]s(※1)
Cオプション:コメントを削除しない
cオプション:コンパイルのみ行い、リンゲージしない
Iオプション:ヘッダファイルを検索するディレクトリを追加指定する。-I/home/ならば、/home/を検索する
lオプション:ライブラリファイルをリンクする。-lmならばlibm.aをリンクする
Lオプション:ライブラリファイルを検索するディレクトリを追加指定する。-L/home/ならば、/home/を検索する
oオプション:出力ファイルの名前を指定
 
(※1)
標準ライブラリ関数は、ccコマンドに-lオプションが不要で、自動リンクされる
________________________________________________________________
Cコンパイラとgcc ファイルの種類と考え方
ソース         :.c、.cpp、.h。ヘッダファイルには、.hを付ける慣習がある(※2)
オブジェクト(Linux):.o、.a、.so。Linux環境では、慣習的にこれらの拡張子を使用する(※2)
オブジェクト(Win)  :.obj、.lib、.dll。Windows環境では、これらの拡張子を使用する
実行可能形式(Linux):不定。元来Linuxには拡張子の概念はない(※2)
実行可能形式(Win)  :.exe
 
(※2)
基本的に、Linuxのファイルの種類はOSから見た場合、「バイトの列」しかなく、本来は拡張子という概念がない
ただし実行ファイルか否かは、パーミッションとして実行権限をファイルに対して指定できる
また、GNOME等では、Windowsの拡張子の仕組みをエミュレートするソフトウェアが組み込まれていたりする
 
Cコンパイラとgcc ソースファイルの作法
・ヘッダファイルは宣言のみ書き、定義を書かない
・本体ファイルにはグローバルな識別子の宣言を書かない
 
Cコンパイラとgcc オブジェクトファイルの作法
・通常の単体コンパイルファイルは、gccならば.o、vsやborlandならば.objの拡張子を付ける
・Linux環境において、静的ライブラリはlib<hoge>.aという名前にする
・Linux環境において、共有ライブラリはlib<hoge>.soという名前にする
・Windows環境において、静的ライブラリは.libという名前にする
・Windows環境において、動的ライブラリは.dllという名前にする

C系 4、各言語ごとの文字列

また忘れてしまった…ので2つ

昔のメモを供養するシリーズ

C系 4、各言語ごとの文字列
________________________________________________________________
各言語ごとの文字列 C/C++
形式:文字列型が存在しない。実体は配列かポインタ。
演算:参照が一致しているか調べる。!=、==
関数:文字列が一致しているか調べる。_tcscmp()
 
各言語ごとの文字列 Java
形式:string型
演算:参照が一致しているか調べる。!=、==
関数:文字列が一致しているか調べる。equals()
 
各言語ごとの文字列 C#、VB.NET
形式:string型
演算:文字列が一致しているか調べる。!=、==
関数:文字列が一致しているか調べる。Equals()
________________________________________________________________
各言語ごとの文字列 C#における比較演算子とEqualsの違い
比較演算子は、変数の型のオーバーロード内容が実行される
Equals()は、オブジェクト型のEquals()が実行される
 
各言語ごとの文字列 C言語のtchar.h
文字型:TCHAR char/WCHAR
文字列型:LPTSTR char*/WCHAR*
実体固定ポインタ:LPCTSTR const char*/const WCHAR*
Tマクロ:_T("定数")
コピー1:_tcscpy。(strcpy、wcscpy)
コピー2:_tcsncpy。(strncpy、wcsncpy)
連結:_tcscat。(strcat、wcscat)
長さ:_tcslen。(strlen、wcslen)
比較:_tcscmp。(strcmp、wcscmp)
検索:_tcschr。(strchr、wcschr)
変数へ代入:_stprintf(sprintf、swprintf)
スプリット:_tcstok(strtok、wcstok)
同じサイズ確保:_tcsdup(_strdup、_wcsdup)
コンソール表示:_tprintf(printf、wprintf)
コンソール入力:_tscanf(scanf、wscanf)
ファイルオープン:_tfopen(fopen、_wfopen)
ファイル書き込み:_ftprintf(fprintf、fwprintf)
ファイル読み込み:_ftscanf(fscanf、fwscanf)

フリーエリア

takemori
Unityと戯れてます
Twitter : @takemori_kondo

iOS
coming soon...

Windows
Html Editor - Nazuna
Managed DirectX サンプル集

beginning since
2006.08.17
renewaled on
2011.06.03

最新コメント

[2013/06/14 ミューネ]
[2012/08/30 ノートPC]