15〜第18章「MySQLはなります知っている必要があります」

第15章 - 章XVIII

第15章

テーブルは複数のテーブルに情報を分割する設計データのクラスのための1つのテーブル、特定の値(すなわち、相互相関関係デザイン)によって使用されるテーブルことを保証することです

例えば、我々は、2つのテーブル、ストレージベンダ情報、その他の情報ストレージ製品、テーブルは、すべてのサプライヤーの情報が含まれているベンダーを設定することができ、行あたり各サプライヤー、それらは主キーと呼ばれるそのようなベンダーIDなどの一意に識別、製品テーブル唯一のベンダーIDは、他の情報提供に加えて記憶され、したがって、製品の主キーベンダーと呼ばれていない、製品情報を記憶する外部キーそれは、2つのテーブルを関連しているベンダーから供給された対応テーブルを検索することがベンダーIDを使用して、情報提供。

外部キー:テーブルへの外部キー、別のテーブルの主キーが含まれています

利点:

サプライヤー情報は、時間と空間を節約し、繰り返されていません

サプライヤ情報が変更された場合、ベンダーが表にのみ単一のレコードを更新することができ、関連するテーブルからのデータは変更しないでください

データは明らかに矛盾しない、無重複データなので、はるかに優れた非リレーショナルデータベースよりデータを簡単に、リレーショナルデータベースのスケーラビリティを処理します

スケーラビリティ:必ず増え続けるワークロードに適応する能力、うまく設計されたデータベースやアプリケーションが良いスケーラビリティと呼ばれています

カップリングと呼ばれるSELECT文対応テーブルにおいて、この構文テーブルは、実行時に正しい対応テーブルに結合された出力ラインの複数のセットを返す使用して結合することができます

リレーショナルテーブルを使用した場合の製品テーブルに違法なベンダーIDの所有に挿入された場合は、関係が非常に重要で唯一の合法的なデータを挿入(であること、vendorsdテーブルに表示されていない)製品を生産するためにベンダー、これらの製品は、サプライヤーには関連がないため、アクセスできない

リンクを作成することは、非常に簡単で、すべてのテーブルのリンクを提供し、彼らがどのように関連しますか

SELECT vend_name, prod_name, prod_price
FROM vendors, products
WHERE vendors.vend_id = products.vend_id
ORDER BY vend_name, prod_name;

SELECT文で複数のテーブルを結合すると、対応関係は運転中に構築され、データベース自体がテーブルを結合する方法を示すものではありませんが、実際に操作を行う際句は、2つのテーブルを結合する場合には、それが必要ですWHERE句によって第一テーブルと第二テーブルの各行スクリーニング各行ペア(すなわち、結合条件)

直積:しない連結状態が第二テーブル内の行の数、デカルト積を乗じた最初のテーブル内の行の数になり取り出される行の数の直積であるテーブルのリレーションシップによって返される結果型はクロスカップリングと呼ばれているカップリング

SELECT vend_name, prod_name, prod_price
FROM vendors, products
ORDER BY vend_name, prod_name;

我々は、すべてのリンクがWHERE句を持っていることを確認したいです

現在のために使用されるカップリング等価リンクとしても知られている2つのテーブル間の等価性試験に基づいて、内部結合、結合は2つのテーブル間の関係はINNER JOINを使用して、指定されたような異なる方法のために使用することができます

SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;

複数のテーブルを結合

SELECT prod_name, vend_name, prod_price, quantity
FROM orderitems, products, vendors
WHERE products.vend_id = vendors.vend_id
	AND orderitems.prod_id = products.prod_id
	AND order_num = 20005;

この例が示す20005の順にアイテムの数、テーブルは、製品テーブルアイテムを見つけるに対応vend_idを見つけるためにベンダーに行PROD_ID列order_num = 20005、および対応する会社に対応するに従って

より多くのリンクされたテーブル、より深刻なパフォーマンスの低下

第14章の前にサブクエリを想起

SELECT cust_name, cust_contact
FROM customers
WHERE cust_id IN (SELECT cust_id
                  FROM orderts
                  WHERE order_num IN (SELECT order_num
                                      FROM order_items
                                      WHERE prod_id = 'TNT2'));

あなたは、リンクを使用することができます

