SQLを始めよう!

### laravelとSQL
・Laravelでは、SQLクエリを生成するためのビルダークラスが用意されています。ビルダークラスを使用することで、SQLクエリを手動で記述することなく、PHPコードでデータベース操作を行うことができます。ビルダークラスは、SELECT、INSERT、UPDATE、DELETEなどのSQL文を生成することができます。
また、LaravelではEloquentというORM(Object-Relational Mapping)も提供されています。ORMを使用することで、SQLを直接記述することなく、PHPのオブジェクトとしてデータベース操作を行うことができます。Eloquentは、データベースのテーブルをPHPのクラスとして表現することで、テーブル操作を簡単に行うことができます。Eloquentを使用することで、SQLに比べて柔軟性が高く、コードの可読性も向上するといったメリットがあります。

・どちらで方法で書くべきか？
Eloquent ORM は、Laravel フレームワークのデフォルトの ORM であり、モデルを使用してデータベーステーブルを操作することができます。そのため、Eloquent モデルを使用することで、SQL クエリを直接書くことなく、より簡潔なコードでデータベーステーブルの操作ができます。例えば、以下のように Eloquent モデルを使用してデータベーステーブルのレコードを取得することができます。
一方、直接 SQL クエリを書く場合は、DB ファサードを使用してデータベースにアクセスすることができます.
どちらの方法を使うかは、プロジェクトの要件や開発者の好みによって異なります。(Eloquent モデルは、データベーステーブルをオブジェクトとして扱えるため、より直感的なコードが書けます。一方で、複雑な SQL クエリを書く場合には、直接 SQL クエリを書いた方がシンプルに書けることがあるため、適宜使い分けることが重要です。)
今回は、直接 SQL クエリを場合をまとめる。

---
テーブルの全件取得
```
DB::table('users')->get();
```
特定のカラムのみ取得
```
DB::table('users')->select('name', 'email')->get();
```



`WHERE句`：SELECT文の条件式を指定するための句で、指定した条件に該当する行のみを抽出できる。例、WHERE age >= 18 とすることで、18歳以上の行だけを取得できる
```
DB::table('users')->where('name', 'John')->get();
```


```
DB::table('users')
                ->where('name', 'John')
                ->orWhere('name', 'Jane')
                ->get();
```

`COUNT関数`：指定された列の行数を取得するための関数です。例えば、SELECT COUNT(*) FROM usersとすることで、usersテーブルの全行数を取得することができます。

```
DB::table('users')->count();
```

`MAX関数`：最大値の取得
```
DB::table('users')->max('votes');
```

`ORDER BY句`：SELECT文で取得する行をソートするための句であり、指定された列を昇順・降順に並べ替えられる。例えば、SELECT * FROM users ORDER BY age DESCとすることで、年齢の降順にソートしたusersテーブルを取得できる。
```
DB::table('users')->orderBy('age', 'desc')->get();
```

`AVG関数`：平均値の取得
```
DB::table('users')->avg('votes');
```

`GROUP BY句`：指定された列の値でグループ化して集計するための句で、集計関数と併用することが一般的です。例、SELECT gender, COUNT(*) FROM users GROUP BY genderとすることで、男女別のユーザー数を取得できる。
```
DB::table('users')
                ->groupBy('account_id')
                ->having('account_id', '>', 100)
                ->get();
```

`HAVING句`：GROUP BY句でグループ化した結果に対して条件式を指定するための句で、WHERE句と同様に条件に該当するグループのみを抽出できる。例えば、SELECT gender, COUNT(*) FROM users GROUP BY gender HAVING COUNT(*) > 10とすることで、ユーザー数が10人以上の性別だけを取得できる。
```
DB::table('users')
    ->select('gender', DB::raw('COUNT(*) as count'))
    ->groupBy('gender')
    ->having('count', '>', 10)
    ->get();
```
usersテーブルからデータを取得しています。select()メソッドでgenderカラムと、COUNT(*)で集計した結果を取得しています。groupBy()メソッドでgenderでグループ化し、having()メソッドでカウント結果が10以上の行だけを抽出しています。最後に、get()メソッドでクエリを実行して結果を取得します。


`JOIN句`：複数のテーブルを結合するための句であり、INNER JOIN, LEFT JOIN, RIGHT JOINなど様々な種類がある。例、SELECT * FROM users INNER JOIN orders ON users.id = orders.user_idとすることで、usersテーブルとordersテーブルをユーザーIDで結合した結果を取得することができる。
```
DB::table('users')
                ->join('orders', 'users.id', '=', 'orders.user_id')
                ->select('users.*', 'orders.price')
                ->get();
```
`INNER JOIN句`：内部結合
```
DB::table('users')
                ->join('contacts', 'users.id', '=', 'contacts.user_id')
                ->join('orders', 'users.id', '=', 'orders.user_id')
                ->select('users.*', 'contacts.phone', 'orders.price')
                ->get();
```

`LIKE`：文字列を部分一致で検索するための条件式。例、商品名が「りんご」であるレコードを検索するとき、「%りんご%」と指定することで、「りんご」が含まれる商品名を持つレコードを検索できる。
```
$keyword = 'りんご';
$products = Product::where('name', 'like', '%'.$keyword.'%')->get();
```

`BETWEEN`：指定した範囲内に該当する値を検索するための条件式。例、価格が10,000円以上20,000円未満の商品を検索するとき、「BETWEEN 10000 AND 20000」と指定することで、価格が10,000円以上20,000円未満の商品を検索できる。

```
$products = Product::whereBetween('price', [10000, 20000])->get();
```
Productは検索対象のテーブル名、priceは検索するカラム名です。whereBetweenメソッドは、指定したカラムが指定した範囲内にあるレコードを取得するメソッドです。最後に、getメソッドを使用することで、検索結果を取得します。


----作成途中-------
`IN`：複数の値に一致するレコードを検索するための条件式。例、商品カテゴリーが「フルーツ」または「野菜」であるレコードを検索するとき、「IN ('フルーツ', '野菜')」と指定することで、商品カテゴリーが「フルーツ」または「野菜」のレコードを検索できまる。
```
$items = DB::table('table_name')
            ->whereIn('column_name', ['フルーツ', '野菜'])
            ->get();
```
`ビュー`：データベース上のテーブルを参照して作成される仮想的なテーブルのこと。ビューは、SELECT文を用いて作成される。ビューを利用することで、複数のテーブルを結合して一つのテーブルとして扱ったり、必要なカラムのみを表示することができる。


`サブクエリ`：SELECT文の中に入れたSELECT文のこと。サブクエリを使うことで、複雑な検索条件を表現したり、集計した結果を条件にすることができる。

`スカラサブクエリ`：サブクエリの中で1つの値を返すように設計されたサブクエリのこと。スカラサブクエリは、比較演算子を使った条件式の右辺に使用することができまる。例えば、「SELECT COUNT(*) FROM table1」などがスカラサブクエリの例。




UNION句：複数SELECT文の結合
```
$first DB::table('users')
                ->whereNull('first_name');

$users = DB::table('users')
                ->whereNull('last_name')
                ->union($first)
                ->get();
```