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

T-SQL開発者向けのヒントを含むTOP5MySQLDelete構文

    MySQLへの道のりは、CREATE TABLEから始まり、その後にINSERTが続きます。今日は、MySQLDELETEステートメントに進んでいます。これは、MySQLUPDATEステートメントとほぼ同じくらい一般的です。

    T-SQL DELETEに精通しているため、MySQL構文を使用して生産性を高めることが目標です。これらのDELETEステートメントには小さな違いがありますが、処理できないものはありません。始めましょう。

    サンプルデータの準備

    最も一般的なニーズの1つは、MySQLの行削除タスクです。ここで検討しますが、最初に作業領域を準備する必要があります。レコードを削除するには、最初にレコードを用意する必要があります。それでは、MySQLでデータベースを構築しましょう。

    80年代のテレビシリーズに懐かしいので、サンプルデータにはマクガイバーとクォンタムリープのエピソードを使用します。データを新しいデータベースにインポートするための最終的なExcelファイルがあります。このファイルには、 Titlesという名前の2つのシートがあります およびエピソード 。両方を2つのテーブルにインポートします。

    データをインポートする前に、 tv-seriesという名前のデータベースを作成する必要があります。 タイトルと呼ばれる2つのテーブルがあります およびエピソード 。 MySQLのテーブル作成ジョブは、適切なツールを使用した基本的なものです。私はdbForgeStudiofor MySQLを使用しています。次の図1と図2は、そのツールによって表示されるデータベースのビジュアルテーブル構造を示しています。

    テーブルのスクリプトは次のとおりです。

    CREATE DATABASE IF NOT EXISTS `tv-series`;
    
    USE `tv-series`;
    
    CREATE TABLE `tv-series`.titles (
      TitleID int NOT NULL AUTO_INCREMENT,
      Title varchar(50) DEFAULT NULL,
      `From` int DEFAULT NULL,
      `To` int DEFAULT NULL,
      PRIMARY KEY (TitleID)
    )
    ENGINE = INNODB,
    AUTO_INCREMENT = 3,
    AVG_ROW_LENGTH = 8192,
    CHARACTER SET utf8mb4,
    COLLATE utf8mb4_0900_ai_ci;
    
    CREATE TABLE `tv-series`.episodes (
      EpisodeID int NOT NULL AUTO_INCREMENT,
      TitleID int DEFAULT NULL,
      EpisodeTitle varchar(100) DEFAULT NULL,
      AirDate date DEFAULT NULL,
      Synopsis text DEFAULT NULL,
      EpisodeNo int NOT NULL,
      SeasonNo int NOT NULL,
      PRIMARY KEY (EpisodeID)
    )
    ENGINE = INNODB,
    AUTO_INCREMENT = 160,
    AVG_ROW_LENGTH = 414,
    CHARACTER SET utf8mb4,
    COLLATE utf8mb4_0900_ai_ci;
    
    ALTER TABLE `tv-series`.episodes
    ADD INDEX IDX_episodes_TitleID (TitleID);
    

    データベースとテーブルを作成したら、Excelファイルからデータをインポートできます。

    ExcelファイルをMySQLにインポートするために使用した最も簡単で強力なツールは、dbForge StudioforMySQLです。特に、ターゲットテーブルの主キーとして新しい列が追加されたことに感謝します。また、自動検出の日付と時刻の形式は優れたサポートです。テキストデータ型の日付と奇妙な日付形式を手間をかけずに変換します。

    MySQL構文をT-SQLと比較するため、ExcelファイルをSQLServerの新しいデータベースにインポートすることもできます。次に、MySQLと同じデータベース名とテーブル名を使用します。

    詳細情報

    • dbForge StudioforMySQLのMySQLインポートおよびエクスポートツール

    1。 テーブルからすべてのデータを削除

    まず、最も簡単です。 エピソードをバックアップしてみましょう テーブルを作成してから、バックアップのレコードを削除します。さまざまな状況で実行する必要がある可能性のある標準のMySQLのすべての行の削除操作を実行します。

    CREATE TABLE episodes_backup AS
    SELECT * FROM episodes;
    
    DELETE FROM episodes_backup;

    ご覧のとおり、構文はT-SQLの場合と同じです。クエリはepisodes_backupのすべてのレコードを削除します テーブル。

    いくつかの注意事項:

    1. 複数の行またはすべての行を削除する必要がある場合、TRUNCATE TABLEは、WHERE句を指定しないDELETEよりも高速です。これは、MySQLとSQLServerの両方に当てはまります。
    2. MySQL Workbenchで上記のコードを実行すると、エラーコード1175がトリガーされます 。 MySQL Workbenchはデフォルトでセーフモード更新に設定されているため、許可されていません。したがって、WHERE句のないテーブルの削除または更新は許可されていません。ただし、設定でこの機能を無効にすることができます 。

    2。 MySQLでWHEREを削除

    2番目のポイントは、条件でDELETEを使用すること、つまりMySQLのselect操作からの削除についてです。このようにして、1つのステートメントで1つ以上のレコードを削除できますが、すべてではありません。たとえば、最初の行または他の特定の行を削除します。 SQLでレコードの重複を回避する方法を探している場合はどうなりますか? WHERE条件を使用することが解決策になります。

    繰り返しますが、構文はT-SQLでも同じです:

    -- Delete 1 record using an equality operator
    DELETE FROM episodes
    WHERE EpisodeID = 150;
    
    -- Delete 3 records using IN
    DELETE FROM episodes
    WHERE EpisodeID IN (151,152,153);

    ここで特別なことは何もありませんが、次のセクションは異なります。

    3。 MySQL DELETE LIMIT

    制限しますか?制限は何ですか?

    LIMITは、T-SQLのTOPと同等です。 DELETEの例を示す前に、削除するレコードをクエリしてみましょう。以下のコードを確認してください:

    SELECT * FROM episodes
    WHERE year(AirDate) = 1987
    ORDER BY SeasonNo, EpisodeNo
    LIMIT 2;

    これがあなたの限界です。図3に示すように、dbForge StudioforMySQLのカードビューのレコードは2つになります。

    それでは、それらを削除してみましょう。以下の例を見てください:

    DELETE FROM episodes
    WHERE year(AirDate) = 1987
    ORDER BY SeasonNo, EpisodeNo
    LIMIT 2;

    2つのエピソードを削除する前に、MySQLは1987年のすべてのエピソードを照会しました。次に、それらをシーズン番号とエピソード番号に分類しました。最後に、結果を2レコードに制限しました。重複する行を削除する必要がある場合にも適した方法です。これにより、削除の条件を指定し、必要なものを削除しないようにすることができます(ただし、バックアップを作成すると、データの安全性が確保されます)。

    T-SQLに相当するものはありますか?これでうまくいくと思いますか?

    DELETE TOP (2) FROM episodes
    WHERE year(AirDate) = 2020
    ORDER BY SeasonNo, EpisodeNo
    GO

    上記のコードをSQLServerManagement Studioに貼り付けると、ORDERBY句に波線が表示されます。ただし、TOPは許可されています。

    ただし、ORDER BY句を削除すると、クエリによって2つのランダムなレコードが削除されます。最後に、上記のコードは期待どおりに実行されません。

    MySQLと同じ結果を得るには、次のコードが必要です。

    DELETE FROM episodes
    WHERE EpisodeID IN
    (SELECT TOP 2 EpisodeID FROM Episodes
     WHERE YEAR(AirDate) = 1987
     ORDER BY SeasonNo, EpisodeNo)
    

    T-SQLの方がMySQLよりも少し長くなります。しかし、それだけではありません。

    4。 JOINを使用したMySQLDELETE

    レコードを削除する別の方法は、削除するレコードをフィルタリングするJOINで使用することです。多くのユーザーが定義しているように、これはMySQLの削除参加タスクです。テーブルエイリアスを使用していない場合でも、見た目は変わりません。以下の例を確認してください:

    DELETE episodes
    FROM episodes
    INNER JOIN titles ON titles.TitleID = episodes.TitleID
    WHERE titles.TitleID = 3
    AND episodes.SeasonNo = 3;
    

    これはT-SQLでも機能します。ただし、次のようなテーブルエイリアスを使用する場合:

    DELETE episodes
    FROM episodes e
    INNER JOIN titles t ON t.TitleID = e.TitleID
    WHERE t.TitleID = 3
    AND e.SeasonNo = 3;
    

    MySQLはエラーをスローします。正しい構文は次のとおりです。

    DELETE e
    FROM episodes e
    INNER JOIN titles t ON t.TitleID = e.TitleID
    WHERE t.TitleID = 3
    AND e.SeasonNo = 3;
    

    違いに注意してください!

    5。 MySQLでサブクエリを削除

    最後に、サブクエリを使用してみます。これは、削除するレコードをフィルタリングする別の方法です。すでに前の例を見ましたが、もう一度見てみましょう:

    DELETE FROM episodes
    WHERE EpisodeID IN
    (SELECT TOP 2 EpisodeID FROM Episodes
     WHERE YEAR(AirDate) = 1987
     ORDER BY SeasonNo, EpisodeNo)
    

    これは、T-SQLで完全に有効な構文です。しかし、それはMySQLで機能しますか?少し変更しましょう:

    DELETE FROM episodes
    WHERE EpisodeID IN
    (SELECT EpisodeID FROM Episodes
     WHERE YEAR(AirDate) = 1987
     ORDER BY SeasonNo, EpisodeNo
     LIMIT 2);
    

    おっと!壁にぶつかったようです。 MySQLの内容は次のとおりです:

    このバージョンのMySQLは、「LIMIT&IN / ALL / ANY/SOMEサブクエリ」をまだサポートしていません

    LIMITキーワードを削除するとどうなりますか?別のエラーが発生します:

    FROM句で更新のターゲットテーブル「エピソード」を指定することはできません。

    回避策はありますか?コードをネストされたサブクエリに変更すると、問題なく実行されます:

    DELETE FROM episodes
    WHERE EpisodeID IN
    (SELECT EpisodeID FROM (SELECT EpisodeID FROM Episodes
     WHERE YEAR(AirDate) = 1987
     ORDER BY SeasonNo, EpisodeNo
     LIMIT 5) AS T)
    

    それはそれをする必要があります。しかし、もっと賢明な例を見てみましょう:

    DELETE FROM episodes
    WHERE TitleID IN
    (SELECT TitleID FROM titles
     WHERE `From` BETWEEN 1995 AND 2000);
    

    さて、これらの例の大きな問題は何ですか?見てみましょう:

    1. MySQLは、LIMITキーワードを使用したサブクエリフィルターを使用したDELETEステートメントを受け入れません。まだです。
    2. MySQLは、それをフィルタリングするサブクエリテーブルと同じターゲットテーブルからのDELETEを受け入れません。

    [sendpulse-form id =” 13566”]

    結論

    ここまでは順調ですね。 MySQLとT-SQLのDELETE構文の比較は3つあります。将来的には、3回目の記事もお役に立てば幸いです。

    この投稿では、削除時のMySQL構文に焦点を当てました

    • すべての記録
    • WHERE句を含む1つ以上のレコード
    • LIMITを使用する
    • JOINを使用する
    • サブクエリの使用。

    MySQLの列削除タスクのパフォーマンスの方法を簡単に確認したり、条件ごとに任意の行、複数の行、および特定のレコードを削除したりできます。

    この投稿が気に入った場合は、お気に入りのソーシャルメディアプラットフォームで自由に共有してください。下記のコメントセクションでご意見をお聞かせください。


    1. OracleWHILELOOPの例

    2. PHPMyAdminでファイルサイズの制限をインポートする

    3. 合計に基づいてMySQLの十分位数を計算します

    4. RDS Postgresデータベースをpg_dumpする方法は?