DQL は Data Query Language の略で、データベースからデータを取得するためのプログラミング言語です。DQL は SQL (構造化照会言語) のサブセットで、MySQL、Oracle、SQL Server などのリレーショナル データベースのクエリに使用されます。
DQL は、SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY などのさまざまなクエリ操作を提供します。これらの操作を使用すると、特定の基準に基づいて目的のデータを取得し、特定の順序で並べ替えたり、グループ化したりできます。
DQL は、複数テーブルのクエリとサブクエリもサポートしています。これにより、複数のテーブルからデータを共同で取得したり、サブクエリでネストされたクエリ ステートメントを使用して取得したりできます。
基本的なクエリ構文
select ... from ...
select [distinct] ... from ... [where ...] [group by ...] [having ...] [order by ...] [limit ...]
クエリ文の実行順序
- 最初に from 句を実行します。テーブルに基づいてクエリを実行します。
- where 句を再度実行します。条件付きフィルタリングまたは条件付きフィルタリングを実行します。
- 次に、group by 句を実行します。つまり、残りのデータに対してグループ クエリを実行します。
- グループ化後、フィルタリングするか、再度フィルタリングして、having 句を再度実行します。
- 次に、select 句を実行します。目的は、ビジネスに必要な表示フィールドを選択することです。
- 次に、order by 句を実行します。選択したフィールドを並べ替えます。
- 最後に、limit 句を実行します。ページ分割クエリを実行するか、最初の n レコードをクエリします。
データを準備する
次のクエリの構文を学習する前に、事前にいくつかのテーブルを準備し、このテーブルにデータを挿入して、その後のクエリ操作を容易にします。
student表
フィールド名 | フィールドタイプ | 説明する |
---|---|---|
シド | 文字(6) | 学籍番号 |
脱ぐ | varchar(50) | 学生の名前 |
年 | 整数 | 学生時代 |
性別 | varchar(50) | 学生の性別 |
CREATE TABLE stu (
sid CHAR(6),
sname VARCHAR(50),
age INT,
gender VARCHAR(50)
);
INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);
emp テーブル
フィールド名 | フィールドタイプ | 説明する |
---|---|---|
エンプノ | 整数 | 従業員ID |
名前 | varchar(50) | 従業員の名前 |
仕事 | varchar(50) | 従業員の仕事 |
マネージャー | 整数 | リーダー番号 |
雇われ | 日にち | 申し込み日 |
サル | 10 進数(7,2) | 月給 |
通信 | 10 進数(7,2) | ボーナス |
部門番号 | 整数 | 部品番号 |
CREATE TABLE emp(
empno INT,
ename VARCHAR(50),
job VARCHAR(50),
mgr INT,
hiredate DATE,
sal DECIMAL(7,2),
comm decimal(7,2),
deptno INT
);
INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);
dept表
フィールド名 | フィールドタイプ | 説明する |
---|---|---|
部門番号 | 整数 | 部分的なエンコード |
dname | varchar(50) | 部品名 |
ロック | varchar(50) | 一部の場所 |
CREATE TABLE dept(
deptno INT,
dname varchar(14),
loc varchar(13)
);
INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept values(20, 'RESEARCH', 'DALLAS');
INSERT INTO dept values(30, 'SALES', 'CHICAGO');
INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON');
基本的なクエリ
-
すべての列をクエリする
SELECT * FROM stu;
-
指定された列をクエリします
SELECT sid, sname, age FROM stu;
条件付きクエリ
条件付きクエリでは、クエリ時に WHERE 句を指定します。WHERE 句では次の演算子とキーワードを使用できます。
=、!=、<>、<、<=、>、>=、BETWEEN…AND、IN(set)、IS NULL、AND、OR、NOT、XOR (排他的論理和)
-
性別が女性で年齢が50歳未満のレコードをクエリします
SELECT * FROM stu WHERE gender='female' AND age<50;
-
学生番号 S_1001 または名前 liSi を使用してレコードをクエリします。
SELECT * FROM stu WHERE sid ='S_1001' OR sname='liSi';
-
学生番号 S_1001、S_1002、および S_1003 を持つレコードをクエリします
SELECT * FROM stu WHERE sid IN ('S_1001','S_1002','S_1003');
ファジークエリ
ファジー条件に従ってクエリを実行するには、LIKE 条件または REGEXP を使用できます。
好き
like は where 句の後に使用して、部分一致を示します。like の後には、通常 2 種類のワイルドカードがあります。
_ => は、任意の 1 文字と一致することを意味します。
% => は、任意の文字と一致することを意味します。
# 查询所有的姓名以s开头的学生
select * from student where sname like 's%'
# 查询所有的姓名以s开头的,且长度为5的学生
select * from student where sname like 's____'
正規表現
正規表現を使用して文字列を照合します。
モデル | 説明 |
---|---|
^ | 入力文字列の先頭と一致します。RegExp オブジェクトの Multiline プロパティが設定されている場合、^ は '\n' または '\r' の後の位置とも一致します。 |
$ | 入力文字列の末尾と一致します。RegExp オブジェクトの Multiline プロパティが設定されている場合、$ は '\n' または '\r' の前の位置にも一致します。 |
。 | 「\n」を除く任意の 1 文字と一致します。 |
[...] | キャラクターのコレクション。含まれている文字のいずれかと一致します。たとえば、「[abc]」は「plain」の「a」と一致します。 |
[^...] | 負の文字セット。含まれていない任意の文字と一致します。たとえば、「[^abc]」は「plain」の「p」と一致します。 |
\d | [0-9]、すべての数字に一致します。 |
p1|p2|p3 | p1、p2、または p3 に一致します。たとえば、「z|food」は「z」または「food」と一致します。'(z|f)ood' は、「zood」または「food」と一致します。 |
* | 直前の部分式と 0 回以上一致します。たとえば、zo* は「z」だけでなく「zoo」とも一致します。* は {0,} と同等です。 |
+ | 直前の部分式と 1 回以上一致します。たとえば、「zo+」は「zo」と「zoo」には一致しますが、「z」には一致しません。+ は {1,} と同等です。 |
{n} | は負ではない整数です。n 回正確に一致します。たとえば、「o{2}」は「Bob」の「o」とは一致しませんが、「food」の両方の「o」には一致します。 |
{n,m} | m と n は両方とも非負の整数であり、n <= m です。少なくとも n 回、最大で m 回一致します。 |
# 查询名字以l开头,以i结尾的
select * from stu where name regexp '^l|i$'
SELECT 'hello' REGEXP '^he' 结果:1 表示匹配
SELECT 'hello' REGEXP '^hh' 结果:0 表示不匹配
フィールドコントロール
重複したレコードを削除する
重複するレコード (2 行以上のレコードの系列のデータが同じ) を削除します。たとえば、emp テーブルの sal フィールドに同一のレコードがあります。emp テーブルの sal フィールドのみがクエリされると、重複レコードが存在します。重複レコードを削除したい場合は、DISTINCT を使用する必要があります。
SELECT DISTINCT sal FROM emp;
列間の計算
従業員の月給と歩合の合計を表示します。sal 列と comm 列はどちらも数値型なので追加できます。sal または comm に数値型ではないフィールドがある場合、エラーが発生します。
SELECT *,sal+comm FROM emp;
comm カラムの値が NULL になるレコードが多くあります。これは、NULL に何かを加算した結果も NULL のままであるため、決済結果が NULL として表示される場合があります。NULL を値 0 に変換する関数 IFNULL は以下で使用されます。
SELECT *,sal+IFNULL(comm,0) FROM emp;
列名にエイリアスを追加する
上記のクエリでは、列名は sal+IFNULL(comm,0) となっており、非常に見苦しいですが、この列に合計のエイリアスを付けます。
SELECT *, sal+IFNULL(comm,0) AS total FROM emp;
列に別名を付ける場合は、AS キーワードを省略できます。
SELECT *,sal+IFNULL(comm,0) total FROM emp;
結果の並べ替え
-
すべての学生レコードを年齢順に並べ替えてクエリします。
SELECT * FROM stu ORDER BY sage ASC; # 或者 SELECT * FROM stu ORDER BY sage;
-
すべての学生レコードを年齢順に並べ替えてクエリします。
SELECT * FROM stu ORDER BY age DESC;
-
すべての従業員をクエリし、月給で降順に並べ替え、月給が同じ場合は番号で昇順に並べ替えます
SELECT * FROM emp ORDER BY sal DESC,empno ASC;
集計関数
集計関数は、データの列に作用し、データの列を操作する関数です。含まれるもの: max、min、sum、count、avg、その他の一般的な関数。
- max(): 指定した列データの最大値を計算します。
- min(): 指定した列データの最小値を計算します。
- count(): 指定された列内の NULL ではないデータの数を計算します。
- sum(): 指定された列の値の合計を計算します。計算される列の型が数値型でない場合、計算結果は0になります
- avg(): 指定した列の値の平均値を計算します。計算列の型が数値型でない場合、計算結果は0になります
使用方法は次のとおりです。
最大
-- 用来计算指定列的最大值
-- 计算最高的工资
select max(sal) from emp;
分
-- 用来计算指定列的最小值
-- 计算最低的工资
select min(sal) from emp;
カウント
-- 用来统计指定列的数据的数量,注意,NULL不会被统计
-- 1. 计算emp表中有多少人有工资sal
select count(sal) from emp;
-- 2. 计算emp表中有多少行数据
select count(*) from emp;
-- count(*) : 用来统计行记录,只要有这一行就会统计,即便这一行的所有的字段值都是NULL,依然算是一个有效的行
和
-- 用来统计指定列的数据的和,注意,NULL不会被统计
-- 计算emp表中的工资的和
select sum(sal) from emp;
平均
-- 用来统计指定列的数据的平均值,注意,NULL不会被统计
-- 计算emp表中的平均工资
select avg(sal) from emp;
知らせ:
上記の要件では、従業員の平均給与を計算する必要があります。ただし、一部のデータ行では、給与 (sal) に対応する値が NULL になります。
例: テーブルには 20 行のデータがあり、2 行のデータは NULL です。次に、平均を計算するときに全員の給与を合計し、この合計を 20 ではなく 18 で割ります。集計関数は NULL 値をカウントしないためです。
この合計を NULL 行を含む全員に配布する必要がある場合は、この SQL ステートメントを変更する必要があります。
avg(ifnull(sal, 0)) を emp から選択します。
グループクエリ
クエリを実行する場合、1 つ以上のフィールドごとにグループ化できます。同じグループ フィールド値を持つ行はグループとみなされます。一般に、グループ化の意味は、各グループの数や最大値をカウントするなど、各グループのデータに対して集計された統計を実行することです。
注: クエリ フィールドに含めることができるのは、グループ化フィールドと集計関数のみです
グループ化
-- 查询每一个部门的编号以及这个部门的最高工资(sal)
select deptno, max(sal) from emp group by deptno;
-- 查询每一个工作的名字以及这个工作的人数
select job, count(*) from emp group by job;
-- 查询每一个部门、每一个工作的人数
select deptno, job, count(*) from emp group by deptno, job;
持っている
have はデータ フィルタリングの制御条件であり、where と似ていますが、where とは異なります。
-
Have はグループ化後のデータに適用され、where はグループ化前のデータに適用されます。where でフィルタリングされたデータはグループ化に参加しません。
記述方法は、having は group by の後に記述する必要があり、where は group by の前に記述する必要があることを反映しています。
-
集計関数は have の後に使用できますが、どこででも集計関数を使用することはできません。
-- 查询平均工资高于3000的部门编号及平均工资
select deptno, avg(sal) from emp group by deptno having avg(sal) > 3000;
真似する
select クエリ ステートメントは、テーブル内の条件を満たすすべてのデータをクエリします。limit キーワードを使用すると、クエリ結果の行数を制限できます。
-- 查询emp表中的第0行开始,5行的数据。
select * from emp limit 0, 5;
-- 查询emp表中从第10行开始,7行的数据。
select * from emp limit 10, 7;
制限を柔軟に使用すると、ページネーション クエリの効果を実現できます。
-- 例如: 我需要在一个页面上显示数据库中的数据,但是页面的大小有限,每一页我需要显示20条数据。
-- 第一页的数据:
select * from news limit 0, 20;
-- 第二页的数据:
select * from news limit 20, 20;
-- 第三页的数据:
select * from news limit 40, 20;
-- 往后的每一个分页的内容,只需要控制好每一次limit的起点即可。
クエリの概要
クエリ文の記述順序
選択 – から – どこから – グループ化 – 保有 – 順序付け – 制限
クエリ文の実行順序
from - where -group by - getting - select - order by-limit
[Qianfeng Education] ビッグデータ開発に関する完全なチュートリアル セット、史上最も包括的なビッグデータ学習ビデオ