ホームページ  >  記事  >  データベース  >  PHP を開発するプログラマーがマスターしなければならない SQL ガイド

PHP を開発するプログラマーがマスターしなければならない SQL ガイド

怪我咯
怪我咯オリジナル
2017-04-05 11:31:451167ブラウズ

はじめに

信じられないかもしれませんが、SQL は私たちの身の回りのあらゆる場所に適用されています。あらゆる種類のデータを操作するすべてのアプリケーションは、データをどこかに保存する必要があります。ビッグ データであろうと、わずか数行のパケットであろうと、政府機関であろうと新興企業であろうと、複数のサーバーにまたがる大規模なデータベースであろうと、独自の小さなデータベースを実行している携帯電話であろうと、SQL はどこにでもあります。

ところで、SQL とは何ですか? SQL は StructuredQueryLanguage の略で、通常は「エスキューエル」と発音されます。 SQL は、データベースと通信するために特別に構築されたデータベース言語です。 SQL は、コマンドが英語の文と同様の構造を持つという点で、英語に似た単純な言語です。これらの文は宣言文に編成されるため、SQL は宣言型言語とも呼ばれます。

SQL 新手指南

SQL クエリを視覚的に作成するために利用できるツールはすでにたくさんありますが、まったく新しい言語を学ぶ必要はありません。特定の SQL ツールを使用する場合は、SQL 言語を理解し、視覚化ツールが何をしているのか、なぜそれを行うのかを理解することが重要です。場合によっては、SQL ステートメントを手動で記述することが必要になることがあります。これは、これが最も速い方法であるだけでなく、より強力で、多くの場合、意図した目的を達成する唯一の方法であるためです。

データベースの概要

SQL はデータベース言語であると先ほど述べました。では、データベースとは何でしょうか?データベースは、保存された情報とその操作にアクセスするために設計されたストレージ メカニズムです。データベース内の情報は、テーブルと呼ばれるオブジェクトに保存されます。テーブルの名前はその一意の ID であり、列と行で構成されます。列には、列名、列のデータ型、および列のその他のプロパティが含まれます。行には、その列のレコードまたはデータが含まれます。データベース内のほとんどのテーブルには、1 対 1 または 1 対多のリレーションシップまたはリンクがあります。この種のデータベースがリレーショナル モデル データベースと呼ばれるのはこのためです。

データベース構造を説明する最も簡単な方法は、Excel スプレッドシートシートと比較することです。これらには多くの類似点があります。データベースは独立したドキュメントです。スプレッドシートのシートはテーブルであり、各シートには名前があります。列と行はデータベースと同じです。 SQL 言語は、新しいテーブルの作成、既存のテーブルの変更、データの取得、データの更新、または削除に使用されます。

たとえば、有名な映画のセリフの大規模なコレクションがあり、個別のテキスト ファイルに保存されています。たとえ慎重に整理して Excel スプレッドシートに保存したとしても、直面する問題は依然として存在します。この方法でセリフを保存すると、ムービーからすべてのセリフをすぐに取得したり、キャラクターのすべてのセリフを取得したりすることはできません。テキスト ファイルまたはスプレッドシートをデータベースに配置し、リレーションシップを含むテーブルを作成すれば、すべての問題は解決されます。リレーショナルとは実際には何を意味しますか?リレーショナル モデルは、データと、これらのデータ エンティティ間の関係を記述する方法です。この場合、関係は各行と映画のタイトルが格納されているテーブル、またはすべての文字がテーブルに格納されているテーブルとの間にあります。

以下は簡略化した処理の例です。例としてテーブルは 1 つだけあり、テーブル名は「Movie_quotes」です。これには 4 つの列があり、1 つはセリフのテキスト、1 つはセリフを言った俳優のキャラクター、1 つは映画、および年です。 8 つの映画の引用が含まれており、サンプル シートは次のようになります:

