SQL:SELECT 構文

データ検索

  • SELECT 構文は、指定した「列のデータ」を操作する。
SELECT <列名> AS <別列名>, ...:指定した列名に別名をつける
$ SELECT COUNT(id) AS number
  FROM entries;

日本語は、"" をつける
$ SELECT COUNT(id) AS "応募数"
  FROM entries;
SELECT DISTINCT(<列名>):重複データを除外してユニークな値として抽出する。
$ SELECT DISTINCT(pref_id)
  FROM address;
mysql> SELECT
    ->   dept_no
    -> FROM
    ->   dept_manager;
+---------+
| dept_no |
+---------+
| d001    |
| d001    |
| d002    |
| d002    |
| d003    |
| d003    |
| d004    |
| d004    |
| d004    |
| d004    |
| d005    |
| d005    |
| d006    |
| d006    |
| d006    |
| d006    |
| d007    |
| d007    |
| d008    |
| d008    |
| d009    |
| d009    |
| d009    |
| d009    |
+---------+
24 rows in set (0.02 sec)

mysql> SELECT
    ->   DISTINCT(dept_no)  ※<-ここ!!!
    -> FROM
    ->   dept_manager;
+---------+
| dept_no |
+---------+
| d001    |
| d002    |
| d003    |
| d004    |
| d005    |
| d006    |
| d007    |
| d008    |
| d009    |
+---------+

mysql> SELECT
    ->   DISTINCT(dept_no) AS uniq_dept_no
    -> FROM
    ->   dept_manager;
+--------------+
| uniq_dept_no |
+--------------+
| d001         |
| d002         |
| d003         |
| d004         |
| d005         |
| d006         |
| d007         |
| d008         |
| d009         |
+--------------+
LIMIT <行数>:指定した行数のみ取得

抽出するデータ量が、1万とか100万とかになってくると、サーバーが落ちる可能性が出てくるので、制限をかけて、操作するためのもの。

  • SELECT <列名> FROM <テーブル名> LIMIT <行数>
$ SELECT id, name
    FROM companies
     LIMIT 10;
mysql> SELECT
    ->   COUNT(emp_no)
    -> FROM
    ->   employees;
+---------------+
| COUNT(emp_no) |
+---------------+
|        300024 |  <-  30万行 データがあるって言う意味
+---------------+
1 row in set (0.45 sec)

mysql> SELECT
    ->   *
    -> FROM
    ->   employees
    -> LIMIT 10;  <- ※ここ!!! 10行 に制限している。
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  10001 | 1953-09-02 | Georgi     | Facello   | M      | 1986-06-26 |
|  10002 | 1964-06-02 | Bezalel    | Simmel    | F      | 1985-11-21 |
|  10003 | 1959-12-03 | Parto      | Bamford   | M      | 1986-08-28 |
|  10004 | 1954-05-01 | Chirstian  | Koblick   | M      | 1986-12-01 |
|  10005 | 1955-01-21 | Kyoichi    | Maliniak  | M      | 1989-09-12 |
|  10006 | 1953-04-20 | Anneke     | Preusig   | F      | 1989-06-02 |
|  10007 | 1957-05-23 | Tzvetan    | Zielinski | F      | 1989-02-10 |
|  10008 | 1958-02-19 | Saniya     | Kalloufi  | M      | 1994-09-15 |
|  10009 | 1952-04-19 | Sumant     | Peac      | F      | 1985-02-18 |
|  10010 | 1963-06-01 | Duangkaew  | Piveteau  | F      | 1989-08-24 |
+--------+------------+------------+-----------+--------+------------+
10 rows in set (0.02 sec)

WHERE <行数>:取得する 行 を指定する
  1. 「=」:指定したものと等しいものを取得する

  2. 「<>」:指定したもの と等しくないものを取得する

  3. 「>, >=」:指定したもの 「より」大きい or 「以上」 を取得する

  4. 「<, <=」:指定したもの 「より」小さい or 「以下」 を取得する

  5. IS NULL:値が、NULL のものを取得する。つまり、空のものを取得する

  6. IS NOT NULL:値が、NULL 「ではない」のものを取得する。つまり、空でないものを取得する

  7. LIKE:部分一致するレコードを取得する

    • %:0文字以上の文字列
  8. NOT LIKE:部分一致しないレコードを取得する

7, 8 は、検索の際によく使われる。

$ SELECT * 
  FROM employees 
  WHERE first_name 
  LIKE '%da%';

employees テーブルの中で、first_name に 'da' が含まれているレコードを取得する。
mysql> SELECT
    ->   *
    -> FROM
    ->   employees
    -> WHERE  ※<- ここ!!!
    ->   emp_no < 10016;  ※<- ここ!!!
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  10001 | 1953-09-02 | Georgi     | Facello   | M      | 1986-06-26 |
|  10002 | 1964-06-02 | Bezalel    | Simmel    | F      | 1985-11-21 |
|  10003 | 1959-12-03 | Parto      | Bamford   | M      | 1986-08-28 |
|  10004 | 1954-05-01 | Chirstian  | Koblick   | M      | 1986-12-01 |
|  10005 | 1955-01-21 | Kyoichi    | Maliniak  | M      | 1989-09-12 |
|  10006 | 1953-04-20 | Anneke     | Preusig   | F      | 1989-06-02 |
|  10007 | 1957-05-23 | Tzvetan    | Zielinski | F      | 1989-02-10 |
|  10008 | 1958-02-19 | Saniya     | Kalloufi  | M      | 1994-09-15 |
|  10009 | 1952-04-19 | Sumant     | Peac      | F      | 1985-02-18 |
|  10010 | 1963-06-01 | Duangkaew  | Piveteau  | F      | 1989-08-24 |
|  10011 | 1953-11-07 | Mary       | Sluis     | F      | 1990-01-22 |
|  10012 | 1960-10-04 | Patricio   | Bridgland | M      | 1992-12-18 |
|  10013 | 1963-06-07 | Eberhardt  | Terkki    | M      | 1985-10-20 |
|  10014 | 1956-02-12 | Berni      | Genin     | M      | 1987-03-11 |
|  10015 | 1959-08-19 | Guoxiang   | Nooteboom | M      | 1987-07-02 |
+--------+------------+------------+-----------+--------+------------+
15 rows in set

mysql> SELECT
    ->   *
    -> FROM
    ->   employees
    -> WHERE  ※<- ここ!!!
    ->   gender <> 'F'  ※<- ここ!!!
    -> LIMIT 10;
+--------+------------+------------+-------------+--------+------------+
| emp_no | birth_date | first_name | last_name   | gender | hire_date  |
+--------+------------+------------+-------------+--------+------------+
|  10001 | 1953-09-02 | Georgi     | Facello     | M      | 1986-06-26 |
|  10003 | 1959-12-03 | Parto      | Bamford     | M      | 1986-08-28 |
|  10004 | 1954-05-01 | Chirstian  | Koblick     | M      | 1986-12-01 |
|  10005 | 1955-01-21 | Kyoichi    | Maliniak    | M      | 1989-09-12 |
|  10008 | 1958-02-19 | Saniya     | Kalloufi    | M      | 1994-09-15 |
|  10012 | 1960-10-04 | Patricio   | Bridgland   | M      | 1992-12-18 |
|  10013 | 1963-06-07 | Eberhardt  | Terkki      | M      | 1985-10-20 |
|  10014 | 1956-02-12 | Berni      | Genin       | M      | 1987-03-11 |
|  10015 | 1959-08-19 | Guoxiang   | Nooteboom   | M      | 1987-07-02 |
|  10016 | 1961-05-02 | Kazuhito   | Cappelletti | M      | 1995-01-27 |
+--------+------------+------------+-------------+--------+------------+
10 rows in set

mysql> SELECT
    ->   *
    -> FROM
    ->   employees
    -> WHERE
    ->   first_name
    -> LIKE '%eor%'  ※<- ここ!!!
    -> LIMIT 10
    -> ;
+--------+------------+------------+----------------+--------+------------+
| emp_no | birth_date | first_name | last_name      | gender | hire_date  |
+--------+------------+------------+----------------+--------+------------+
|  10001 | 1953-09-02 | Georgi     | Facello        | M      | 1986-06-26 |
|  10055 | 1956-06-06 | Georgy     | Dredge         | M      | 1992-04-27 |
|  10909 | 1954-11-11 | Georgi     | Atchley        | M      | 1985-04-21 |
|  11029 | 1962-07-12 | Georgi     | Itzfeldt       | M      | 1992-12-27 |
|  11152 | 1962-11-13 | Georgy     | Walstra        | F      | 1988-02-18 |
|  11430 | 1957-01-23 | Georgi     | Klassen        | M      | 1996-02-27 |
|  11514 | 1963-08-17 | Georgy     | Iwayama        | M      | 1988-07-30 |
|  11788 | 1962-04-11 | Georgy     | Gopalakrishnan | M      | 1986-10-03 |
|  12157 | 1960-03-30 | Georgi     | Barinka        | M      | 1985-06-04 |
|  12591 | 1956-05-10 | Georgy     | Makrucki       | M      | 1995-09-09 |
+--------+------------+------------+----------------+--------+------------+
10 rows in set


AND, OR:複数条件を指定する
  • AND:A かつ B

  • OR:A または B

*AND式
$ SELECT *
  FROM employees
  WHERE first_name = 'Parto' AND gender = 'F';

*OR式
$ SELECT *
  FROM employees
  WHERE first_name = 'Parto' OR gender = 'F';


mysql> SELECT
    ->   *
    -> FROM
    ->   employees
    -> WHERE
    ->   birth_date = '1964-06-02'
    ->   AND gender = 'F'  <- ※ ここ!!!
    -> LIMIT 10;
+--------+------------+------------+----------------+--------+------------+
| emp_no | birth_date | first_name | last_name      | gender | hire_date  |
+--------+------------+------------+----------------+--------+------------+
|  10002 | 1964-06-02 | Bezalel    | Simmel         | F      | 1985-11-21 |
|  20735 | 1964-06-02 | Tetsushi   | Stassinopoulos | F      | 1985-05-14 |
|  20773 | 1964-06-02 | Takahiro   | Miyakawa       | F      | 1989-12-13 |
|  26531 | 1964-06-02 | Sarita     | Matzat         | F      | 1993-02-07 |
|  33718 | 1964-06-02 | Gennady    | Heiserman      | F      | 1991-12-24 |
|  45299 | 1964-06-02 | Rasikan    | Aumann         | F      | 1985-05-25 |
|  49071 | 1964-06-02 | True       | Taubenfeld     | F      | 1993-01-03 |
|  49868 | 1964-06-02 | Slavian    | Billawala      | F      | 1987-06-04 |
|  81497 | 1964-06-02 | Mohammad   | Trachtenberg   | F      | 1987-07-25 |
|  94656 | 1964-06-02 | Nikolaus   | Negoita        | F      | 1991-10-08 |
+--------+------------+------------+----------------+--------+------------+
10 rows in set
BETWEEN A AND B:A 以上 B 以下
mysql> SELECT
    ->   *
    -> FROM
    ->   employees
    -> WHERE
    ->   birth_date BETWEEN '1959-06-05'AND'1959-06-07'
    -> LIMIT 20;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  17740 | 1959-06-07 | Valeska    | Klyachko  | M      | 1998-02-18 |
|  20567 | 1959-06-05 | Etsuo      | Kroon     | M      | 1986-08-27 |
|  21888 | 1959-06-06 | Neelam     | Schaap    | M      | 1988-10-07 |
|  22231 | 1959-06-06 | Dayanand   | Willoner  | M      | 1991-11-16 |
|  28028 | 1959-06-05 | Howell     | Czap      | M      | 1986-04-03 |
|  31116 | 1959-06-05 | Vitali     | Pagter    | M      | 1988-08-12 |
|  31515 | 1959-06-06 | Masato     | Viele     | F      | 1990-07-26 |
|  31628 | 1959-06-06 | Gilbert    | Cummings  | M      | 1989-06-26 |
|  33763 | 1959-06-05 | Siamak     | Lores     | F      | 1991-05-27 |
|  33819 | 1959-06-06 | Jayson     | Kornatzky | F      | 1990-01-23 |
|  35530 | 1959-06-06 | Along      | Bauknecht | M      | 1987-07-28 |
|  36752 | 1959-06-07 | Trygve     | Spieker   | F      | 1990-03-12 |
|  36811 | 1959-06-05 | Seshu      | Rissland  | F      | 1986-07-20 |
|  37754 | 1959-06-07 | Sachin     | Langford  | F      | 1992-08-23 |
|  38709 | 1959-06-06 | Kasidit    | Luan      | M      | 1990-10-16 |
|  39021 | 1959-06-07 | Muneo      | Majewski  | F      | 1988-08-16 |
|  41078 | 1959-06-06 | Yunming    | Denna     | M      | 1994-06-16 |
|  42034 | 1959-06-05 | Basil      | Coullard  | F      | 1998-12-15 |
|  45410 | 1959-06-07 | Ishfaq     | Mitchem   | F      | 1987-05-05 |
|  45595 | 1959-06-07 | Maya       | Demizu    | M      | 1987-02-16 |
+--------+------------+------------+-----------+--------+------------+
20 rows in set
IN, NOT IN:含む、含まない
$ SELECT *
  FROM employees
  WHERE emp_no IN ('10001', '10010', '10015');


$ SELECT *
  FROM employees
  WHERE emp_no NOT IN ('10045', '10004', '10080');

IN は、OR の発展バージョン
emp_no = '10001' OR emp_no = '10010' OR emp_no = '10015';

IN の方が、OR より短く書ける

mysql> SELECT
    ->   *
    -> FROM
    ->   employees
    -> WHERE
    ->   birth_date = '1962-06-03'
    ->   OR birth_date = '1964-06-02'
    ->   OR birth_date = '1959-06-05'
    -> LIMIT 20;
+--------+------------+------------+----------------+--------+------------+
| emp_no | birth_date | first_name | last_name      | gender | hire_date  |
+--------+------------+------------+----------------+--------+------------+
|  10002 | 1964-06-02 | Bezalel    | Simmel         | F      | 1985-11-21 |
|  11511 | 1964-06-02 | Arlette    | Mikschl        | M      | 1991-09-06 |
|  19685 | 1962-06-03 | Kasturi    | Frolund        | F      | 1993-03-07 |
|  20567 | 1959-06-05 | Etsuo      | Kroon          | M      | 1986-08-27 |
|  20735 | 1964-06-02 | Tetsushi   | Stassinopoulos | F      | 1985-05-14 |
|  20773 | 1964-06-02 | Takahiro   | Miyakawa       | F      | 1989-12-13 |
|  23155 | 1962-06-03 | Kenton     | Piveteau       | M      | 1989-01-18 |
|  25760 | 1962-06-03 | Shuho      | Baaleh         | F      | 1990-11-22 |
|  26531 | 1964-06-02 | Sarita     | Matzat         | F      | 1993-02-07 |
|  28028 | 1959-06-05 | Howell     | Czap           | M      | 1986-04-03 |
|  29264 | 1964-06-02 | Seongbin   | Wroclawski     | M      | 1985-09-25 |
|  31116 | 1959-06-05 | Vitali     | Pagter         | M      | 1988-08-12 |
|  32915 | 1962-06-03 | Jianwen    | Conta          | M      | 1992-10-08 |
|  33718 | 1964-06-02 | Gennady    | Heiserman      | F      | 1991-12-24 |
|  33763 | 1959-06-05 | Siamak     | Lores          | F      | 1991-05-27 |
|  36811 | 1959-06-05 | Seshu      | Rissland       | F      | 1986-07-20 |
|  40827 | 1962-06-03 | Yinghua    | Bouloucos      | F      | 1991-04-07 |
|  42034 | 1959-06-05 | Basil      | Coullard       | F      | 1998-12-15 |
|  45299 | 1964-06-02 | Rasikan    | Aumann         | F      | 1985-05-25 |
|  49071 | 1964-06-02 | True       | Taubenfeld     | F      | 1993-01-03 |
+--------+------------+------------+----------------+--------+------------+
20 rows in set

