SQL で最もよく使用されるステートメントの 1 つである SELECT ステートメントは、テーブル内のデータを選択するために使用されます。このラボでは、SELECT とそれを実際の実践に適用する方法を学びます。
始める前に、関連するデータテーブルをダウンロードし、mysql_labex という名前のデータベースを作成します (3 つのテーブル: 部門、従業員、プロジェクト)。
MySQL サービスを開始し、root としてログインします。
cd ~/project sudo service mysql start mysql -u root
create-database.sql と insert-data.sql の 2 つのファイルがあり、~/project/.
にあります。ファイルにデータをロードします。データベースを構築するには、MySQL コンソールに次のコマンドを入力する必要があります:
source ~/project/create-database.sql source ~/project/insert-data.sql
データベース操作ステートメントで最も頻繁に使用され、最も重要であると考えられているのは SELECT クエリです。これまでのラボでは、SELECT * FROM table_name; を使用しました。ステートメントをさまざまな場所に配置して、テーブル内のすべてを確認します。 SELECT は、さまざまな機能を包含するさまざまな制約のキーワードとともに使用できます。このラボでは、これらの用途について詳しく紹介します。
SELECT ステートメントの基本形式:
SELECT row name FROM table name WHERE constraint;
テーブルのすべての内容をクエリする場合は、アスタリスク * を付けて 列の名前をクエリします。これは、テーブル内のすべての列がクエリされることを表します。ほとんどの場合、従業員テーブルの名前と年齢を確認するなど、テーブルの指定された列を確認するだけで十分です。
USE mysql_labex; SELECT name,age FROM employee;
MariaDB [mysql_labex]> SELECT name,age FROM employee; +------+------+ | name | age | +------+------+ | Tom | 26 | | Jack | 24 | | Rose | 22 | | Jim | 35 | | Mary | 21 | | Alex | 26 | | Ken | 27 | | Rick | 24 | | Joe | 31 | | Mike | 23 | | Jobs | NULL | | Tony | NULL | +------+------+ 12 rows in set (0.000 sec)
SELECT ステートメントには多くの場合、より正確なクエリを実現するために使用される WHERE 制約があります。 WHERE 制約には数学的表記 (=、<、>、>=、<=) を使用できます。名前と年齢をクエリしただけなので、少し変更を加えてみましょう:
SELECT name,age FROM employee WHERE age>25; </p> <p>25 歳以上の結果をフィルタリングします:<br> </p> <pre class="brush:php;toolbar:false">MariaDB [mysql_labex]> SELECT name,age FROM employee WHERE age>25; +------+------+ | name | age | +------+------+ | Tom | 26 | | Jim | 35 | | Alex | 26 | | Ken | 27 | | Joe | 31 | +------+------+ 5 rows in set (0.000 sec)
または、Mary という名前の従業員の名前、年齢、電話番号を見つけます。
SELECT name,age,phone FROM employee WHERE name='Mary';
結果:
MariaDB [mysql_labex]> SELECT name,age,phone FROM employee WHERE name='Mary'; +------+------+--------+ | name | age | phone | +------+------+--------+ | Mary | 21 | 100101 | +------+------+--------+ 1 row in set (0.000 sec)
WHERE の後に複数の制約を指定でき、これらの条件の論理関係に基づいて、OR と AND を使用して接続できます。
フィルター - 年齢が 25 歳未満、または年齢が 30 歳以上
SELECT name,age FROM employee WHERE age<25 OR age>30;
MariaDB [mysql_labex]> SELECT name,age FROM employee WHERE age<25 OR age>30; +------+------+ | name | age | +------+------+ | Jack | 24 | | Rose | 22 | | Jim | 35 | | Mary | 21 | | Rick | 24 | | Joe | 31 | | Mike | 23 | +------+------+ 7 rows in set (0.000 sec)
フィルター - 年齢が 25 歳以上、30 歳未満
SELECT name,age FROM employee WHERE age>25 AND age<30;
25 歳と 30 歳を含める必要がある場合は、age BETWEEN 25 AND 30 を使用します。
MariaDB [mysql_labex]> SELECT name,age FROM employee WHERE age>25 AND age<30; +------+------+ | name | age | +------+------+ | Tom | 26 | | Alex | 26 | | Ken | 27 | +------+------+ 3 rows in set (0.000 sec) MariaDB [mysql_labex]> SELECT name,age FROM employee WHERE age BETWEEN 25 AND 30; +------+------+ | name | age | +------+------+ | Tom | 26 | | Alex | 26 | | Ken | 27 | +------+------+ 3 rows in set (0.000 sec)
キーワード IN と NOT IN は、特定の範囲の結果をフィルターするために使用されます。たとえば、dpt3 または dpt4:
内のユーザーを検索したいとします。
SELECT name,age,phone,in_dpt FROM employee WHERE in_dpt IN ('dpt3','dpt4');
次のコマンドのように、NOT IN の場合、dpt1 にも dpt3 にもいないユーザーが取得されます:
SELECT name,age,phone,in_dpt FROM employee WHERE in_dpt NOT IN ('dpt1','dpt3');
MariaDB [mysql_labex]> SELECT name,age,phone,in_dpt FROM employee WHERE in_dpt IN ('dpt3','dpt4'); +------+------+--------+--------+ | name | age | phone | in_dpt | +------+------+--------+--------+ | Tom | 26 | 119119 | dpt4 | | Rose | 22 | 114114 | dpt3 | | Rick | 24 | 987654 | dpt3 | | Mike | 23 | 110110 | dpt4 | | Tony | NULL | 102938 | dpt3 | +------+------+--------+--------+ 5 rows in set (0.000 sec) MariaDB [mysql_labex]> SELECT name,age,phone,in_dpt FROM employee WHERE in_dpt NOT IN ('dpt1','dpt3'); +------+------+--------+--------+ | name | age | phone | in_dpt | +------+------+--------+--------+ | Tom | 26 | 119119 | dpt4 | | Jack | 24 | 120120 | dpt2 | | Mary | 21 | 100101 | dpt2 | | Joe | 31 | 110129 | dpt2 | | Mike | 23 | 110110 | dpt4 | | Jobs | NULL | 19283 | dpt2 | +------+------+--------+--------+ 6 rows in set (0.000 sec)
キーワード LIKE は、SQL ステートメントでワイルドカードとともに使用され、ワイルドカードは不明な文字を表します。 SQL のワイルドカードは _ と % です。 _ は不特定の文字を表し、% は不定の不特定の文字を表します。
たとえば、電話番号の最初の 4 桁が 1101 であることだけを覚えていて、最後の 2 桁を忘れている場合は、それらを 2 つの _ ワイルドカードで置き換えることができます。
SELECT name,age,phone FROM employee WHERE phone LIKE '1101__';
そしてここには 1101 で始まる電話番号があります:
MariaDB [mysql_labex]> SELECT name,age,phone FROM employee WHERE phone LIKE '1101__'; +------+------+--------+ | name | age | phone | +------+------+--------+ | Joe | 31 | 110129 | | Mike | 23 | 110110 | +------+------+--------+ 2 rows in set (0.000 sec)
名前の最初の文字しか覚えておらず、名前の長さがわからない場合など、別のケースでは、不定文字の代わりに % ワイルドカードを使用します。
SELECT name,age,phone FROM employee WHERE name LIKE 'J%';
ここには J で始まる名前があります:
MariaDB [mysql_labex]> SELECT name,age,phone FROM employee WHERE name LIKE 'J%'; +------+------+--------+ | name | age | phone | +------+------+--------+ | Jack | 24 | 120120 | | Jim | 35 | 100861 | | Joe | 31 | 110129 | | Jobs | NULL | 19283 | +------+------+--------+ 4 rows in set (0.000 sec)
クエリ結果をより整理して理解しやすくするために、特定のルールに従って結果を並べ替える必要がある場合があります。 ORDER BY が便利です。デフォルトでは、ORDER BY は 昇順 配列になっており、ASC と DESC を使用すると、昇順と降順で結果を取得することもできます。注文します。
たとえば、SQL ステートメントで給与を降順に並べ替えます。
SELECT name,age,salary,phone FROM employee ORDER BY salary DESC;
MariaDB [mysql_labex]> SELECT name,age,salary,phone FROM employee ORDER BY salary DESC; +------+------+--------+--------+ | name | age | salary | phone | +------+------+--------+--------+ | Jobs | NULL | 3600 | 19283 | | Joe | 31 | 3600 | 110129 | | Ken | 27 | 3500 | 654321 | | Rick | 24 | 3500 | 987654 | | Mike | 23 | 3400 | 110110 | | Tony | NULL | 3400 | 102938 | | Alex | 26 | 3000 | 123456 | | Mary | 21 | 3000 | 100101 | | Jim | 35 | 3000 | 100861 | | Rose | 22 | 2800 | 114114 | | Jack | 24 | 2500 | 120120 | | Tom | 26 | 2500 | 119119 | +------+------+--------+--------+ 12 rows in set (0.000 sec)
SQL を使用すると、テーブル内のデータを計算できます。これに関して、SQL には SELECT の結果を処理する 5 つの組み込み関数があります。
Function: | COUNT | SUM | AVG | MAX | MIN |
---|---|---|---|---|---|
For: | count numbers | sum up | average | maximum value | minimum value |
The COUNT function can be used for any data type (because it is only a count), while SUM and AVG functions can only calculate numeric data types. MAX and MIN can be used for numeric, string, or datetime data types.
For example, when we want to calculate the maximum and minimum value of salary, we use a statement like this:
SELECT MAX(salary) AS max_salary,MIN(salary) FROM employee;
You may have noticed a tiny detail. Use AS keyword can rename value. E.g. Max value is renamed into max_salary:
MariaDB [mysql_labex]> SELECT MAX(salary) AS max_salary,MIN(salary) FROM employee; +------------+-------------+ | max_salary | MIN(salary) | +------------+-------------+ | 3600 | 2500 | +------------+-------------+ 1 row in set (0.000 sec)
The SELECT statements discussed above all involve data in only one table, but sometimes you have to process multiple tables to get the information you need. For example, you want to know a few projects done by the department where the employee named "Tom" is located. Employee information is stored in the employee table, but the project information is stored in the project table.
We can use subqueries to deal with such situations:
SELECT of_dpt,COUNT(proj_name) AS count_project FROM project WHERE of_dpt IN (SELECT in_dpt FROM employee WHERE name='Tom');
MariaDB [mysql_labex]> SELECT of_dpt,COUNT(proj_name) AS count_project FROM project -> WHERE of_dpt IN -> (SELECT in_dpt FROM employee WHERE name='Tom'); +--------+---------------+ | of_dpt | count_project | +--------+---------------+ | dpt4 | 2 | +--------+---------------+ 1 row in set (0.000 sec)
Subqueries can also be extended to three, four or more layers.
When dealing with multiple tables, the subquery is only useful when the results are from the same table. However, if you need to display data in two or more tables, you must use the join operation.
The basic idea is to connect two or more tables as a new table to operate, as follows:
SELECT id,name,people_num FROM employee,department WHERE employee.in_dpt = department.dpt_name ORDER BY id;
This result is the number of employees in each department, where employee id and name from the employee table, people_num from the department table:
MariaDB [mysql_labex]> SELECT id,name,people_num -> FROM employee,department -> WHERE employee.in_dpt = department.dpt_name -> ORDER BY id; +----+------+------------+ | id | name | people_num | +----+------+------------+ | 1 | Tom | 15 | | 2 | Jack | 12 | | 3 | Rose | 10 | | 4 | Jim | 11 | | 5 | Mary | 12 | | 6 | Alex | 11 | | 7 | Ken | 11 | | 8 | Rick | 10 | | 9 | Joe | 12 | | 10 | Mike | 15 | | 11 | Jobs | 12 | | 12 | Tony | 10 | +----+------+------------+ 12 rows in set (0.000 sec)
Another connection statement format is to use the JOIN ON syntax. The statement is the same as:
SELECT id,name,people_num FROM employee JOIN department ON employee.in_dpt = department.dpt_name ORDER BY id;
Result is the same.
In this lab we learned the basic use of SELECT statement:
? Practice Now: SQL's SELECT Statement
以上がSQL の基礎 | SELECT ステートメント |データベース管理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。