DQL ( Data Query Language) 是数据查询语言,如 Select 语句
其中 [ ] 中的内容为可选,{ } 中的内容为必填
在查询表的时候,可以指定查询结果是数据列,如果查询表中是所有数据列用 “ * ”表示。如: SELECT * FROM student; 代表查询 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,为查询结果取一个新名字 # CONCAT()函数拼接字符串 SELECT CONCAT('姓名:',studentname) AS 新姓名 FROM student;DISTINCT 关键字的作用就是去掉查询结果中重复的记录,
# 查看哪些同学参加了考试(学号)--去除重复项 SELECT * FROM result; # 查看考试成绩 SELECT studentno FROM result; # 查看哪些同学参加了考试 SELECT DISTINCT studentno FROM result; # 了解:DISTINCT 去除重复项 , (默认是ALL)应用场景 :
SELECT语句返回结果列中使用SELECT语句中的ORDER BY , HAVING等子句中使用DML语句中的where条件语句中使用表达式where 条件语句用于检索符合条件的记录,搜索条件一般由一个或多个逻辑表达式组成,结果一般为真或假。逻辑操作符如下表所示:
操作符语法描述AND 或 &&a AND b 或 a && b逻辑与,同为真结果才为真OR 或 | |a OR b 或 a || b逻辑或,只要一个为真结果就为真NOT 或 !NOT a 或 ! a逻辑非,若操作数为假,则结果为真实例 1:查询学生考试成绩在 95-100 之间的
SELECT Studentno,StudentResult FROM result WHERE StudentResult>=95 AND StudentResult<=100;实例 2:查询除了 10号 同学,其他同学的成绩
SELECT studentno,studentresult FROM result WHERE studentno!=10;比较操作符用来进行模糊查询,比较操作符如下表所示:
操作符语法描述IS NULLa IS NULL若操作符为 NULL 则结果为真IS NOT NULLa IS NOT NULL若操作符不为 NULL ,则结果为真BETWEEBa BETWEEN b AND c若 a 在范围 b 与 c 之间,则结果为真LIKEa LIKE bSQL 匹配模式,若 a 匹配 b 则结果为真INa IN (a1,a2,…)若 a 等于 a1 ,a2 其中一个,则结果为真如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询,
join 的不同用法
内连接查询的结果为两个表中结果集的交集,两个表根据共同 ID 进行逐条匹配 ,效率较高,代码演示为
/*思路: (1):分析需求,确定查询的列来源于两个表,student result,连接查询 (2):确定使用哪种连接查询?(内连接) */ SELECT s.studentno,studentname,subjectno,StudentResult FROM student s INNER JOIN result r ON r.studentno = s.studentno外连接分为左外连接,右外连接。
左外连接 left join (以左表作为基准,右边表来一一匹配,匹配不上的,返回左表的记录,右表以NULL填充)右外连接 right join (以右表作为基准,左边表来一一匹配,匹配不上的,返回右表的记录,左表以NULL填充)等值连接的时候2个表会先进行笛卡尔乘积运算,生成一个新表格,占据在电脑内存里,当表的数据量很大时,很耗内存,这种方法效率比较低,尽量不用,代码演示
SELECT s.studentno,studentname,subjectno,StudentResult FROM student s , result r WHERE r.studentno = s.studentno自连接是数据表与自身连接,实例演示:
/* 需求:从一个包含栏目ID , 栏目名称和父栏目ID的表中 查询父栏目名称和其他子栏目名称 */ # 创建一个表 CREATE TABLE `category` ( `categoryid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主题id', `pid` INT(10) NOT NULL COMMENT '父id', `categoryName` VARCHAR(50) NOT NULL COMMENT '主题名字', PRIMARY KEY (`categoryid`) ) ENGINE=INNODB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 # 插入数据 INSERT INTO `category` (`categoryid`, `pid`, `categoryName`) VALUES('2','1','信息技术'), ('3','1','软件开发'), ('4','3','数据库'), ('5','1','美术设计'), ('6','3','web开发'), ('7','5','ps技术'), ('8','2','办公信息'); # 编写SQL语句,将栏目的父子关系呈现出来 (父栏目名称,子栏目名称) # 核心思想:把一张表看成两张一模一样的表,然后将这两张表连接查询(自连接) SELECT a.categoryName AS '父栏目',b.categoryName AS '子栏目' FROM category AS a,category AS b WHERE a.`categoryid`=b.`pid`实例 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语法:SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
分页的好处是:
可以减少查询压力,减低宽带使用,提高访问速度用户体验比较好演示代码如下:
# 每页显示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='数据库结构' 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推导
推导: 第一页 : limit 0,5 第二页 : limit 5,5 第三页 : limit 10,5 ...... 第N页 : limit (pageNo-1)*pageSzie,pageSzie [pageNo:页码,pageSize:单页面显示条数]子查询 就是
在查询语句中的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;