DQL(Data Query Language) 查询数据库
- 所有的查询操作都用 (Select)
- 可以进行复杂的查询操作
- MySQL 函数也通过该命令实现
- 数据库中最核心的语言,最重要的语句
- 使用最频繁的语句
SELECT 语法:
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}];
-- 指定查询的记录从哪条至哪条
sql语言的执行顺序
- from
- on
- join
- where
- group by
- avg,sum,…
- having
- select
- distinct
- order by
有的时候,字段的名字不是很能见名知意,可以给字段起一个别名,也可以给结果起一个别名,也可以给表起别名
SELECT `StudentNo` AS 学号,`studentName` AS 学生姓名 FROM student
- 连接字符串
concat(a,b)
- 示例:
SELECT CONTACT('姓名:':,StudentName) AS 新名字 FROM student
去重复
SELECT DISTINCT `字段` FROM `表`
查询MySQL版本
SELECT VERSION()
计算结果:用来计算表达式
SELECT 100*3-1 AS 计算结果
查询 自增的补偿
SELECT @@AUTO_INCREMENT_INCREMENT
- 学院考试成绩 + 1 分查看
SELECT `StudentNo` ,`StudentResult`+1 AS '提分后' FROM result
WHERE 条件子句
作用:检索数据库中符合条件的值
所有的条件由一个或多个表达式组成,结果为布尔值
运算符 语法 描述
and &&
or ||
not !
查询考试成绩在95~100分之间的学生
SELECT StudentNo,`StudentResult` FROM result
WHERE StudentResult>=95 AND StudentResult <= 100
模糊查询(区间)
SELECT StudentNo,`StudentResult` FROM result
WHERE StudentResult BETWEEN 95 AND 100
– 左大由小
查询除了1000号之外的同学的成绩
SELECT StudentNo,`StudentResult` FROM result
WHERE studentNo !=1000
模糊查询
运算符 | 语法 | 描述 |
---|---|---|
IS NULL | a IS NULL | 如果操作符为NULL ,结果为真 |
IS NOT NULL | a IS NOT NULL | 如果操作符不为NULL ,结果为真 |
BETWEEN | ||
LIKE | a like b | SQL 匹配,如果a 匹配 b,结果为真 |
IN | a in (a1,a2,a2…) | 假设a在a1或者a2,…其中的摸一个值中,那么结果为真 |
1. like 结合 %( 代表0到任意字符 ) _( 代表一个字符 )
- 查询姓刘的同学
SELECT `StudentNo`,`StudentName` FROM `Student`
WHERE Student LIKE '刘%'
- 查询姓刘的同学,名字后面只有一个字的。
SELECT `StudentNo`,`StudentName` FROM `Student`
WHERE Student LIKE '刘_'
查询姓刘的同学,名字后面只铀两个字的。
SELECT `StudentNo`,`StudentName` FROM `Student`
WHERE Student LIKE '刘__' -- 两个_
查询名字中有 嘉字的同学
SELECT `StudentNo`,`StudentName` FROM `Student`
WHERE Student LIKE '%嘉%'
2. IN(具体的一个或多个值)
查询 1002,1002,1003号学院
SELECT `StudentNo`,`StudentName` FROM `Student`
WHERE `StudentNo IN (1001,1002,1003)
- 查询在北京的学生
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE `Address` IN ('北京')
==3. NULL / NOT NULL ==
- 查询地址为空的学生
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE address='' OR address IS NULL
- 查询有出生日期的同学
SELECT `StudentNo`,`StudentName` FROM `student`
WHERE `BornDate` IS NOT NULL
MySQL 函数
1、数学运算
- 取模
SELECT ABS();
- 向上取整
SELECT CEILING(9.4)
- 向下取整
SELECT FLOOR(0.8);
- 返回一个0~1之间的随机数
SELECT RAND()
- 取符号
SELECT SIGN(X) -- 整数:1 负数:-1 零:0
2、字符串函数
- 字符串的长度
SELECT CHAR_LENGTH('字符串');
- 拼接字符串
SELECT CONCAR('字符串1','字符串2')
- 在指定位置插入字符串
SELECT INSERT(str,pos,len,newstr);
- 变为小写
SELECT LOWER('大写英文字符串')
- 变为大写
SELECT UPPER('小写英文字符串')
- 返回第一次出现的子串的索引
SELECT INSTR('被查询的字符串','要找的子串')
- 将字符串str重复count次返回
SELECT REPEAT('str',count)
- 返回指定的字符串,起始位置用1开始计数
SELECT SUBSTR('源字符串',截取的其实位置,截取的长度)
- 逆序输出字符串
SELECT REVERSE('字符串')
3、时间和日期
- 获取当前日期
SELECT CURRENT_DATE()
SELECT CURDATE()
输出:
- 获取当地日期
SELECT NOW()
输出:
SELECT LOCALTIME()
输出:
- 获取年、月、日、时、分、秒
SELECT YEAR(NOW())
SELECT MONTH(NOW())
SELECT DAY(NOW())
SELECT HOUR(NOW())
SELECT MINUTE(NOW())
SELECT SECOND(NOW())
4、系统
SELECT SYSTEM_USER()
SELECT USER()
SELECT VERSION()
5、聚合函数
count()
sum()
AVG()
MAX()
MIN()
示例:
- COUNT ,都能构统计表中的数据(个数)
SELECT COUNT(studentname) FROM student -- COUNT(指定列),会忽略所有的null
SELECT COUNT(*) FROM student; -- COUNT(*),不会忽略null,计算行数
SELECT COUNT(1) FROM student; -- COUNT(1),不会忽略null,计算行数
- 查询不同课程的最高分、平均分、最低分、平均分 > 80
核心:(根据不同课程分组)
SELECT subjectName, AVG(StudentResult), MAX(StudentResult),MIN(StudentResult)
FROM result r
INNER JOIN `subject` sub
ON r.`Subject` = sub.`subjectNo`
GROUP BY r.SubjectNo -- 通过什么字段来分组
HAVING 平均分 > 80