Movie_quotes
Q_TEXT Q_CHARACTER Q_MOVIE Q_YEAR
また来ます ターミネーター ターミネーター 1984
あなたの信念のなさが気になります。 ダース・ベイダー スター・ウォーズ 1977
それは罠です! アクバー提督 スター・ウォーズ 1983
確率は決して教えないでください. ハン・ソロ スター・ウォーズ 1980
をします。あるいは、しません。試しはありません。 ヨーダ スターウォーズ 1980
愚か者は愚かであるのと同じです。 Forレストガンプ フォレストガンプ 1994
My maママはいつもこう言っていました:Lもしe がチョコレートの箱のようだったら、何が手に入るか決してわかりません。 フォレスト・ガンプ フォレスト・ガンプ 1994
逃げろ、フォレスト!走れ! ジェニー・カラン フォレスト・ガンプ 1994

データベースについて議論するとき、データを保存する必要がある人々の間でムーブメントを引き起こしたまったく新しいデータベースがあり、それが NoSQL であることに言及する価値があります。これらはドキュメントベースのシステムであり、非常に人気が高まっていますが、現在でも多数の リレーショナル データベースが使用されています。 NoSQL データベースが何らかのクエリ言語を備えているとしても、それらの大部分 (ほとんどすべてが SQL の後に発明されたため) には依然として SQL との類似点があります。

4 つの基本 SQL 操作 (CRUD)

SQL コマンドはたくさんありますが、テーブルとそのデータに対して何かを実行できる一般的な SQL 操作は 4 つあります:

  • Create – データをテーブルに移入します。

  • Read – テーブルからデータをクエリします。

  • Update – テーブル内の既存のデータを変更します。

  • 削除 – テーブルからデータを削除します。

これらの基本的な SQL 操作の頭文字をとって「CRUD」という略語が形成され、すべてのデータベースが持つ必要のある 4 つの基本関数または機能の基本セットとみなされます。

基本機能を紹介することで、基本的で最も重要な SQL コマンドである `CREATE`、`INSERT`、`SELECT`、`UPDATE`、`DELETE`、および「ドロップ」。

データを作成する

まず、データベースにテーブルを作成する必要があります。新しいテーブルを作成するには「CREATE TABLE」を使用します。 `CREATE TABLE` ステートメントの簡単な構文形式は次のとおりです:

CREATE TABLE table_name
(column_1 data_type,
column_2 data_type,
column_3 data_type);

まず、`CREATE TABLE` キーワードの後に​​テーブル名が続きます。これは、SQL の単純さと英語との類似性を示す優れた例です。キーワードの後に​​は開き括弧が続き、追加のパラメータ (列名と列のデータ型) が定義され、その後に閉じ括弧が続きます。すべての SQL ステートメントは「;」で終わる必要があることに注意してください。

従うべきルールはそれほど多くありません。テーブル名と列名は文字で始まる必要があり、その後に文字、数字、またはアンダースコアを続けることができます。長さは 30 文字を超えることはできません。 SQL の予約語をテーブル名または列名として使用することは禁止されています (「select」、「create」、「insert」など)。

この例では、最も単純な列名は `TEXT`、`CHARACTER`、`MOVIE`、および `YEAR` です。ただし、問題は、これらの列名が予約語であることです。競合の可能性を避けるために、「Q_」という接頭辞を付けた列名を作成します。

データ型はデータベースによって異なりますが、ここでは最も一般的な型が使用されています:

  • `char(size)` – 固定長の文字列。括弧内のパラメータで示されます。

  • `varchar(size)` – 括弧内のパラメータで示される可変長文字列。

  • `number(size)` – 数値、括弧内のパラメータは全長を示します。

  • `date` – 日付の値。

  • `number(size, d)` – 数値、全長は `size`、小数点以下の桁は `d` で表されます。

データ型は、指定された列に格納できるデータのタイプを指定します。映画名を格納するために `Q_CHARACTER` 列が使用される場合、指定された列は `varchar` (可変長文字) データ型を持つ必要があります。映画の年を格納する列のタイプは `number` で、この例の対応する列は `Q_YEAR` です。

必要なテーブル構造の場合、テーブルを作成する最終 SQL コマンドは次のとおりです:

CREATE TABLE Movie_quotes
(‘Q_TEXT’ varchar(200),
‘Q_CHARACTER’ varchar(20),
‘Q_MOVIE’ varchar(20),
‘Q_YEAR’ number(4));

この SQL コマンドの結果は、次のような各列を持つ空のテーブルを作成します:

  • `Q_TEXT` は文字を受け入れることができます最大 200 文字の長さの文字列。

  • `Q_CHARACTER` は長さ 20 文字の文字列を受け入れることができます。

  • `Q_MOVIE` は長さ 20 文字の文字列を受け入れることができます。

  • `Q_YEAR` は 1 年間に 4 つの数字を受け入れることができます。

SQL 新手指南

接下来,用我们的电影台词数据填充这张表。有很多可用的 GUI 工具,来管理数据库中的表和数据。不过,写一个 SQL 脚本常常更快,该脚本基本上是 SQL 命令的集合,将被顺序执行。当你需要用大量数据填充表时,这种方式尤为方便。

向表插入或添加一行数据的 SQL 命令是 `INSERT`。格式如下:

INSERT INTO table_name
(column_1, column_2, ... column_n)
VALUES (value_1, value_2, ... value_n);

为了向表插入一行数据, `INSERT` 关键字跟着 `INTO` 关键字和表名。然后是列名,放在圆括号里,用逗号隔开,这是可选的,但是,指明要插入的列,以确保正确的数据插入相应的列,这是一种良好实践。最后一部分,用 `VALUES` 关键字定义了要插入的那些数据,数据列表以圆括号结束。请注意,字符串应该放在单引号里,数字不应如此。

用来填充例子中 `Movie_quotes` 表的 SQL 脚本,如下:

INSERT INTO Movie_quotes
(Q_TEXT, Q_CHARACTER, Q_MOVIE, Q_YEAR)
VALUES ('I’ll be back', 'The Terminator', 'The Terminator', 1984);
INSERT INTO Movie_quotes
(Q_TEXT, Q_CHARACTER, Q_MOVIE, Q_YEAR)
VALUES ('I find your lack of faith disturbing.', 'Darth Vader', 'Star Wars', 1977);
INSERT INTO Movie_quotes
(Q_TEXT, Q_CHARACTER, Q_MOVIE, Q_YEAR)
VALUES ('It’s a trap!', 'Admiral Ackbar', 'Star Wars', 1983);
INSERT INTO Movie_quotes
(Q_TEXT, Q_CHARACTER, Q_MOVIE, Q_YEAR)
VALUES ('Never tell me the odds.', 'Han Solo', 'Star Wars', 1980);
INSERT INTO Movie_quotes
(Q_TEXT, Q_CHARACTER, Q_MOVIE, Q_YEAR)
VALUES ('Do. Or do not. There is no try.', 'Yoda', 'Star Wars', 1980);
INSERT INTO Movie_quotes
(Q_TEXT, Q_CHARACTER, Q_MOVIE, Q_YEAR)
VALUES ('Stupid is as stupid does.', 'Forrest Gump', 'Forrest Gump', 1994);
INSERT INTO Movie_quotes
(Q_TEXT, Q_CHARACTER, Q_MOVIE, Q_YEAR)
VALUES ('My mama always said: Life was like a box of chocolates. You never know what you’re gonna get.', 'Forrest Gump', 'Forrest Gump', 1994);
INSERT INTO Movie_quotes
(Q_TEXT, Q_CHARACTER, Q_MOVIE, Q_YEAR)
VALUES ('Run, Forrest! Run!', 'Jenny Curran', 'Forrest Gump', 1994);

读取数据

数据库中有了存好的数据,现在我们可以查询数据,看看我们的表里存储了什么,我们还能用不同的方式过滤和分类数据。

`SELECT` 语句用于查询、或选择我们想从数据库中返回的数据。我们从非常简单的查询开始,但是 `SELECT` 有很多不同的选项和扩展,这为我们最终的需要提供了很大的灵活性。基本的 `SELECT` 语句的语法如下:

SELECT column_1, column_1, ... column_n
FROM table_name;

