MySQLのDQL

DQL(データクエリ言語データクエリ言語)

これは、SQL言語の一つです。

基本的な構文:

/*
SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
    [left | right | inner join table_name2]  #联合查询
    [WHERE ...]  #指定结果需满足的条件
    [GROUP BY ...]  #指定结果按照哪几个字段来分组
    [HAVING]  #过滤分组的记录必须满足的次要条件
    [ORDER BY ...]  #指定查询记录按一个或多个条件排序
    [LIMIT {[offset,]row_count | row_countOFFSET offset}];
    # 指定查询的记录从哪条至哪条
*/

注:[]オプションを表し、{}必要を表します

SELECTクエリ

  • クエリフィールドを指定します

  • クエリテーブルの結果は、クエリ結果のデータ列が、低効率を指定することができた場合、推奨されません

SELECT * FROM student;   ##查询所有学生

SELECT studentno,studentname FROM student;  # 查询指定列(学号 , 姓名)

なので

  • 別名として句

  • 効果でAS句:

    • それはかもしれ列データが新しいエイリアスをフェッチ
    • あなたは与えることができ、テーブルを新しいエイリアスに
    • 結果は、別の新しい名前に置き換えて計算または要約することができます
# 这里是为列取别名(当然as关键词可以省略)
SELECT studentno AS 学号,studentname AS 姓名 FROM student;

# 使用as也可以为表取别名
SELECT studentno AS 学号,studentname AS 姓名 FROM student AS s;

# 使用as,为查询结果取一个新名字
SELECT studentname AS 新姓名 FROM student;

CONCAT()

  • 文字列の連結機能
# CONCAT()函数拼接字符串  这里输出结果为 姓名:**
SELECT CONCAT('姓名:',studentname) AS 新姓名 FROM student;

DISTINCTキーワード

  • 処置:重複するレコード(リターンすべての列が同じ値である)を除去するために返されたSELECTクエリの結果、およびリターンのみ
# 查看有成绩的学生(去除重复项)
SELECT * FROM result; # 查看考试成绩
SELECT studentno FROM result; # 查看哪些同学参加了考试
SELECT DISTINCT studentno FROM result;
# 了解:DISTINCT 去除重复项 , (默认是ALL)

式列を使用します

発現データベース:通常のテキスト値、カラム値、NULL、関数、および演算子およびその他のコンポーネント

シナリオ:

  • SELECT文では、使用して結果列を返します
  • SELECTステートメントのORDER BY、HAVING、などの使用句
  • 条件文は式を使用してDML文
# selcet查询中可以使用表达式
SELECT @@auto_increment_increment; # 查询自增步长
SELECT VERSION(); #查询版本号
SELECT 100*3-1 AS 计算结果; # 表达式

# 学员考试成绩集体提分一分查看
SELECT studentno,StudentResult+1 AS '提分后' FROM result;
  • 避けSQL言語プログラムの開発を妨げるなど、 『*』、「」結果が含まれている返すとブラケット。

条件文

  • テーブル内のデータを取得するために一致するレコードを
  • 検索条件は、結果は通常、真または偽である、一つ以上の論理式で構成することができます。
  • 組成検索条件

論理演算子:

演算子名 文法 説明
AND或&& AとBの或&& bの そしてロジックは、同じ結果が真真であります
OR或|| OR B或|| B または論理は、限り、いずれかに該当するとして、結果は真であります
またはNOT! NOT或!A 元の値がtrueの場合は非論理は、結果が偽であります
# 满足条件的查询(where)
SELECT Studentno,StudentResult FROM result;
# 查询考试成绩在95-100之间的
SELECT Studentno,StudentResult 
FROM result
WHERE StudentResult>=95 AND StudentResult<=100;
# AND也可以写成 &&
SELECT Studentno,StudentResult 
FROM result
WHERE StudentResult>=95 && StudentResult<=100;
# 模糊查询(对应的词:精确查询)
SELECT Studentno,StudentResult 
FROM result
WHERE StudentResult BETWEEN 95 AND 100;
# 除了1000号同学,要其他同学的成绩
SELECT studentno,studentresult
FROM result
WHERE studentno!=1000;

# 使用NOT
SELECT studentno,studentresult
FROM result
WHERE NOT studentno=1000;

比較演算子:

演算子名 文法 説明
無効である IS NULL NULLの場合、結果は真であります
IS NOT NULL されていないNULL NULLでない場合、結果は真であります
BETWEEN ... AND BとCの間 BとCの間の範囲場合、結果は真であります
お気に入り LIKE B SQLパターンマッチングは、マッチB場合、結果は真であります
IN(A1、A2、A3、...) Aが、A2であれば、... A3はA1のいずれかで、結果は真であります
  • 注意:
  • 記録の数値データ・タイプの間で算術演算を実行します。
  • これは、同じデータ型の間で比較することができます。

ファジィクエリ

#模糊查询 between and \ like \ in \ null

#=============================================
# LIKE
#=============================================
#查询姓李的同学的学号及姓名
#like结合使用的通配符 : % (代表0到任意个字符)  _ (一个字符)
SELECT studentno,studentname FROM student
WHERE studentname LIKE '李%';

#查询姓李的同学,后面只有一个字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '李_';

#查询姓李的同学,后面只有两个字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '李__';

#查询姓名中含有 文 字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE '%文%';

#查询姓名中含有特殊字符的需要使用转义符号 '\'
#自定义转义符关键字:  ESCAPE ':'

#=============================================
# IN
#=============================================
#查询学号为1000,1001,1002的学生姓名
SELECT studentno,studentname FROM student
WHERE studentno IN (1000,1001,1002);

#查询地址在北京,南京,河南洛阳的学生
SELECT studentno,studentname,address FROM student
WHERE address IN ('北京','南京','河南洛阳');

#=============================================
# NULL 空
#=============================================
#查询出生日期没有填写的同学
#不能直接写=NULL , 这是代表错误的 , 用 is null 
SELECT studentname FROM student
WHERE BornDate IS NULL;

#查询出生日期填写的同学
SELECT studentname FROM student
WHERE BornDate IS NOT NULL;

#查询没有写家庭住址的同学(空字符串不等于null)
SELECT studentname FROM student
WHERE Address='' OR Address IS NULL;

クエリに参加

登録しよう

演算子名 説明
INNER JOINは(JOIN) 少なくとも一つのマッチングテーブルの場合、戻りライン
左結合します 右の表が一致しない場合であっても、それは左のテーブルからすべての行を返します。
RIGHT JOINを 左の表が一致しない場合であっても、それは右の表からすべての行を返します。
FULL OUTER JOINは すべての行が返され、左右のテーブル。テーブルの他のデータテーブルの行は、行と一致しない場合、そのデータは、反対NULLで置換されています
... ...

ここに画像を挿入説明
注:ON 2つのテーブルの後ろの共通分母であります

インナーは、JOIN

SELECT <select_list> 
FROM Table_A A
INNER JOIN Table_B B
ON A.Key = B.Key

左結合します

SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key

右のJOIN

SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key

FULL外部結合します

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key

左除く登録しよう

SELECT <select_list> 
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL

右除く登録しよう

SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL

外側除く登録しよう

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL OR B.Key IS NULL

接続以来

接続するので、接続の利用ですが、彼が使用するには、2つのテーブルなど、テーブルの本質があるので、それは、接続のタイプではありません。

私たちは、テーブルの別名を定義する必要がありますので情報は、自身(自己接続)に接続する必要が時々mysqlのクエリ。

並べ替えとページング

シーケンス

  • 構文:ORDER BY
    • ORDER BY文は、指定した列に基づいて結果セットをソートします。
    • 句のデフォルトBY ORDER ASC昇順でレコードをソートします。
    • あなたが降順でレコードをソートしたい場合は、使用することができDESCのキーワードを。
# 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩)
# 按成绩降序排序
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY StudentResult DESC , studentno

ページング

  • 構文:

    • テーブルLIMIT [オフセット、]行SELECT * FROM | 行がオフセットOFFSET
    • 利点:(ユーザーエクスペリエンス、ネットワーク伝送、クエリ圧力)
  • 派生:
    最初:限界0,5
    2ページ:限界5,5
    、3ページ目:限界10,5
    ...
    P N:限界(-pageNoではない1)* pageSzie、pageSzie
    [PAGENOではない:ページ、pageSizeを単一ページの数を表示]

# 每页显示5条数据
SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='数据库结构-1'
ORDER BY StudentResult DESC , studentno
LIMIT 0,5

演習:

JAVAは10得点、80より大きいスコア最初の学年の前に学生情報照会(学生番号、名前、コース名、スコア)

SELECT s.studentno,studentname,subjectname,StudentResult
FROM student s
INNER JOIN result r
ON r.studentno = s.studentno
INNER JOIN `subject` sub
ON r.subjectno = sub.subjectno
WHERE subjectname='JAVA第一学年'
ORDER BY StudentResult DESC
LIMIT 0,10

サブクエリ

  • サブクエリとは何ですか?
    • WHERE条件のクエリ句、および他のネストされたクエリで
    • ネストされたクエリは、内外の方法によって解決、サブクエリの複数から構成されてもよいです。
    • サブクエリが返す結果は、一般的にINキーワードを使用することをお勧めしますので、設定されています。
# 查询 数据库结构-1 的所有考试结果(学号,科目编号,成绩),并且成绩降序排列
#方法一:使用连接查询
SELECT studentno,r.subjectno,StudentResult
FROM result r 
INNER JOIN `subject` sub
ON r.`SubjectNo`=sub.`SubjectNo`
WHERE subjectname = '数据库结构-1'
ORDER BY studentresult DESC;

#方法二:使用子查询(执行顺序:由里及外)
SELECT studentno,subjectno,StudentResult
FROM result
WHERE subjectno=(
    SELECT subjectno FROM `subject` 
    WHERE subjectname = '数据库结构-1'
)
ORDER BY studentresult DESC;

#查询课程为 高等数学-2 且分数不小于80分的学生的学号和姓名
#方法一:使用连接查询
SELECT s.studentno,studentname
FROM student s
INNER JOIN result r
ON s.`StudentNo` = r.`StudentNo`
INNER JOIN `subject` sub
ON sub.`SubjectNo` = r.`SubjectNo`
WHERE subjectname = '高等数学-2' AND StudentResult>=80

#方法二:使用连接查询+子查询
#分数不小于80分的学生的学号和姓名
SELECT r.studentno,studentname FROM student s
INNER JOIN result r ON s.`StudentNo`=r.`StudentNo`
WHERE StudentResult>=80

#在上面SQL基础上,添加需求:课程为 高等数学-2
SELECT r.studentno,studentname FROM student s
INNER JOIN result r ON s.`StudentNo`=r.`StudentNo`
WHERE StudentResult>=80 AND subjectno=(
    SELECT subjectno FROM `subject`
    WHERE subjectname = '高等数学-2'
)

#方法三:使用子查询
#分步写简单sql语句,然后将其嵌套起来
SELECT studentno,studentname FROM student WHERE studentno IN(
    SELECT studentno FROM result WHERE StudentResult>=80 AND subjectno=(
        SELECT subjectno FROM `subject` WHERE subjectname = '高等数学-2'
    )
)

公開された21元の記事 ウォンの賞賛0 ビュー119

おすすめ

転載: blog.csdn.net/qq_44776943/article/details/104421076