sql >> データベース >  >> RDS >> Database

SQLチートシート:SQL、SQLコマンド、およびSQLインジェクションとは

    構造化照会言語(SQL)の使用は、最初は複雑に見えるかもしれませんが、さらに、より簡単ではるかに便利になります。練習が必要なだけです。

    データベース内のデータを管理するためのより良い方法を探している場合、またはSQLがあなたに開く可能性について単に興味がある場合は、適切な場所に来ました!

    なぜSQLなのか

    ほとんどの人はSQLについて聞いたことはありますが、SQLの動作に完全には精通していない可能性があります。 SQLは、データベースと通信するための特別な言語と考えることができます。コンピューターは英語のような自然な言語を理解しないので、翻訳する方法が必要です。そしてここに、データベースにデータを表示したり、新しいデータを保存したりするように命令するSQがあります。 Oracle、Microsoft SQL Server、IBM DB2、MySQL、PostgreSQLなどのさまざまなデータベースがこれを使用しています。

    SQLを使用すると、SQLクエリを使用して、データベースからデータを取得、挿入、更新、および削除できます。 SQLクエリは、句と呼ばれる単語を使用します。句は、データベースに対して何らかのアクションを実行するために連携して機能するいくつかの要素で構成されています。最も一般的な3つの句は、SELECT、UPDATE、およびDELETEです。それらはほとんどすべてのSQLステートメントに含まれています。

    最も基本的なクエリ構文を見てみましょう:

    SELECT * FROM table_name;

    このクエリは、特定のテーブルに保存されているすべてのデータを選択します。アスタリスク(*)は、テーブルに含まれる列の数に関係なく、そのテーブルのすべての列を返す必要があることを示します。

    SQLクエリのチートシート:どのようなコマンドがありますか?

    ここでは、データベースの操作中に必要となる、最も一般的に使用されるSQLコマンドと句の選択を示します。始めましょう。

    SQL CREATE DATABASE

    データベースなしではSQLで多くのことを行うことはできないので、最初にそれを邪魔にならないようにするのが最善です。

    データベースの作成 サーバー上に新しいデータベースを作成するためのコマンドです。たとえば、既存のテーブルやデータを使用せずに新たなスタートを切りたいとします。構文は次のとおりです。

    CREATE DATABASE testDB;

    SQL CREATE TABLE

    リレーショナルデータベースは、データをテーブルに格納します。したがって、データベースを利用するには、データベースにテーブルを作成する必要があります。この操作は、列の名前変更、新しい列の追加、列の削除など、テーブル構造の変更と密接に関連しています。

    ただし、テーブルの変更は既存のテーブルでのみ可能です。したがって、最初にテーブルを作成する必要があります。もう1つの関連コマンドは、ADD COLUMNです。これにより、既存のテーブルに列を追加できます。

    CREATE TABLE [dbo].[Students](
    	[Name] [nvarchar](100) NOT NULL,
    	[Bio] [ntext] NULL,
    	[DateOfBirth] [datetime] NOT NULL,
    );
    

    SQLドロップテーブル

    テーブルを削除する時間と場所があり、気まぐれで削除することは決して良い考えではありません。 DROP TABLEは、すべてのレコード、インデックス、および制約を含むテーブル全体をデータベースから削除します。

    一度テーブルを削除すると、テーブルを回復する方法はありません。この特定のテーブルが必要であり、削除したいことを確認してください。それ以外の場合、データを元に戻す唯一のオプションは、バックアップからデータを復元することです。

    DROP TABLE [dbo].[Students];

    SQL SELECT

    おそらく、SQLで最も一般的に使用される関数はSelectです。その目的は、さらに操作および分析するために1つ以上のテーブルからデータを取得することです。この機能により、ユーザーはさまざまな属性(フィルター)を指定することにより、データのサブセット(テーブル)を分離して分析できます。

    行のグループを選択するには、1つ以上のフィルターに基づいて、返される行を識別するクエリを記述します。フィルタは、目標に応じて他の操作と組み合わせたさまざまな関数または式によって指定されます。

    SELECT TOP (1000) [Name]
          ,[Phone]
          ,[Website]
          ,[Address]
          ,[City]
          ,[State]
          ,[Country]
          ,[Description]
          ,[Employees]
    FROM [test].[dbo].[company]
    

    SQL INSERT

    INSERT関数は、SQLのテーブルにデータの行を挿入します。このステートメントの基本構造は、テーブルを指定します データをに追加します そのデータを含める。次に、各を定義します その行内の各列に配置する必要があります。 SQLの使い方を学んでいるだけでは混乱するかもしれませんが、ある程度の練習をすれば、はるかに簡単になります。

    INSERT INTO [dbo].[company]
               ([Name]
               ,[Phone]
               ,[Website]
               ,[Address]
               ,[City]
               ,[State]
               ,[Country]
               ,[Description]
               ,[Employees])
         VALUES(
               'NameValue'
               ,'PhoneValue'
               ,'WebsiteValue'
               , 'AddressValue'
               , 'CityValue'
               , 'StateValue'
               , 'CountryValue'
               , 'DescriptionValue'
               , 2 ) 
    

    SQLの更新

    テーブルに格納されているデータを変更する場合は、UPDATEステートメントが必要です。これは、単純な行と複数のレコードの両方に適用できる最も一般的に使用されるSQLステートメントの1つでもあります。

    デフォルトの構文には、SETコンポーネントとWHEREコンポーネントが含まれています。 SET レコードの更新方法と場所を定義します どのレコードを更新する必要があるかを決定します。 WHERE句がないと、コマンドはテーブル内のすべてのレコードを更新します。

    UPDATE [dbo].[company]
       SET [Name] = <Name, nvarchar(max),>
          ,[Phone] = <Phone, nvarchar(max),>
          ,[Website] = <Website, nvarchar(max),>
          ,[Address] = <Address, nvarchar(max),>
          ,[City] = <City, nvarchar(max),>
          ,[State] = <State, nvarchar(max),>
          ,[Country] = <Country, nvarchar(max),>
          ,[Description] = <Description, nvarchar(max),>
          ,[Employees] = <Employees, int,>
     WHERE <Search Conditions,,>
    

    SQL AVG

    AVG関数は、列の数値の平均を整数または浮動小数点数として返します。ほとんどのSQL関数と同様に、SELECTステートメントまたはINSERTステートメントの一部にすることができます。 SELECTステートメント内で使用する場合は、括弧内に含める必要があります。以下に、すべての従業員の平均年齢を返す必要があるAVG()を使用したクエリの例を示します。

    SELECT avg(age) FROM employee;
    
    

    SQL SUM

    SUM関数は、列内のすべての値の合計を返します。これは、複数の列を処理する場合に非常に役立ちます。結果は、そのテーブルのすべてのデータを合計したテーブルの概要になります。

    SELECT  Sum(Employees) as Sum, 
    		AVG(Employees) as AVG,
    		MAX(Employees) as Max, 
    		MIN(Employees) as Min
    FROM [test].[dbo].[company]
    

    SQL ORDER BY

    SQLには多くの演算子がありますが、最も一般的に使用される演算子の1つはORDERBYです。指定された式に従ってデータをソートします。したがって、データセットに同様の値を持つ複数のレコードが含まれている場合、それらは好みに応じて並べ替えられます。

    つまり、SQLのORDERBY演算子は比較演算子です。これにより、ある列の値を別の列の値と比較し、この比較の順序に従って結果を返すことができます。

    構文はORDERBY列名です。 。ソートされた方法で情報を見つける必要がある場合に役立ちます。たとえば、同じ値を持つ行を検索する場合や、どの行が最も人気があるかを判断する場合です。

    SELECT * FROM Readers
    ORDER BY City;
    

    SQL GROUP BY

    GROUP BY演算子は、SQLで非常に重要で便利なツールです。ある種の共通の特性またはプロパティを共有するデータの行をグループ化するために使用できます。したがって、クエリで指定された1つ以上の列で行を並べ替えます。この句は通常、他のすべての句が実行された後、SQLステートメントの最後に配置されます。

    典型的なケースは、GROUPBYを使用してデータベース内のデータを要約することです。 SELECTステートメントはWHERE句を使用して結果セットから不要なレコードを除外し、次にGROUP BY句を使用して、指定した特性に基づいて関連するレコードをグループ化します。

    SELECT * FROM Readers
    GROUP BY Country;
    

    SQLインジェクション

    Webプログラマーなら誰でも、SQLインジェクション攻撃について聞いたことがあるでしょう。それらはインターネットの惨劇であり、多くの人気のあるWebサイトやアプリケーションに深い傷を残し、治癒には何年もかかる可能性があります。これらの攻撃の犠牲にならないようにする場合は、攻撃が何であるか、どのように機能するか、将来攻撃から身を守るために何ができるかを理解することが重要です。

    SQLインジェクション攻撃に精通していない場合は、WebアプリケーションがSQLインジェクション攻撃に対して脆弱である可能性があります。この脅威は、そのような攻撃を検出するための新しいテクノロジーを生み出すのに十分なほど深刻です。ただし、テクノロジーに依存するだけでは不十分です。セキュリティの専門家を支援するために、SQLインジェクションが平易な英語でどのように機能するかを説明する便利なチートシートをまとめました。

    攻撃者は不正なクエリを実行して、機密データにアクセスしたり、既存のデータベースを変更したり、データを削除したりします。このように、SQLインジェクションは、悪意のあるSQLステートメントが実行のために入力フィールドに挿入されるデータ駆動型アプリケーションを攻撃するコードインジェクション技術です(通常はHTTPリクエストを介して)。

    攻撃が成功すると、攻撃者はそのWebサイトのすべてのデータベースサーバーにアクセスできるようになります。内部に入ると、攻撃者はデータベースのコンテンツを取得したり、変更したり、破壊したりする可能性があります。これが、Web開発者にとって、プログラミング言語が潜在的な攻撃者にとってSQLインジェクションを容易または困難にする方法を理解することが非常に重要である理由です。

    SQLインジェクション攻撃には主に2つのタイプがあります。エラーベース およびブラインド

    エラーベースの攻撃は、開発者がユーザー入力をサニタイズしない場合に発生します。これにより、不正なデータがインタープリターに渡され、正当なユーザーにエラー(または予期しない動作)が発生します。エラーベースの攻撃の原因は、多くの場合、簡単に確認できます。エラーログに登録されるか、テスト中にバグとして表示されます。

    この種の攻撃は、コードレビュープロセスが不十分なためにも発生します。あるコーダーがスクリプトにデバッグコードを残した場合、他のコーダーは起こりうる問題を知らずにコードを実行します。

    Webサイトでデータベースエラーやその他の奇妙な動作に気付いた場合は、SQLインジェクションの問題がある可能性があります!

    結論

    もちろん、仕事でSQLを使用するデータベースの専門家は、これらすべてのコマンドを心から知っている必要があります。それでも、手元にある単純なチートシートとしてそれらを持っていることも役立ちます。以下のコメントセクションで、考慮事項とプロのトリックを自由に共有してください!


    1. ClusterControl1.8.2の新しいユーザーとLDAP管理

    2. CS50:LIKE演算子、%展開による変数置換

    3. リンクサーバーエラーのトラップ

    4. SQL Developerで生の変数長が長すぎるエラーを回避するにはどうすればよいですか?