指出列名,决定了哪一列将被返回到结果里,以及按什么顺序。如果我们想选择所有的列,或我们不知道表中的确切列名,我们可以使用通配符 `*`,它将从数据库中选择所有列:

SELECT * FROM table_name;

对于本例,显示所有数据的查询,如下:

SELECT * FROM Movie_quotes;

SQL 新手指南

仅仅显示电影台词、年份的查询,如下:

SELECT Q_TEXT, Q_YEAR FROM Movie_quotes;

有时候我们不想从表中返回所有数据。当表中有大量数据、或我们在搜索匹配某些标准的特定数据时,就属于这种情况。对此,我们可以使用 `WHERE` 语句。`WHERE` 语句将过滤记录,限制从数据库中获取哪些记录、以满足具体定义的标准:

SELECT column_1, column_1, ... column_n
FROM table_name
WHERE column_name operator value;

注意,`WHERE` 语句是可选的,但是如果我们决定用到它,下面的操作符是可用的:

  • `=` – 等于。

  • `>` – 大于。

  • `<` – 小于。

  • `>=` – 大于或等于。

  • `<=` – 小于或等于。

  • `<>` – 不等于。

  • `BETWEEN` – 在两个值之间。

  • `LIKE` – 搜索一种模式。

  • `IN` – 针对一个列的多种可能值。

数学操作符无需解释了。`BETWEEN` 操作符搜索两个声明值的、中间的值,包括等于两端的情况。`LIKE` 模式匹配操作符是非常强大的操作符,支持选择和我们的规定类似的行。百分号 `%` 被用做通配符,以匹配任何可能字符,它可出现在具体字符串的前面或后面。

例如,为了得到来自电影《Stars Wars》中的台词,我们可以这样写:

SELECT * FROM Movie_quotes
WHERE Q_MOVIE = ‘Star Wars’;

SQL 新手指南

请注意,`WHERE` 语句是大小写敏感的,下面的 SQL 语句将不会返回结果:

SELECT * FROM Movie_quotes
WHERE Q_MOVIE = ‘STAR WARS’;

除了 `WHERE` 子句,还可组合逻辑运算符 `AND` 和 `OR`。如果我们对相同列使用多个 `AND` 逻辑操作符,那么我们应该考虑使用 `IN` 子句替代。

做为示例,我们返回来自电影《Star Wars》和《The Terminator》中的所有电影台词:

SELECT * FROM Movie_quotes
WHERE Q_MOVIE = ‘Star Wars’ AND Q_MOVIE = ‘The Terminator’;

SQL 新手指南

就上面的例子,更好的写法就是使用 `IN` 语句替代:

SELECT * FROM Movie_quotes
WHERE Q_MOVIE IN (‘Star Wars’, ‘The Terminator’);

至此,我们一直在讨论如何从数据库中过滤数据。返回的行将按照它们进入(提交到)数据库的顺序进行排序。为了控制数据显示的顺序,我们可以通过包含 `ORDER BY` 子句来过滤输出数据。`ORDER BY` 子句包含了指定分类顺序的一个、或多个列名:

SELECT column_1, column_1, ... column_n
FROM table_name
WHERE column_name operator value
ORDER BY column_name;

为了扩展我们刚才《Star Wars》电影台词的例子,现在按照年份排序:

SELECT * FROM Movie_quotes
WHERE Q_MOVIE = ‘Star Wars’
ORDER BY Q_YEAR;

SQL 新手指南

一个列的排序,默认是按照从最低值到最高值升序排列。为了把列的排序改为降序,我们可以在列名后面加上 `DESC` 关键字:

SELECT * FROM Movie_quotes
WHERE Q_MOVIE = ‘Star Wars’
ORDER BY Q_YEAR DESC;

SQL 新手指南

`ORDER BY` 语句不限于单个列。你可以包含逗号分隔的、列的清单来排序。返回的行将根据第一个指定列,然后按顺序根据接下来指定的列排序。切记,用来排序的列不必包含在被选择列的清单里。我们可以像这样来写查询:

