MySQLの基本
データ準備:
CREATE TABLEの製品 ( PROD_IDの CHAR(10) NOT NULL 、 vend_id CHAR(10) NOT NULL 、 PROD_NAME CHAR(255) NOT NULL 、 prod_priceのDECIMAL(8、2) NOT NULL 、 PROD_DESC VARCHAR(1000年)、NULL ); INSERT INTO製品(PROD_ID、vend_id、PROD_NAME、prod_price、PROD_DESC) VALUES(' BR01 '、' BRS01 '、' 8インチテディベア'、5.99、' 8インチテディベア、キャップとジャケットが付属しています' ); INSERT INTO 製品(PROD_ID、vend_id、PROD_NAME、prod_price、PROD_DESC) VALUES(' BR02 '、' BRS01 '、' 12インチテディベア'、8.99、"12インチテディベアは、キャップとジャケットが付属しています" ); INSERT INTO 製品(PROD_ID、vend_id、PROD_NAME、prod_price、PROD_DESC) VALUES(' BR03 '、' BRS01 '、' 18インチテディベア'、11.99、' 18インチテディベア、キャップとジャケットが付属しています' ); INSERT INTO 製品(PROD_ID、vend_id、PROD_NAME、prod_price、PROD_DESC) VALUES(' BNBG01 '、' DLL01 '、"魚ビーンバッグおもちゃ「3.49、」それを飼料に有するビーンバッグワームとの完全な魚ビーンバッグおもちゃ、' ); INSERT INTO 製品(PROD_ID、vend_id、PROD_NAME、prod_price、PROD_DESC) VALUES(' BNBG02 '、' DLL01 '、' 鳥の豆袋のおもちゃ'、3.49、' 鳥の豆袋のおもちゃ、卵が含まれていません' ); INSERT INTO 製品(PROD_ID、vend_id、PROD_NAME、prod_price、PROD_DESC) VALUES("BNBG03 「」DLL01 「」うさぎ豆袋のおもちゃ「3.49、」ラビット豆袋のおもちゃは、豆袋のニンジンが付属しています" ); INSERT INTO 製品(PROD_ID、vend_id、PROD_NAME、prod_price、PROD_DESC) VALUES(' RGAN01 '、' DLL01 '、' ラガディアン'、4.99、' 18インチラガディアン人形' ); INSERT INTO製品(PROD_ID、vend_id、PROD_NAME、prod_price、PROD_DESC) VALUES(' RYL01 '、' FNG01 '、' キング人形'、9.49、' 王室の衣類や王冠と12インチの王人形' ); INSERT INTO 製品(PROD_ID、vend_id、PROD_NAME、prod_price、PROD_DESC) VALUES(' RYL02 '、' FNG01 '、' 女王の人形'、9.49、"王室の衣類や王冠と12インチの女王人形");
テーブル内のクエリデータ:
SELECT * FROM製品。
ANDとORの組み合わせは、興味深い質問が表示されます。これを説明するために、例を見て。あなたは(包括的)$ 10以上BRS01またはDLL01により製造されたすべての製品の価格をリストする必要がある場合。確立WHERE句でANDとOR演算子の組み合わせを使用して、次のSELECT文:
SELECT PROD_NAME、prod_price FROM 製品 vend_id = ' BRS01 ' OR vend_id = ' DLL01 ' AND prod_price > = 10 ;
上記の結果を見てください。行は明らかに、それが期待されるリターンラインフィルタにはありませんが、$ 10の価格よりも少ない二列に戻りました。なぜこれがそうですか?
その理由は、オーダー・コンピューティングということです。SQL(ほとんどの言語のような)OR演算子治療前、優先AND演算子に。句が上記参照SQLは、それに関係なく、その価格の$ 10の(またはそれ以上)の生成物、またはベンダーBRS01製あらゆる製品、からなる任意の価格サプライヤDLL01であると理解されます。換言すれば、計算の順序で優先順位の高いため、オペレータが誤って結合されます。
この問題を解決するには、明示的に演算子を括弧それぞれのパケットを使用することです。次のSELECT文と出力を考えてみましょう。
SELECT PROD_NAME、prod_price FROM 製品 ( vend_id = ' BRS01 ' OR vend_id = ' DLL01 ' )AND prod_price > = 10 ;
前条の唯一の違いでこのSELECTステートメントは、このステートメント、最初の2つの条件がでアップ括弧します。コンピューティング括弧ANDまたはOR演算子の順序よりも高いため、DBMSまたは状態は、最初の括弧内に濾過します。この時点では、サプライヤーやDLL01 BRS01と価格で製造する製品の選択へのSQLステートメントは、私たちが望むものである$ 10の(またはそれ以上)、です。
WHERE句ANDとOR演算子を有する任意の時間は、明示的にオペレータの括弧をグループ化する必要があります。それは本当にあなたが同様に何をしたい場合でも、デフォルトの評価順に上-依存しないでください。害に括弧を使用して、それが曖昧さを排除することができます。