mysql> SELECT
    ->   *
    -> FROM
    ->   employees
    -> WHERE
    ->   birth_date IN ('1959-06-05', '1962-06-03','1964-06-02')
    -> LIMIT 20;
+--------+------------+------------+----------------+--------+------------+
| emp_no | birth_date | first_name | last_name      | gender | hire_date  |
+--------+------------+------------+----------------+--------+------------+
|  10002 | 1964-06-02 | Bezalel    | Simmel         | F      | 1985-11-21 |
|  11511 | 1964-06-02 | Arlette    | Mikschl        | M      | 1991-09-06 |
|  19685 | 1962-06-03 | Kasturi    | Frolund        | F      | 1993-03-07 |
|  20567 | 1959-06-05 | Etsuo      | Kroon          | M      | 1986-08-27 |
|  20735 | 1964-06-02 | Tetsushi   | Stassinopoulos | F      | 1985-05-14 |
|  20773 | 1964-06-02 | Takahiro   | Miyakawa       | F      | 1989-12-13 |
|  23155 | 1962-06-03 | Kenton     | Piveteau       | M      | 1989-01-18 |
|  25760 | 1962-06-03 | Shuho      | Baaleh         | F      | 1990-11-22 |
|  26531 | 1964-06-02 | Sarita     | Matzat         | F      | 1993-02-07 |
|  28028 | 1959-06-05 | Howell     | Czap           | M      | 1986-04-03 |
|  29264 | 1964-06-02 | Seongbin   | Wroclawski     | M      | 1985-09-25 |
|  31116 | 1959-06-05 | Vitali     | Pagter         | M      | 1988-08-12 |
|  32915 | 1962-06-03 | Jianwen    | Conta          | M      | 1992-10-08 |
|  33718 | 1964-06-02 | Gennady    | Heiserman      | F      | 1991-12-24 |
|  33763 | 1959-06-05 | Siamak     | Lores          | F      | 1991-05-27 |
|  36811 | 1959-06-05 | Seshu      | Rissland       | F      | 1986-07-20 |
|  40827 | 1962-06-03 | Yinghua    | Bouloucos      | F      | 1991-04-07 |
|  42034 | 1959-06-05 | Basil      | Coullard       | F      | 1998-12-15 |
|  45299 | 1964-06-02 | Rasikan    | Aumann         | F      | 1985-05-25 |
|  49071 | 1964-06-02 | True       | Taubenfeld     | F      | 1993-01-03 |
+--------+------------+------------+----------------+--------+------------+
20 rows in set
ちょいと、応用

emp_no が、20,000 の人の first_name と last_name を取得する場合

mysql> SELECT
    ->   first_name, last_name
    -> FROM
    ->   employees
    -> WHERE
    ->   emp_no = '20000';
+------------+-----------+
| first_name | last_name |
+------------+-----------+
| Jenwei     | Matzke    |
+------------+-----------+
1 row in set

MySQLとSQL

MySQLは、3段階層になっている
  • Database -> Table -> Data

