文章目录
DQL数据查询语言
DQL是用于查询表中数据的语言。
常用的语法语句有:
SELECT 子句
FROM 子句
WHERE 子句
JOIN...ON...子句
GROUP BY 子句
HAVING 子句
ORDER BY子句
一条DQL语句至少要包含的两个子句分别是SELECT子句和FROM子句
- SELECT子句用于指定查询的字段名称。选定的字段会体现在查询结果集中
- FROM子句用于指定数据来自那些表(指定查询的表)
1.基础查询:SELECT子句和FROM子句
由SELECT和FROM构成。
1.1 语法:
-
SELECT子句和FROM子句
SELECT 字段1[,字段2,字段3,...] FROM 表1[,表2,表3...]
-
SELECT子句中可以使用*表达查询所有的字段
实际开发中不推荐使用,因为查询低效*
例
查询teacher表中的所有数据
SELECT * FROM teacher
上述SQL执行时,数据库会先解析"*",这个操作会导致数据库先查看内部数据字典了解表的字段后
才能查看表中数据。由于查询是非常频繁的操作,因此每次查看数据字段无疑是浪费性能且消耗时间的操作!
全字段查询时应当在SELECT子句中将所有字段全部列出来(后期java程序执行时)。
如果是手动临时查询,可以使用*。
查看每个老师的名字,职称,工资,性别
SELECT name,title,salary,gender
FROM teacher
2. WHERE子句
在DQL中用于筛选查询的记录。最终数据库仅将满足WHERE子句条件的记录体现在结果集中。
例
-
查看职称为"一级讲师"的老师名字和工资?
1:查询的是老师信息,能确定FROM子句中的表名为teacher 2:查看的是老师的名字和工资,能确定SELECT子句中的字段name和salary 3:由于仅查看"一级讲师",能确定WHERE子句过滤条件为title='一级讲师' SELECT name,salary,title FROM teacher WHERE title='一级讲师'
-
查看除’刘苍松’老师以外的其他老师的名字,工资和年龄?
SELECT name,salary,age FROM teacher WHERE name<>'刘苍松'
-
查看所有职位是’大队长’的同学的名字年龄和性别
SELECT name,age,gender FROM student WHERE job='大队长'
-
查看年龄在30(含)岁以上的老师都有谁?查看老师的名字,年龄,性别,工资
SELECT name,age,gender,salary FROM teacher WHERE age>=30
2.1 使用AND"与"和OR"或"来连接多个条件进行查询
- AND:都为真时才为真
- OR:都为假时才为假
例
-
查看7岁的大队长都是谁?列出:名字,年龄,性别,职位
SELECT name,age,gender,job FROM student WHERE job='大队长' AND age=7
-
查看班级编号小于6的所有中队长的名字,年龄,性别,职位和所在班级编号
SELECT name,age,gender,job,class_id FROM student WHERE class_id<6 AND job='中队长'
-
查看所有一级讲师和三级讲师的名字,职称,工资?
SELECT name,title,salary FROM teacher WHERE title='一级讲师' OR title='三级讲师'
-
查看所有大队长,中队长和小队长的名字,年龄,性别
SELECT name,age,gender FROM student WHERE job='大队长' OR job='中队长' OR job='小队长'
-
查看班级编号在6(含)以下的所有大队长和中队长的名字,年龄,职位,班级编号
AND的优先级是高于OR的, 可以使用( )提高优先级
SELECT name,age,job,class_id FROM student WHERE class_id<=6 AND job='大队长' OR job='中队长' 上述SQL的条件应当读作:查看班级编号6以下的大队长和所有班级编号的中队长 SELECT name,age,job,class_id FROM student WHERE class_id<=6 AND (job='大队长' OR job='中队长') 提高OR的优先级满足查询要求
2.2 IN(列表):等于列表其中之一(在列表中)
例
-
查看所有的大队长,中队长,小队长的名字,年龄,性别
SELECT name,age,gender FROM student WHERE job='大队长' OR job='中队长' OR job='小队长' 等价于 SELECT name,age,gender FROM student WHERE job IN('大队长','中队长','小队长')
-
查看所有一级讲师,二级讲师,三级讲师的老师名字,职称和工资?
SELECT name,title,salary FROM teacher WHERE title IN ('一级讲师','二级讲师','三级讲师')
2.3 NOT IN(列表):不在列表中,不能等于列表中的所有项
- 查看一级讲师和二级讲师以外的所有老师的名字,职称,工资?
SELECT name,title,salary
FROM teacher
WHERE title NOT IN('一级讲师','二级讲师')
-
查看不是中队长和大队长以及小队长的其他学生的名字,年龄,职位
SELECT name,age,job FROM student WHERE job NOT IN('大队长','中队长','小队长')
2.4 BETWEEN…AND…:在一个范围之内
-
查看工资在2000-5000之间的老师的名字,工资,职称?
SELECT name,salary,title FROM teacher WHERE salary>=2000 AND salary<=5000 等价于 SELECT name,salary,title FROM teacher WHERE salary BETWEEN 2000 AND 5000 下限 上限
-
查看年龄在7-10岁之间的学生的名字,年龄,性别
SELECT name,age,gender FROM student WHERE age BETWEEN 7 AND 10
-
查看年龄在20-35岁之间的男老师的名字,职称,年龄
SELECT name,title,age FROM teacher WHERE age BETWEEN 20 AND 35 AND gender='男'
-
查看3-5楼的班级名称都是什么?
SELECT name FROM class WHERE floor BETWEEN 3 AND 5
2.5 DISTINCT去重操作。
在结果集中去除指定字段值相同的记录
语法
SELECT DISTINCT 字段1[,字段2,...]
FROM 表名
...
- DISTINCT关键字必须紧跟在SELECT子句之后
- DISTINCT后面可以指定多个字段,当这几个字段组合相同的记录会在结果集中被去除
例
-
查看老师的职称都有哪些?
SELECT title FROM teacher 上述SQL语句的查询结果集是展现每个老师的职称,与查询需求不匹配 SELECT DISTINCT title FROM teacher 将查询结果集中重复的title去除后得到正确效果
-
查看学生的职位都有哪些?
SELECT DISTINCT job FROM student
-
查看各年龄的职位都有哪些?
SELECT DISTINCT age,job FROM student
练习:
1.查看负责课程编号(subject_id)为1的男老师都有谁?
SELECT name,salary,title
FROM teacher
WHERE subject_id=1 AND gender='男'
2.查看工资高于5000的女老师都有谁?
SELECT name,salary,title
FROM teacher
WHERE salary>5000 AND gender='女'
3.查看工资高于5000的男老师或所有女老师的工资?
SELECT name,salary,gender
FROM teacher
WHERE salary>5000 AND gender='男' OR gender='女'
4.查看所有9岁学生的学习委员和语文课代表都是谁?
SELECT name,job,age
F