これは、 MariaDB / MySQLの基本事項に関する2記事シリーズの第2部です。 コマンド。先に進む前に、このトピックに関する以前の記事を参照してください。
- 初心者向けのMySQL/MariaDBの基本を学ぶ–パート1
MySQL / MariaDB初心者シリーズのこの第2部では、 SELECTによって返される行数を制限する方法を説明します。 クエリ、および特定の条件に基づいて結果セットを並べ替える方法。
さらに、レコードをグループ化し、数値フィールドで基本的な数学的操作を実行する方法を学習します。これらすべてが、有用なレポートを作成するために使用できるSQLスクリプトを作成するのに役立ちます。
前提条件
開始するには、次の手順に従ってください:
1。 employees
をダウンロードする 4で構成される6つのテーブルを含むサンプルデータベース 合計で100万件のレコード。
# wget https://launchpad.net/test-db/employees-db-1/1.0.6/+download/employees_db-full-1.0.6.tar.bz2 # tar xjf employees_db-full-1.0.6.tar.bz2 # cd employees_db
2。 MariaDBを入力します プロンプトを表示して、従業員という名前のデータベースを作成します :
# mysql -u root -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 2 Server version: 10.1.14-MariaDB MariaDB Server Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> CREATE DATABASE employees; Query OK, 1 row affected (0.00 sec)
3。 次のようにMariaDBサーバーにインポートします。
MariaDB [(none)]> source employees.sql
サンプルデータベースが読み込まれるまで1〜2分待ちます( 4M について話していることに注意してください) ここに記録します!)
4。 テーブルを一覧表示して、データベースが正しくインポートされたことを確認します。
MariaDB [employees]> USE employees; Database changed MariaDB [employees]> SHOW TABLES; +---------------------+ | Tables_in_employees | +---------------------+ | departments | | dept_emp | | dept_manager | | employees | | salaries | | titles | +---------------------+ 6 rows in set (0.02 sec)
5。 従業員で使用する特別なアカウントを作成します データベース(別のアカウント名とパスワードを自由に選択してください):
MariaDB [employees]> CREATE USER [email protected] IDENTIFIED BY 'empadminpass'; Query OK, 0 rows affected (0.03 sec) MariaDB [employees]> GRANT ALL PRIVILEGES ON employees.* to [email protected]; Query OK, 0 rows affected (0.02 sec) MariaDB [employees]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) MariaDB [employees]> exit Bye
次に、 empadminとしてログインします ユーザーをMariadbプロンプトに入力します。
# mysql -u empadmin -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 4 Server version: 10.1.14-MariaDB MariaDB Server Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> USE employees; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed
続行する前に、上の画像で概説されているすべての手順が完了していることを確認してください。
結果セットの行数の順序付けと制限
給与テーブルには、開始日と終了日を含む各従業員のすべての収入が含まれています。 emp_no=10001
の給与を表示したい場合があります 時間とともに。これは、次の質問に答えるのに役立ちます。
- 彼/彼女は昇給しましたか?
- もしそうなら、いつ?
次のクエリを実行して調べます。
MariaDB [employees]> SELECT * FROM salaries WHERE emp_no=10001 ORDER BY from_date; +--------+--------+------------+------------+ | emp_no | salary | from_date | to_date | +--------+--------+------------+------------+ | 10001 | 60117 | 1986-06-26 | 1987-06-26 | | 10001 | 62102 | 1987-06-26 | 1988-06-25 | | 10001 | 66074 | 1988-06-25 | 1989-06-25 | | 10001 | 66596 | 1989-06-25 | 1990-06-25 | | 10001 | 66961 | 1990-06-25 | 1991-06-25 | | 10001 | 71046 | 1991-06-25 | 1992-06-24 | | 10001 | 74333 | 1992-06-24 | 1993-06-24 | | 10001 | 75286 | 1993-06-24 | 1994-06-24 | | 10001 | 75994 | 1994-06-24 | 1995-06-24 | | 10001 | 76884 | 1995-06-24 | 1996-06-23 | | 10001 | 80013 | 1996-06-23 | 1997-06-23 | | 10001 | 81025 | 1997-06-23 | 1998-06-23 | | 10001 | 81097 | 1998-06-23 | 1999-06-23 | | 10001 | 84917 | 1999-06-23 | 2000-06-22 | | 10001 | 85112 | 2000-06-22 | 2001-06-22 | | 10001 | 85097 | 2001-06-22 | 2002-06-22 | | 10001 | 88958 | 2002-06-22 | 9999-01-01 | +--------+--------+------------+------------+ 17 rows in set (0.03 sec)
では、最新の5つのレイズを表示する必要がある場合はどうなりますか? ORDER BY from_date DESCを実行できます 。 DESC キーワードは、結果セットを降順で並べ替えることを示します。
さらに、 LIMIT 5 上位の5のみを返すことができます 結果セットの行:
MariaDB [employees]> SELECT * FROM salaries WHERE emp_no=10001 ORDER BY from_date DESC LIMIT 5; +--------+--------+------------+------------+ | emp_no | salary | from_date | to_date | +--------+--------+------------+------------+ | 10001 | 88958 | 2002-06-22 | 9999-01-01 | | 10001 | 85097 | 2001-06-22 | 2002-06-22 | | 10001 | 85112 | 2000-06-22 | 2001-06-22 | | 10001 | 84917 | 1999-06-23 | 2000-06-22 | | 10001 | 81097 | 1998-06-23 | 1999-06-23 | +--------+--------+------------+------------+ 5 rows in set (0.00 sec)
ORDER BYを使用することもできます 複数のフィールドがあります。たとえば、次のクエリは、従業員の生年月日に基づいて結果セットを昇順(デフォルト)で並べ替え、次に姓のアルファベット順で並べ替えます。
MariaDB [employees]> SELECT CONCAT(last_name, ', ', first_name) AS Name, gender AS Gender, hire_date AS "Hire date" FROM employees ORDER BY birth_date, last_name DESC LIMIT 10; +--------------------+--------+------------+ | Name | Gender | Hire date | +--------------------+--------+------------+ | Whitcomb, Kiyokazu | M | 1988-07-26 | | Schaad, Ronghao | M | 1988-07-10 | | Remmele, Supot | M | 1989-01-27 | | Pocchiola, Jouni | M | 1985-03-10 | | Kuzuoka, Eishiro | M | 1992-02-12 | | Decaestecker, Moni | M | 1986-10-06 | | Wiegley, Mircea | M | 1985-07-18 | | Vendrig, Sachar | M | 1985-11-04 | | Tsukuda, Cedric | F | 1993-12-12 | | Tischendorf, Percy | M | 1986-11-10 | +--------------------+--------+------------+ 10 rows in set (0.31 sec)
LIMITに関する詳細情報を表示できます ここ。
レコードのグループ化/MAX、MIN、AVG、およびROUND
前述したように、salaries
表には、各従業員の経時的な収入が含まれています。 制限に加えて 、 MAXを使用できます およびMIN 従業員の最大数と最小数を決定するためのキーワード:
MariaDB [employees]> SELECT CONCAT(last_name, ', ', first_name) AS Name, MAX(B.salary) AS "Max. salary" FROM employees A JOIN salaries B ON A.emp_no = B.emp_no WHERE A.emp_no IN (10001, 10002, 10003) GROUP BY A.emp_no; +-----------------+-------------+ | Name | Max. salary | +-----------------+-------------+ | Facello, Georgi | 88958 | | Simmel, Bezalel | 72527 | | Bamford, Parto | 43699 | +-----------------+-------------+ 3 rows in set (0.02 sec) MariaDB [employees]> SELECT CONCAT(last_name, ', ', first_name) AS Name, MIN(B.salary) AS "Min. salary" FROM employees A JOIN salaries B ON A.emp_no = B.emp_no WHERE A.emp_no IN (10001, 10002, 10003) GROUP BY A.emp_no; +-----------------+-------------+ | Name | Min. salary | +-----------------+-------------+ | Facello, Georgi | 60117 | | Simmel, Bezalel | 65828 | | Bamford, Parto | 40006 | +-----------------+-------------+ 3 rows in set (0.00 sec)
上記の結果セットに基づいて、以下のクエリが何を返すかを推測できますか?
MariaDB [employees]> SELECT CONCAT(last_name, ', ', first_name) AS Name, ROUND(AVG(B.salary), 2) AS "Avg. salary" FROM employees A JOIN salaries B ON A.emp_no = B.emp_no WHERE A.emp_no IN (10001, 10002, 10003) GROUP BY A.emp_no; +-----------------+-------------+ | Name | Avg. salary | +-----------------+-------------+ | Facello, Georgi | 75388.94 | | Simmel, Bezalel | 68854.50 | | Bamford, Parto | 43030.29 | +-----------------+-------------+ 3 rows in set (0.01 sec)
平均を返すことに同意する場合( AVG で指定) )時間の経過に伴う給与は小数点以下第2位に四捨五入されます(ラウンドで示されます)。 )、その通りです。
従業員ごとにグループ化された給与の合計を表示して、上位の 5を返す場合 、次のクエリを使用できます:
MariaDB [employees]> SELECT emp_no, SUM(salary) AS Salary FROM salaries GROUP BY emp_no ORDER BY Salary DESC LIMIT 5; +--------+---------+ | emp_no | Salary | +--------+---------+ | 109334 | 2553036 | | 43624 | 2492873 | | 66793 | 2383923 | | 237542 | 2381119 | | 47978 | 2374024 | +--------+---------+ 5 rows in set (2.22 sec)
上記のクエリでは、給与は従業員ごとにグループ化されてから、合計が実行されます。
すべてをまとめる
幸い、レポートを作成するためにクエリの後にクエリを実行する必要はありません。代わりに、一連のSQLコマンドを使用してスクリプトを作成し、必要なすべての結果セットを返すことができます。
スクリプトを実行すると、それ以上の介入なしに必要な情報が返されます。たとえば、 maxminavg.sqlという名前のファイルを作成しましょう。 現在の作業ディレクトリに次の内容が含まれています:
--Select database USE employees; --Calculate maximum salaries SELECT CONCAT(last_name, ', ', first_name) AS Name, MAX(B.salary) AS "Max. salary" FROM employees A JOIN salaries B ON A.emp_no = B.emp_no WHERE A.emp_no IN (10001, 10002, 10003) GROUP BY A.emp_no; --Calculate minimum salaries SELECT CONCAT(last_name, ', ', first_name) AS Name, MIN(B.salary) AS "Min. salary" FROM employees A JOIN salaries B ON A.emp_no = B.emp_no WHERE A.emp_no IN (10001, 10002, 10003) GROUP BY A.emp_no; --Calculate averages, round to 2 decimal places SELECT CONCAT(last_name, ', ', first_name) AS Name, ROUND(AVG(B.salary), 2) AS "Avg. salary" FROM employees A JOIN salaries B ON A.emp_no = B.emp_no WHERE A.emp_no IN (10001, 10002, 10003) GROUP BY A.emp_no;
2つのダッシュで始まる行は無視され、個々のクエリが次々に実行されます。このスクリプトは、Linuxコマンドラインから実行できます。
# mysql -u empadmin -p < maxminavg.sql Enter password: Name Max. salary Facello, Georgi 88958 Simmel, Bezalel 72527 Bamford, Parto 43699 Name Min. salary Facello, Georgi 60117 Simmel, Bezalel 65828 Bamford, Parto 40006 Name Avg. salary Facello, Georgi 75388.94 Simmel, Bezalel 68854.50 Bamford, Parto 43030.29
またはMariaDBプロンプトから:
# mysql -u empadmin -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 4 Server version: 10.1.14-MariaDB MariaDB Server Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> source maxminavg.sql Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed
概要
この記事では、 SELECT によって返される結果セットを絞り込むために、いくつかのMariaDB関数を使用する方法について説明しました。 ステートメント。定義したら、複数の個別のクエリをスクリプトに挿入して、スクリプトをより簡単に実行し、人的エラーのリスクを減らすことができます。
この記事について質問や提案がありますか?下記のコメントフォームを使用して、お気軽にご連絡ください。ご連絡をお待ちしております!