SQL構文

  1. 予約語/関数は、大文字で書く。

  2. 特定の予約後の後は、改行する。

    • SELECT, FROM, WHERE, GROUP BY, ORDER BY

1,2 に関してだが、書き方を統一するのが大切。

SELECT 
  name
FROM
  companies;

or

SELECT name
  FROM companies;
  • DROP DATABASE <データベース名>;

意味:そのDatabase内の全てのテーブルを削除して、そのDatabase そのものも削除する。

  • USE <データベース名>;:Database名を指定する。

  • SHOW TABLES <データベース名>;

もし、USE 構文で、Database名を指定したらSHOW TABLES;
指定したDBのテーブルを表示する。つまり、<データベース名> を省略できる。

データの型
  • INTEGER:整数
データの制約
  • NOT NULL:無記入は、ダメ!って意味


mysql>  CREATE TABLE companies
    -> (id INTEGER NOT NULL,
    -> name VARCHAR(100) NOT NULL,
    -> establishment_date DATE,
    -> PRIMARY KEY(id));
Query OK, 0 rows affected (0.15 sec)

mysql> SHOW TABLES;
+-------------------------+
| Tables_in_test_database |
+-------------------------+
| companies               |
+-------------------------+
1 row in set (0.02 sec)

mysql> SHOW COLUMNS FROM companies;
+--------------------+--------------+------+-----+---------+-------+
| Field              | Type         | Null | Key | Default | Extra |
+--------------------+--------------+------+-----+---------+-------+
| id                 | int          | NO   | PRI | NULL    |       |
| name               | varchar(100) | NO   |     | NULL    |       |
| establishment_date | date         | YES  |     | NULL    |       |
+--------------------+--------------+------+-----+---------+-------+
3 rows in set (0.06 sec)

mysql> SHOW COLUMNS FROM companies\G
*************************** 1. row ***************************
  Field: id
   Type: int
   Null: NO
    Key: PRI
Default: NULL
  Extra:
*************************** 2. row ***************************
  Field: name
   Type: varchar(100)
   Null: NO
    Key:
Default: NULL
  Extra:
*************************** 3. row ***************************
  Field: establishment_date
   Type: date
   Null: YES
    Key:
Default: NULL
  Extra:
3 rows in set (0.01 sec)


ALTER TABLE 構文:テーブルの修正
  • ALTER TABLE <テーブル名> ADD COLUMN <列の定義>;:列の追加
例:
ALTER TABLE companies 
  ADD COLUMN capital INTEGER NOT NULL;
  • ALTER TABLE <テーブル名> DROP COLUMN <列名>;:列の削除
例:
ALTER TABLE companies 
  DROP COLUMN capital;

※注意点:ALTER TABLE 構文で、削除(DROP)すると、その列に保存されていたデータも消える。見た目上だけではなく、その列に入っていたデータも消えるので注意!

INSERT 構文:データの追加。1回の実行で、1行分のみを追加するのが、通説
  • INSERT INTO <テーブル名> (列1, 列2, ...) VALUES (値1, 値2, ...);
INSERT INTO companies (id, name) 
  VALUES (1, 'Yahoo株式会社');
SELECT 構文:検索
  • SELECT 列1, 列2, ... FROM <テーブル名>;
SELECT id, name, establishment_date, 
  FROM companies;

・全ての列を出力する
SELECT * 
  FROM <テーブル名>;
UPDATE 構文:更新
  • UPDATE <テーブル名> SET <列名> = <式>;
UPDATE companies
  SET name = '任天堂株式会社';

ただし、このSQL文だと、companies テーブルの全ての name (列名)が、任天堂株式会社 に変更されてしまう。

DELETE 構文:テーブルの「行」を削除
  • DELETE FROM <テーブル名>;
mysql> SELECT * FROM companies\G
*************************** 1. row ***************************
                id: 1
              name: 任天堂株式会社
establishment_date: 1996-01-31
1 row in set (0.00 sec)