SELECT Q_TEXT, Q_CHARACTER, Q_MOVIE FROM Movie_quotes
WHERE Q_MOVIE = ‘Star Wars’
ORDER BY Q_YEAR DESC;

更新数据

在我们开始插入数据之后,并没有被限制为只能读取数据。我们能够对任何行里的、任何列下的、任何数据进行修改。`UPDATE` 语句用于更新或修改记录。

`UPDATE` 的语法如下:

UPDATE table_name
SET column_name = new_value
WHERE column_name operator value;

当我们使用 `UPDATE` 时,慎重地构造一个 `WHERE` 子句是十分重要的。`WHERE` 子句指定了哪一条记录或哪些记录应该被更新。如果我们在执行 `UPDATE` 语句时、而没有使用 `WHERE` 子句,我们将更新指定列的所有数据。

让我们看看 `Movie_quotes` 表里的电影台词。我们让所有的台词以标点符号结束,《The Terminator》除外。对于如何使用 `UPDATE` 语句,这是一个极好的例子:

UPDATE Movie_quotes
SET Q_TEXT = ‘I’ll be back!’
WHERE Q_MOVIE = ‘The Terminator’;

之前解释了,如果我们不小心遗漏了 `WHERE` 子句,或我们故意把所有的台词行更新为「I’ll be back!」。通过单单选中电影《The terminator》所在行,我们就可以更新指定行的一列数据。

删除数据

当数据库被大量使用时,从数据库中移除陈旧的数据,迟早会变得有必要。我们能够只删除表中的一些行、或删除整个表。

`DELETE` 语句用于删除表中的行。该命令的语法如下:

DELETE FROM table_name
WHERE column_name operator value;

重申,和 `UPDATE` 语句一样,`WHERE` 子句指定了哪一条记录或哪些记录应该被删除。如果没有指定 `WHERE` 子句,所有的行和列将被删除:

DELETE FROM Movie_quotes;

假设我们不再喜欢电影《Forrest Gump》了,想从电影中删除其台词。为了从电影中删除所有台词,我们可以编写如下 SQL 命令:

DELETE FROM Movie_quotes
WHERE Q_MOVIE = ‘Forrest Gump’;

最终,我们有了足够多的电影。我们对电影台词不再感兴趣了,我们想把兴趣移到音乐上。我们开始收集歌词。根据我们目前所学到的 SQL 知识,修改数据库是非常简单的。

首先,我们需要清空数据库里、不再感兴趣的数据。为了删除包含所有行的表,我们可以使用 `DROP TABLE` 语句。切记 `DROP TABLE` 语句不同于使用 `DELETE` 语句,和删除表里的所有记录也不同。删除表里的所有记录,会留给我们表本身及其定义的所有表结构;包括列的数据类型定义和该表的其它相关的数据库信息。`DROP TABLE` 移除了表、移除表的定义,还有所有的行。

`DROP TABLE` 语句的语法如下:

DROP TABLE table_name;

为了从数据库中删除 `Movie_quotes`,我们可以这样写:

DROP TABLE Movie_quotes;

现在我们的数据库是空的,准备接受新数据。我们从所有的 CRUD 过程开始,创建名为 `Song_Lyrics` 的新表,根据我们新收藏的歌曲,建立一个歌词数据库。

结论

本文我们浏览了涵盖 CRUD 四个基本的数据库功能:如何创建新数据、读取数据、更新我们想要修改的数据、以及最后的如何删除不想要的数据。这包含了基本的、但是最重要的 SQL 命令,比如:`CREATE TABLE`, `INSERT INTO`, `SELECT`, `UPDATE`, `DELETE` 和 `DROP`。

这些基本的 SQL 命令支持大量的数据管理,但是每个介绍到的命令都有很多选项和额外的功能,有些是本文没有介绍的,要注意这一点。总之,当 SQL 开发人员新手在开始数据库工作、以及使用一门新语言 SQL 时,本文中的基本知识应该能为他们开个好头。

以上がPHP を開発するプログラマーがマスターしなければならない SQL ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。