MySQLデータクエリSQL
SQLクエリステートメント:SELECT
最初にテーブルを与える
データの取得選択
単一の列を取得する
select 字段 from tbname;
# 例: select name from stu;
明確な順序規則、つまり返されるデータの順序がない場合、返されるデータの順序は特別な意味を持ちません。
データが返される順序は、データがテーブルに追加される順序である場合とそうでない場合があります。同じ番号が返される限り、それは正常です。
複数の列を取得する
select 字段1,字段2,... from tbname;
# 例: select id,name,age,sex from stu;
複数の列を選択する場合は、必ず列名の間にコンマを追加してください。ただし、最後の列名の後にコンマを追加しないでください。
最後の列名の後にコンマを追加すると、エラーが発生します。
すべての列を取得
select * from tbname;
# 例: select * from stu;
通常、ワイルドカードは使用しないでください。テーブルの各列が本当に必要な場合を除いて、*ワイルドカードは使用しないことをお勧めします。
ワイルドカードを使用して、名前が不明な列を取得します
さまざまな検査ラインの違い
select distinct 字段1,字段2... from stu;
# 例: select distinct class_id from stu;
DISTINCTキーワードは、異なる値のみを返します。列にaとbの値が多数ある場合は、aとbのみが返されます。
結果を制限するLIMIT
select * from tbname limit 3,4;
# 代表从第三行开始检索,检索四行数据
# 代替的语法: limit 4 offset 3 意为从行3开始检索四行,和上面一样
# 例: select * from stu limit 3,4;
完全修飾テーブル名を使用する
select name from stu;
select stu.name from stu;
select stu.name from demoDB.stu;
取得したデータを並べ替えるORDERBY
データの並べ替えORDERBY
select * from tbname order by 字段;
デフォルトでクエリされたデータはランダムに並べ替えられません。並べ替えルールが指定されていない場合、データは通常、基になるテーブルに表示される順序で表示されます。
リレーショナルデータベースの設計理論では、並べ替え順序が明確に指定されていない場合、取得されたデータの順序が意味があると見なされるべきではないと考えられています。
通常、ORDER BY句で使用される列は、表示用に選択された列になります。
ただし、これは必ずしも当てはまるわけではなく、取得されていない列を使用してデータを並べ替えることは完全に合法です。
複数の列で並べ替える
select * from tbname order by 字段1,字段2,...;
データの複数の列を並べ替える必要がある場合は、列名をコンマで区切り、並べ替えが前と次の順序で比較されます。デフォルトは昇順です。
select * from tbname order by 字段1(desc),字段2(desc),...;
指定した列名を昇順または降順で並べ替えます。たとえば、select * from stu order by class_id、age desc;最初にclass_idを昇順で並べ替え、次にageを降順で並べ替えます。
注意
ORDERBY句がORDERBY句の位置に指定されている場合は、from句の後に配置されていることを確認する必要があります。
LIMITを使用する場合は、ORDERBY句が完了した後に配置する必要があります。句の使用順序を間違えると、エラーメッセージが表示されます。
データ検索条件フィルターWHERE
データベースには通常、大量のデータが含まれており、テーブル内のすべての行を取得する必要はほとんどありません。
通常、特定の操作またはレポートのニーズに基づいて、テーブルデータのサブセットのみが抽出されます。
必要なデータのみを取得するには、検索条件を作成する必要があります
select 字段 from tbname where 条件;
whereとorderbyを同時に使用する場合は、whereを前面に、orderbyを背面に配置する必要があります。
WHERE句演算子
オペレーター | 説明 |
---|---|
= | 等しい |
<>、!= | 等しくない |
< | 未満 |
<= | 以下 |
>> | 以上 |
> = | 以上 |
…と…の間 | 2つの値の間で指定します |
無効です | ヌル値 |
結合されたWHERE句
MySQLでは、複数のWHERE句を指定できます。
2つの方法:ANDとORは2つの句を接続します。論理演算子とも呼ばれます。
そして
ANDはWHERE句で使用され、戻る前に満たして接続する必要があるすべての条件を取得します。それ以外の場合は空のセットを返します
select 字段 from tbname where 字段=.. and 字段=..;
# 例:
select name from stu where age = 22 and sex = 'm';
または
ORはWHERE句で使用され、or接続の条件の1つのみを取得するために使用されます。それ以外の場合は空のセットを返します
ANDとORは一緒に使用できますが、SQLの計算順序に注意する必要があります。SQLはOR演算子を処理する前にAND演算子を優先します。
例:クラス1とクラス2の女子学生にクエリを実行します。
select * from stu where class_id=1 or class_id=2 and sex='女';
このようにして、以下の状況が発生します
ANDの優先処理メカニズムにより、SQLは、クエリが必要なのはクラス2の女の子とクラス1のすべての生徒であると考えています。
解決策は次のとおりです。
select * from stu where class_id=1 and sex='女' or class_id=2 and sex='女';
# 或者
select * from stu where (class_id=1 or class_id=2) and sex='女';
括弧はおよびよりも優先されます。
ない
に
IN演算子は条件の範囲を指定するために使用され、範囲内の各条件を一致させることができます。ANDおよびORと組み合わせて使用できます
select name from stu where class_id in (1,2) and sex='女';
なぜIN演算子を使用するのですか?利点は次のとおりです。
- 有効なオプションの長いリストを使用する場合、IN演算子の構文はより明確で直感的です。
- INを使用すると、計算の順序がわかりやすくなります(演算子が少ないため)
- IN演算子は通常、OR演算子リストよりも高速です
- INの最大の利点は、他のSELECTステートメントを含めることができるため、WHERE句をより動的に作成できることです。
ない
NOT演算子は、この条件を除くすべてのデータを指定するために使用されます。
select name from stu where class_id not in (1);
ワイルドカードの使用
LIKEとワイルドカード
LIKEは、商品名にテキストaが含まれるすべての商品を検索するなどのあいまい検索に適しています。
-
%
任意の文字を表す検索のパーセント記号(%)ワイルドカードは、何度でも表示されます。select name from stu where name like 'a%'; # 表示匹配第一个字符为a的所有数据 select name from stu where name like '%a'; # 表示匹配最后一个字符为a的所有数据 select name from stu where name like '%a%'; # 表示匹配包含字符a的所有数据
-
アンダースコア(
_
)ワイルドカード文字。アンダースコアを使用する場合、1つのアンダースコアは1文字に相当します。select name from stu where name like '_a';# 表示匹配最后一个字符为a且总长度为两个字符的数据 select name from stu where name like 'a_';# 表示第一个字符为a且总长度为两个字符的数据
ワイルドカードを使用するためのヒント
- ワイルドカードを使いすぎないでください。他の演算子が同じ目的を達成できる場合は、他の演算子を使用する必要があります。
- 本当にワイルドカードを使用する必要がある場合は、「%a」など、どうしても必要な場合を除いて、最初にワイルドカードを使用しないでください。ワイルドカードを先頭に置くと、検索速度が最も遅くなります。
- ワイルドカードの位置に注意してください。
通常の正規表現
select name from stu where name regexp '[0-5]abc'; # 第一个字符为0-5,后面为abc的所有数据
MySQLの統計関数(集計関数)
収束関数の使用
多くの場合、実際にすべてを取得せずにデータを要約する必要があります。この目的のために、MySQLは特別な機能を提供します。
これらの関数を使用すると、MySQLクエリを使用して、特定のデータを取得し、レポートを分析および作成できます。
といった:
- テーブルの行数を決定します
- テーブルの列の合計を取得します。
- テーブルの列(またはすべての行、特定の行)の最大値、最小値、平均値を確認します。
関数 | 説明 |
---|---|
カウント() | 列の行数を返します |
MAX() | 列の最大値を返します |
MIN() | 列の最小値を返します |
和() | 列の値の合計を返します |
AVG() | 列の平均値を返します |
注意:
countを使用する場合、列名を指定すると、値がNULLの行は無視されますが、関数でアスタリスク(*)を使用すると、無視されません。
GROUP BY&HAVING
GROUP BY
SQL集計関数を使用して、データを要約できます。これは、行に対してテクニックを実行し、合計と平均を計算し、すべてのデータを取得せずに最大値と最小値を取得できる場所です。
これまでのところ、すべての計算は、テーブル内のすべてのデータまたは特定のWHERE句に一致するデータに対して実行されます。
しかし、グループ化を使用すると、グループ化後に再度フィルタリングする必要があります。
例:すべてのクラスの生徒数を取得する必要があります
mysql> select class_id,count(*) as nums from stu where class_id=1;
+----------+------+
| class_id | nums |
+----------+------+
| 1 | 6 |
+----------+------+
1 row in set (0.00 sec)
mysql> select class_id,count(*) as nums from stu where class_id=2;
+----------+------+
| class_id | nums |
+----------+------+
| 2 | 4 |
+----------+------+
1 row in set (0.00 sec)
2回クエリする必要があります。
しかし、学校の各クラスの生徒数を照会する必要がある場合、この方法は明らかに不適切です。どうすればよいですか。
現時点では、グループ化が必要です。SQLグループ化を使用すると、データを複数の論理グループに分割して、各グループを集計および計算(group by)することができます。
構文:select field、function(*)as column name from tbname group by field;
mysql> select class_id,count(*) as nums from stu group by class_id;
+----------+------+
| class_id | nums |
+----------+------+
| 1 | 6 |
| 2 | 4 |
+----------+------+
2 rows in set (0.00 sec)
システムが5人未満のクラスまたは5人を超えるクラスを返すようにしたい場合はどうなりますか?
上記の返された結果から再度フィルタリングする必要があります。これは、以下のHAVINGフィルターグループです。
持っている
MySQLでは、GROUP BYを使用してデータをグループ化するだけでなく、それらのグループを含むグループをフィルタリングし、それらのグループを除外することもできます。
たとえば、前述のように、システムが5人未満のクラスを返すようにします。
実際、前述のすべてのWHERE句はHAVINGに置き換えることができます。唯一の違いは、WHEREが行をフィルタリングし、HAVINGがグループをフィルタリングすることです。
構文:構文:selectフィールド、function(*)をtbnameから列名として条件を持つフィールドごとにグループ化します。
# 大于五人的班级
mysql> select class_id,count(*) as nums from stu group by class_id having nums>5;
+----------+------+
| class_id | nums |
+----------+------+
| 1 | 6 |
+----------+------+
1 row in set (0.00 sec)
# 小于五人的班级
mysql> select class_id,count(*) as nums from stu group by class_id having nums<5;
+----------+------+
| class_id | nums |
+----------+------+
| 2 | 4 |
+----------+------+
1 row in set (0.00 sec)
予防
クラス名を格納するためにフィールドclass_nameを追加する必要がある場合は、class_id、class_name、および人数をフィルター処理します。
mysql> select class_id,count(*) as '数量' from stu group by class_id;
+----------+--------+
| class_id | 数量 |
+----------+--------+
| 1 | 6 |
| 2 | 4 |
+----------+--------+
2 rows in set (0.00 sec)
-- 在select里面有class_id、class_name,group by后面只有id就会出错
mysql> select class_id,class_name,count(*) as '数量' from stu group by class_id;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'yuge.stu.class_name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
-- 正确的语句,应该是吧select所有列都作为分组条件。
mysql> select class_id,class_name,count(*) as '数量' from stu group by class_id,class_name;
+----------+------------+--------+
| class_id | class_name | 数量 |
+----------+------------+--------+
| 1 | c1 | 6 |
| 2 | c2 | 4 |
+----------+------------+--------+
2 rows in set (0.00 sec)
sql_mode = only_full_group_byと互換性がありません
-正しいステートメント。グループ化条件としてすべての列を選択する必要があります。
mysql> select class_id,class_name,count(*) as '数量' from stu group by class_id,class_name;
+----------+------------+--------+
| class_id | class_name | 数量 |
+----------+------------+--------+
| 1 | c1 | 6 |
| 2 | c2 | 4 |
+----------+------------+--------+
2 rows in set (0.00 sec)