SELECT cust_name, cust_contact
FROM customers, orders, orderitems
WHERE customers.cust_id = orders.cust_id
	AND orderitems.order_num = orders.order_num
	AND prod_id = 'TNT2';

WHERE句の2つの関連フロントとリアAフィルター

章XVI

列名のエイリアスに加えて、外部(列に似て)計算フィールド。SQLは、テーブル名の繰り返し使用に便利なように、SQL文を短くするために、エイリアスからテーブル名にできます

SELECT cust_name, cust_contact
FROM customers AS c, orders AS o, orderitems AS oi
WHERE c.cust_id = o.cust_id
	AND oi.order_num = o.order_num
	AND prod_id = 'TNT2';

表の別名だけ句だけでなく、他の部品BY句もSELECTリスト内で使用することができますWHERE、ORDERで使用されていないが、唯一のクエリの実行中に表の別名に注意を払うに、クライアントに返しません

あなたが内部リンクまたは同等のリンクのみを使用する前に、その後、他のリンクを紹介

自己結合あなたが記事を見つけた場合、問題(IDがDTNTRである)、および商品サプライヤーは何の問題もないものを他の項目知っていただきたいと思いますので、ベンダーがサブクエリを使用することができ、すべてのアイテムを検索します

SELECT prod_id, prod_name
FROM products
WHERE vend_id = (SELECT vend_id
                FROM products
                WHERE prod_id = 'DTNTR');

使用リンク

SELECT p1.prod_id, p1.prod_name
FROM products AS p1, products AS p2
WHERE p1.vend_id = p2.vend_id
	AND p2.prod_id = 'DTNTR';

このクエリは、実際には、同じテーブルではなく、製品テーブルにあいまいな参照を持つ2つのテーブルです。MySQLはそうP1、P2の区別と、製品を参照しているインスタンスを知りません

テーブルは現在記載されている複数のテーブルのうちの1つまたは複数にリンクされている場合は、その標準的なカップリングには、重複する列を返すことがあり、自然なリンクが、少なくともこのケースを除外することができ、各列は一度だけ返されたが、我々はする必要があります自分自身

SELECT c.*, o.order_num, o.order_date,
	   oi.prod_id, oi.quantity, oi.item_price
FROM customers ASc, orders AS o, orderitems AS oi
WHERE c.cust_id = o.cust_id
	AND oi.order_num = o.order_num
	AND prod_id = 'FB';

ワイルドカードを使用して、テーブルの場合は、他のすべての列が明示的に実際には、我々はおそらく、内部リンクが自然に連結されていない使用することはありません、それが繰り返されることはありません、記載されています

外部リンクは、関連テーブルの行に関連付けられているこれらの行が含まれていません。

最初の使用は、内側には、すべての顧客の注文を取得するために参加します

SELECT customers.cust_id, orders.order_num
FROM customers INNER JOIN orders
  ON customers.cust_id = orders.cust_id;

外部リンクはすべての顧客を検索します

SELECT customers.cust_id, orders.order_num
FROM customers LEFT OUTER JOIN orders
  ON customers.cust_id = orders.cust_id;

さらにOUTERが使用され、行が関連付けられていない外部の結合線路に参加含む、LEFTまたはRIGHTキーは、右を選択するために、LEFT OUTERは、すべての行の顧客からのJOIN上記の例を使用して、すべての行を含むテーブルを指定するために使用されなければなりませんRIGHT OUTERを使用してテーブル内のすべての行(注文)には、(のみ結合条件等号の両側句交換位置ON)、次の例に参加します

SELECT customers.cust_id, orders.order_num
FROM customers RIGHT OUTER JOIN orders
  ON orders.cust_id = customers.cust_id;

集約関数は、各顧客に顧客のすべてを取得するために、このような注文の数としてリンク、と一緒に使用することができ、顧客が使用するCOUNT()関数、パケットデータであってもよいです

SELECT customers.cust_name,
	   customers.cust_id,
	   COUNT(orders.order_num) AS num_ord
FROM customers INNER JOIN orders
ON customers.cust_id = orders.cust_id
GROUP BY customers.cust_id;

また、外部リンクで使用することができ、何の顧客の注文が表示されません

SELECT customers.cust_name,
	   customers.cust_id,
	   COUNT(orders.order_num) AS num_ord
FROM customers LEFT OUTER JOIN orders
ON customers.cust_id = orders.cust_id
GROUP BY customers.cust_id;