mysql> DELETE FROM companies;
Query OK, 1 row affected (0.04 sec)

mysql> SELECT * FROM companies\G
Empty set (0.01 sec)

mysql> SHOW TABLES;
+-------------------------+
| Tables_in_test_database |
+-------------------------+
| companies               |
+-------------------------+
1 row in set (0.04 sec)

Devcontainer:VSCode と Dockerコンテナを同期して、実行やデバッグをしやすくする

Devcontainer は、VSCode拡張機能

VSCodeで、「>< Remote Development」をインストールする。

Remote Developmentの設定は、「.devcontainer/devcontainer.json」で行う。

.devcontainer/devcontainer.json の中身(PHP, apache)

{
  "name": "何でも良い",
  "dockerComposeFile": [
    "../docker-compose.yml", <- 相対パスで、docker-compose.yml を指定
  ],
  "service": "コンテナ(名)を指定する",
  "workspaceFolder": "/var/www/html", <- コンテナの作業ディレクトリ
  "forwardPorts": [
    9003 <- コンテナ内からローカルに転送するポートを指定
  ],
  "extensions": [ <- PHPの拡張機能。リモート先(コンテナ内)でも使いたいものをここに追記していく。
    "作者名.拡張機能名",
    "felixfbecker.php-debug",
    "bmewburn.vscode-intelephense-client",
    "coenraads.bracket-pair-colorizer-2",
    "oderwat.indent-rainbow",
    "streetsidesoftware.code-spell-checker"
  ]
}


参考サイト

docker-compose:操作

$ docker-compose up:コンテナの作成と起動を一度に実行するコマンド
  • - dオプション:バックグランドで起動する(detach)

  • --build:イメージからビルドし直す。

$ docker-compose upは、イメージが作成されていない場合、イメージの作成からビルドされるが、イメージがあれば、起動するだけ。
ただ、例えば、Dockerfile を修正して、コンテナにも反映させたい時、--buildを付ける。

$ docker-compose ps:起動中のコンテナを表示
  • -a:停止中のコンテナも表示する
$ docker-compose logs <service名>:サービス(コンテナ名)を指定する
$ docker-compose run <service名> <コマンド>:
  • コンテナ(<service名>)を作成して <コマンド> を1度だけ実行する
$ docker-compose exec <service名> <コマンド>:
  • 起動中のコンテナで、コマンドを実行する。
$ docker-compose down:
  • upで作成したコンテナを停止、削除をする。

PHP:クラスを使ってみたpart4

/*
2. "a" を 1、"b" を 2、...、"z" を 26 として、文字列を数列に変換します。この数列を A($baseArr) とします。
3. 数列 A の隣り合う 2 つの数を足して前から順番に並べた新しい数列 A' を作り、これを新たに A とします。
このとき、A の要素の大きさが 101 を超えていた場合、その要素から 101 を引きます。
4. 数列 A の要素数が 1 になるまで 3. の手順を繰り返します。
A の要素数が 1 となったとき、残った要素の値を「二人の相性」とします。

名前の並べ方は 2 通りあります。
2 通りの方法で計算した「二人の相性」のうち[大きい方]を出力する
*/
    class MakeNewArr
    {
        public function __construct(private array $baseNameArr, private array $baseaAlphabetArr)
        {
        }
        public function makeNewArr(): array
        {
            $newArr = [];
            foreach ($this->baseNameArr as $index => $letter) {
                foreach ($this->baseaAlphabetArr as $alphabet => $number) {
                    if ($letter === $alphabet) {
                        $newArr[] = $number;
                    }
                }
            }
            $makeNewArrApostrophe = new MakeNewArrApostrophe($newArr);
            $newArrApostrophe = $makeNewArrApostrophe->makeNewArrApostrophe();
            return $newArrApostrophe;
        }
    }
    
    class MakeNewArrApostrophe
    {
        public function __construct(private array $newArr)
        {
        }
        
        public function makeNewArrApostrophe(): array
        {
            $newArrApostrophe = [];
            for ($i = 0; $i < count($this->newArr) - 1; $i++) {
                if ($this->newArr[$i] + $this->newArr[$i + 1] > 101) {
                    $newArrApostrophe[] = $this->newArr[$i] + $this->newArr[$i + 1] - 101;
                } else {
                    $newArrApostrophe[] = $this->newArr[$i] + $this->newArr[$i + 1];
                }
            }
            return $newArrApostrophe;
        }
    }
    
    class Divination
    {
        public function __construct(private array $baseNameArrPattern, private array $baseaAlphabetArr)
        {
        }
        
        public function calculateDivination(): array
        {
            $makeNewArr = new makeNewArr($this->baseNameArrPattern, $this->baseaAlphabetArr);
            $newArr = $makeNewArr->makeNewArr();
        
            $count = (int) count($newArr);
            while($count > 1) {
                $makeNewArrApostrophe = new MakeNewArrApostrophe($newArr);
                $newArr = $makeNewArrApostrophe->makeNewArrApostrophe();
                $count = count($newArr);
            }
            return $newArr;
        }
    }
    
    class Game
    {
        public function start(): int
        {
            fscanf(STDIN, "%s %s", $s, $t);
            
            $name1 = str_split($s);
            $name2 = str_split($t);
            
            $baseNameArrPattern1 = array_merge($name1, $name2);
            $baseNameArrPattern2 = array_merge($name2, $name1);
            
            $baseaAlphabetArr = [];
            foreach (range('a', 'z') as $i => $letter) {
                $baseaAlphabetArr[$letter] = $i + 1;
            }
            
            $divination1 = new Divination($baseNameArrPattern1, $baseaAlphabetArr);
            $result1 = $divination1->calculateDivination();
            
            $divination2 = new Divination($baseNameArrPattern2, $baseaAlphabetArr);
            $result2 = $divination2->calculateDivination();
            
            $result = max($result1[0], $result2[0]);
            return $result;
        }
    }

    $game = new Game();
    echo $game->start();

電気毛布は、不要だった。。。普通の布団で十分

※注意:このブログは、主にプログラミング関連を書きますが、今回のように
それとは無関係のことも書きます。

電気毛布じゃなくて、普通の毛布で十分だった()

2022/11 に暖房の節約、冬の寝ている時の寒さ対策 として、電気毛布を購入したけど、結論、不要だった。

寝ている時に、電気ONにしたが、暑すぎた笑

暖房の代わりになると聞いてたけど、要らんかった。。。

結局、暖房つけるし膝掛けとしても使いづらかった。

docker-compose.yml:書き方

  • docker-compose メリット:マルチ(複数の)コンテナ環境を同時に構築できる!

  • インデントは、半角スペース2つ分

varsion: "3" # docker compose のver を指定する。2023/5時点は、3系が最新なので、3としとけば良い。
services:    # services 以下に、コンテナの中身を定義していく
  web: #コンテナ名を指定する
    build:   # ビルドコンテキストのパスを記載する(Dockerfileの設置場所のパス)
    ports:  # docker コンテナのポートの解放
      - "8080:80"
    enviroment: # 環境変数を定義する
      APACHE_CONFDIR: /etc/apache2
  redis:  # コンテナ名を指定する
    image: "redis:alpine" # イメージを指定する
  • build:docker agent に渡す、ファイルの塊のパス。

  • ports:"ホストマシンのポート番号:コンテナのポート番号"

"8080:80"の設定は、Dockerコンテナ内の80番ポートをホストマシンの8080番ポートにマッピング(つまり、接続)することを指定します。

  • enviroment: 書き方が、2通りある

APACHE_CONFDIR: /etc/apache2
or
- APACHE_CONFDIR=/etc/apache2

~~~~~~~~~~~~~~~~

参考サイト