Heim > Datenbank > MySQL-Tutorial > Hauptteil

So fragen Sie Daten mit DQL ab

醉折花枝作酒筹
Freigeben: 2021-05-20 09:41:22
nach vorne
2435 Leute haben es durchsucht

In diesem Artikel erfahren Sie, wie Sie DQL zum Abfragen von Daten verwenden. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

So fragen Sie Daten mit DQL ab

Verwenden Sie DQL zum Abfragen von Daten.

DQL-Sprache.

DQL (Data Query Language). einfache Einzeltabellenabfrage oder sehr komplexe Abfragen und verschachtelte Abfragen von Tabellen

  • sind die Kern- und wichtigsten Anweisungen in der Datenbanksprache

    Die am häufigsten verwendeten Anweisungen
  • SELECT-Syntax
  • 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}];
        --  指定查询的记录从哪条至哪条
    Nach dem Login kopieren
  • Hinweis: [ ]-Klammern stehen für optionale, { }-Klammern Stellen Sie die obligatorische

  • -angegebene Abfragefelde dar, die als alias

    -funktion die Klausel anliegt:

kann der Datenspalte einen neuen Alias ​​geben Sie können die berechneten oder zusammengefassten Ergebnisse durch einen anderen neuen Namen ersetzen gleich), gibt nur eine

-- 查询表中所有的数据列结果 , 采用 **" \* "** 符号; 但是效率低,不推荐 .

-- 查询所有学生信息
SELECT * FROM student;

-- 查询指定列(学号 , 姓名)
SELECT studentno,studentname FROM student;
Nach dem Login kopieren
Spalte mit Ausdrücken zurück

Ausdrücke in der Datenbank: im Allgemeinen bestehend aus Textwerten, Spaltenwerten, NULL, Funktionen und Operatoren usw.

Anwendungsszenarien:

SELECT-Anweisung Verwenden Sie
  • in ORDER BY- und HAVING-Klauseln in der zurückgegebenen Ergebnisspalte. Verwenden Sie
  • where in bedingten Anweisungen
  • -- 这里是为列取别名(当然as关键词可以省略)
    SELECT studentno AS 学号,studentname AS 姓名 FROM student;
    
    -- 使用as也可以为表取别名
    SELECT studentno AS 学号,studentname AS 姓名 FROM student AS s;
    
    -- 使用as,为查询结果取一个新名字
    -- CONCAT()函数拼接字符串
    SELECT CONCAT('姓名:',studentname) AS 新姓名 FROM student;
    Nach dem Login kopieren

, um SQL-Rückgabeergebnisse zu vermeiden Klammern beeinträchtigen die Entwicklung von Sprachprogrammen.

wobei bedingte Anweisungen

Funktion: Wird zum Abrufen qualifizierter Datensätze in der Datentabelle verwendet

Suchbedingungen können aus einem oder mehreren logischen Ausdrücken bestehen. Das Ergebnis ist im Allgemeinen wahr oder falsch .

Logische Operatoren
  • Test
  • -- # 查看哪些同学参加了考试(学号)  去除重复项
    SELECT * FROM result; -- 查看考试成绩
    SELECT studentno FROM result; --  查看哪些同学参加了考试
    SELECT DISTINCT studentno FROM result; -- 了解:DISTINCT 去除重复项 , (默认是ALL)
    Nach dem Login kopieren

    Fuzzy-Abfrage: Vergleichsoperatoren

  • Hinweis: Arithmetische Operationen können nur zwischen Datensätzen von
  • numerischen Datentypen durchgeführt werden;

    Nur Daten von derselbe Datentyp kann verglichen werden;

Test:

-- selcet查询中可以使用表达式
SELECT @@auto_increment_increment; -- 查询自增步长
SELECT VERSION(); -- 查询版本号
SELECT 100*3-1 AS 计算结果; -- 表达式

-- 学员考试成绩集体提分一分查看
SELECT studentno,StudentResult+1 AS '提分后' FROM result;
Nach dem Login kopieren

Verbindungsabfrage

JOIN-Vergleich

Sieben Arten von Join:

Test