使用の条件を結合し、結合

*注結合型、一般に内部リンク、外部リンクも有効に使用

それ以外の場合は、デカルト積を取得する、正しい結合条件を使用し、結合条件を持っている必要があります

章XVII

MySQLは、単一のクエリの結果として、複数のクエリ(複数SELECT文)を可能にし、結果セットを返し、これらの組成物またはクエリは、通常、化合物クエリと呼ばれ

二つの基本的な状況の問合せの組み合わせを使用する必要があります。

単一のクエリでは、同様の構造の異なるテーブルから返すデータ

データを返すために、単一のクエリによって、単一のテーブルの上に複数のクエリを実行します

句は、クエリの組み合わせとして与えることができ、複数持つ任意のSELECT文

単一の結果セットへのSQLクエリの利用可能な数、それらの組み合わせの結果を結合するUNION演算子

SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
UNION
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001, 1002);

句は、同じタスクを実行するためにWHEREここでは、複数を使用することができます

SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
   OR vend_id IN (1001, 1002);

より複雑なフィルタの場合、または複数のテーブルからデータを取得、UNIONを使用する方が簡単かもしれ

UNIONルール

UNIONは、二つ以上または2つのSELECT文で構成する必要があります

UNIONは、各クエリが同じ列、式、または集計関数を含める必要があります(ただし、同じ順序でリストされている個々の列を必要としません)

列データ・タイプは互換性がある必要があり、正確に同じタイプを持っていないが、DBMSタイプ(例えば、異なる種類または日付タイプの異なる値)でなければならないが暗黙的に変換することができます。

UNIONは、クエリの結果が自動的に重複する行を削除し、これはデフォルトの動作UNIONであるが、それはまた変更することができ、あなたは、UNION ALLを使用することができます

SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
UNION ALL
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001, 1002);

あなたが本当に(重複を含む)すべての行が表示されますが必要な場合に行われた作業を完了することはできませんUNION ALLは、あなたの代わりにWHEREのUNION ALLを使用する必要があります。

クエリ結果の組み合わせは、ソートされたが、ORDER BY句のみORDERと、最終的なSELECT文の後に表示される必要があり、すべてのSELECT文が返すすべての結果をソートするために使用するMySQLのことができます

SELECT vend_id, prod_id, prod_price
FROM products
WHERE prod_price <= 5
UNION 
SELECT vend_id, prod_id, prod_price
FROM products
WHERE vend_id IN (1001, 1002)
ORDER BY vend_id, prod_price;

ちょうどテーブルのためではないUNIONクエリの組み合わせを使用すると、別のテーブルに適用することができます

章XVIII

MyISAMテーブルとInnoDBのサポートフルテキスト検索がサポートされていません。

使用LIKEキーワードまたは正規表現マッチングは、それは時間がかかることがなく簡単な単語と一致する必要があります単語を指定すると、一致が一致しないものを定義することと一致していなければなりません、回線数の増加に伴って、MySQLのテーブルのすべての行を必要とそれは、単一の一致(マッチ線同じ行を複数回)と一致する行および複数の列を区別しないような結果は、インテリジェントではなかったです

これらの問題は、MySQLが個別に各ラインを表示するには、この時点では必要ありません、あなたが個別に各単語を分析し、処理する必要はありません、フルテキスト検索で解決することができます

表の作成時に必要な缶にも複数の列を指定する場合は、テーブルを作成するときに、フルテキスト検索では、インデックス列が検索されている必要があり、列のMySQLのインデックスが指示句FULLTEXT(note_text)によると、は、次のように指定することができますFULLTEXTデータをインポートするとき以降、FULLTEXTを使用していません

インデックスの後、使用する検索式を指定する機能マッチ()、反対()、マッチ()、に対する検索列を指定します()を使用

SELECT note_text
FROM productnotes
WHERE Match(note_text) Against('rabbit');

「ラビ」を変更した場合は、結果がありません

マッチ()必要があります()の値は、複数の指定同じFULLTEXTで定義されており、大文字と小文字を区別しないBINARYモードでない限り、またはそれらは、右の順にリストされなければなりません

ただ、検索もLIKE句を完了するために使用することができます

SELECT note_text
FROM productnotes
WHERE note_text LIKE '%rabbit%'

最初に返された行の高レベルで、句を返す二つの結果が、試合の良い度を持つこの種の全文、ORDER BYを使用しないでください

SELECT note_text,
	   Match(note_text) Against('rabbit') AS rank1
FROM productnotes;

予約語としてランクでのMySQLの新バージョンでは、その代わりに、ランク-1

SELECT関数は、二つのすべての行がランク-1各行が算出さレベル値の列のフルテキスト検索を表し、返される使用してではなく

句がに従って降順にレベル0とレベル値を除外されるWHERE使用そうであれば、ワード線のレベル数は、MySQLから計算方法のようなユニークワードの数は、含まれていませんウサギ '線レベルは、0であります

あなたが複数の検索条件を指定した場合、より高いレベルのワード線の数と一致して含めます

クエリは、銀行が単語を指定していないことを、検索結果の緩和の範囲を拡張するために使用されるが、ために検索することができます

SELECT note_text
FROM productnotes
WHERE Match(note_text) 
	  Against('anvils' WITH QUERY EXPANSION);

データとインデックス2が通過する検索を完了するために

基準は、上述の一致するすべての行を検索することは実質的にフルテキスト検索であるために、実施形態は、検索を示す、一致する行をチェックし、MySQLは、これらのワード線が有用である(例えば、顧客および推奨)を選択プラスこれらの便利な言葉は、何よりも言葉のアンビルを含んで全文検索結果の中を歩きます

ブール全文検索は、とさえFULLTEXTインデックスを定義されていない場合は(特定の単語が高いレーティング言い換えれよりも重要である指定する)プロンプト手配(行が指定されたワードは戻りませんが含まれていても)、単語が除外されるように、指定された単語と一致するようにまた、使用されるが、比較的遅いすることができます

すべての行を一致させるにはなく、ロープで始まる任意の単語が含まれていない、あなたは、次のクエリを使用することができます

SELECT note_text
FROM productnotes
WHERE Match(note_text) 
	  Against('heavy -rope*' IN BOOLEAN MODE);

次の表に示すブール演算子を使用するだけでなく、いくつかの

ブール演算子 説明
+ 単語が存在している必要があります含まれてい
- 除外、言葉が現れてはなりません
> それは含まれており、値のレベルを上げます
< 含む、および低減されたレベル値
() サブワード式(式がこれらのサブグループとして含まれている許可等を除きます)
単語のランキング値をキャンセル
* サフィックスのワイルドカード
「」 句の定義、または除外

例えば:

ワードウサギと餌を含む行をマッチング

SELECT note_text
FROM productnotes
WHERE Match(note_text)
	  Against('+rabbit +bait' IN BOOLEAN MODE);

オペレータは、指定されていない場合、マッチングウサギは、少なくとも一つのワード線を含む餌

SELECT note_text
FROM productnotes
WHERE Match(note_text)
	  Agaisnt('rabbit bait' IN BOOLEAN MODE);

二つの単語が一致したのではなく一致するフレーズウサギの餌

SELECT note_text
FROM productnotes
WHERE Match(note_text)
	  Against('"rabbit bait"' IN BOOLEAN MODE);

第二選挙、かつてのレベルを高め、レベル低下

SELECT note_text
FROM productnotes
WHERE Match(note_text)
	  Against('>rabbit <carrot' IN BOOLEAN MODE);

後者の格付けを減らし、二つの単語を一致させます

SELECT note_text
FROM productnotes
WHERE Match(note_text) 
	  Against('+safe +(<combination)' IN BOOLEAN MODE);

配列ソートなし:ブールラインモードを、降順で返されるレベルの値によりません

フルテキスト検索の注意事項

フルテキストデータのインデックスを作成すると、短い単語は無視され、インデックスから除外され、短期的には、3文字以下である単語として定義されます

フルテキストデータのインデックスを作成する際に、MySQLは非内蔵の単語リスト、単語が常に無視されており、カバーする必要があります

単語が行の50%以上に表示されている場合、それは非単語として無視されます、このルールは、IN BOOLEAN MODEを適用しません。

*行のテーブル番号<= 2ライン、フルテキスト検索は、ルール50%として、結果を返しません

このようやるいけない指標として単一引用符を無視

公開された84元の記事 ウォン称賛7 ビュー10000 +

おすすめ

転載: blog.csdn.net/weixin_43569916/article/details/104375793