-- 满足条件的查询(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;
Nach dem Login kopieren
Selbstverbindung ion

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

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

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

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

-- 查询姓名中含有 嘉 字的
SELECT studentno,studentname FROM student
WHERE studentname LIKE &#39;%嘉%&#39;;

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

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

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

-- =============================================
-- 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=&#39;&#39; OR Address IS NULL;
Nach dem Login kopieren

Sortieren und Paging

    Test
  • /*
    连接查询
        如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询
    内连接 inner join
        查询两个表中的结果集中的交集
    外连接 outer join
        左外连接 left join
            (以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充)
        右外连接 right join
            (以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充)
            
    等值连接和非等值连接
    
    自连接
    */
    
    -- 查询参加了考试的同学信息(学号,学生姓名,科目编号,分数)
    SELECT * FROM student;
    SELECT * FROM result;
    
    /*思路:
    (1):分析需求,确定查询的列来源于两个类,student  result,连接查询
    (2):确定使用哪种连接查询?(内连接)
    */
    SELECT s.studentno,studentname,subjectno,StudentResult
    FROM student s
    INNER JOIN result r
    ON r.studentno = s.studentno
    
    -- 右连接(也可实现)
    SELECT s.studentno,studentname,subjectno,StudentResult
    FROM student s
    RIGHT JOIN result r
    ON r.studentno = s.studentno
    
    -- 等值连接
    SELECT s.studentno,studentname,subjectno,StudentResult
    FROM student s , result r
    WHERE r.studentno = s.studentno
    
    -- 左连接 (查询了所有同学,不考试的也会查出来)
    SELECT s.studentno,studentname,subjectno,StudentResult
    FROM student s
    LEFT JOIN result r
    ON r.studentno = s.studentno
    
    -- 查一下缺考的同学(左连接应用场景)
    SELECT s.studentno,studentname,subjectno,StudentResult
    FROM student s
    LEFT JOIN result r
    ON r.studentno = s.studentno
    WHERE StudentResult IS NULL
    
    -- 思考题:查询参加了考试的同学信息(学号,学生姓名,科目名,分数)
    SELECT s.studentno,studentname,subjectname,StudentResult
    FROM student s
    INNER JOIN result r
    ON r.studentno = s.studentno
    INNER JOIN `subject` sub
    ON sub.subjectno = r.subjectno
    Nach dem Login kopieren

    Unterabfrage

    /*
    自连接
        数据表与自身进行连接
    
    需求:从一个包含栏目ID , 栏目名称和父栏目ID的表中
         查询父栏目名称和其他子栏目名称
    */
    
    -- 创建一个表
    CREATE TABLE `category` (
      `categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT &#39;主题id&#39;,
      `pid` INT(10) NOT NULL COMMENT &#39;父id&#39;,
      `categoryName` VARCHAR(50) NOT NULL COMMENT &#39;主题名字&#39;,
      PRIMARY KEY (`categoryid`)
    ) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
    
    -- 插入数据
    INSERT INTO `category` (`categoryid`, `pid`, `categoryName`)
    VALUES(&#39;2&#39;,&#39;1&#39;,&#39;信息技术&#39;),
    (&#39;3&#39;,&#39;1&#39;,&#39;软件开发&#39;),
    (&#39;4&#39;,&#39;3&#39;,&#39;数据库&#39;),
    (&#39;5&#39;,&#39;1&#39;,&#39;美术设计&#39;),
    (&#39;6&#39;,&#39;3&#39;,&#39;web开发&#39;),
    (&#39;7&#39;,&#39;5&#39;,&#39;ps技术&#39;),
    (&#39;8&#39;,&#39;2&#39;,&#39;办公信息&#39;);
    
    -- 编写SQL语句,将栏目的父子关系呈现出来 (父栏目名称,子栏目名称)
    -- 核心思想:把一张表看成两张一模一样的表,然后将这两张表连接查询(自连接)
    SELECT a.categoryName AS &#39;父栏目&#39;,b.categoryName AS &#39;子栏目&#39;
    FROM category AS a,category AS b
    WHERE a.`categoryid`=b.`pid`
    
    -- 思考题:查询参加了考试的同学信息(学号,学生姓名,科目名,分数)
    SELECT s.studentno,studentname,subjectname,StudentResult
    FROM student s
    INNER JOIN result r
    ON r.studentno = s.studentno
    INNER JOIN `subject` sub
    ON sub.subjectno = r.subjectno
    
    -- 查询学员及所属的年级(学号,学生姓名,年级名)
    SELECT studentno AS 学号,studentname AS 学生姓名,gradename AS 年级名称
    FROM student s
    INNER JOIN grade g
    ON s.`GradeId` = g.`GradeID`
    
    -- 查询科目及所属的年级(科目名称,年级名称)
    SELECT subjectname AS 科目名称,gradename AS 年级名称
    FROM SUBJECT sub
    INNER JOIN grade g
    ON sub.gradeid = g.gradeid
    
    -- 查询 数据库结构-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=&#39;数据库结构-1&#39;
    Nach dem Login kopieren
    Verwandte Empfehlungen: „
  • MySQL-Tutorial

Das obige ist der detaillierte Inhalt vonSo fragen Sie Daten mit DQL ab. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage