DQL语言:
DQL(Data Query Language 数据查询语言):用于查询数据库对象中所包含的数据。
DQL语言主要的语句:SELECT语句。
DQL语言是数据库语言中最核心、最重要的语句,也是使用频率最高的语句。
查询的主要类型:简单的单表查询或多表的复杂查询和子查询。
什么是查询?
1.查询产生一个虚拟表。
2.看到的是表形式显示的结果,但结果并不真正存储。
3.每次执行查询只是从数据表中提取数据,并按照表格的形式显示出来。
SELECT语法
语法:SELECT [ALL | DISTINCT]
{ * | table.* | [ table.field1 [ as alias1] [, table.field2 [as alias2]][, …]] }
FROM table_name [ as table_ alias ]
[ left|out|inner join table_name2 ] #多表连接查询
[ WHERE … ] #指定结果需满足的条件
[ GROUP BY …] #指定结果按照哪几个字段来分组
[ HAVING …] #过滤分组的记录必须满足的次要条件
[ ORDER BY… ] #指定查询记录按一个或者多个条件排序
[ LIMIT { [ offset,] row_count | row_count OFFSET offset }] ; #分页查询
注意:[ ] 括号代表可选的;
{ } 括号代表必须的;
# MySQL语句中的注释符,也可以用 /*该处为注释*/
SELECT应用案例
1:查询表中所有的数据行和列,采用“*”符号。
语法:SELECT * FROM 表名;(效率低下,不推荐使用)
案例:SELECT * FROM student;
2:查询表中指定列的数据。
语法:SELECT 字段名1,字段名2,…字段名n FROM 表名;
示例:SELECT studentno, studentname, phone FROM student;
3:在查询中使用别名,使用“AS”关键字。
可给数据列取一个新别名
可给表取一个新别名
可把经计算或总结的结果用另外一个新名称来代替
语法:SELECT field1 [ AS alias1] [,field2 [AS alias2]] […,fieldn [AS aliasn]]
FROM table_name [ AS table_ alias ];
示例:SELECT studentno AS “学号” FROM student;
SELECT s.studentno FROM student AS s;
SELECT CONCAT("S",studentno) FROM student;
4:在查询中使用常量列:如果需要将一些常量的默认信息添加到输出结果中,以方便统计或计算。可以使用常量列。
语法:
示例:SELECT studentno AS “学号”, studentname AS “姓名”,
phone AS “手机号”,address AS “家庭住址”,
‘郑州翔天信鸽’ AS “学校名称”
FROM student;
5:DISTINCT关键字的使用:去掉SELECT查询返回的记录结果中重复的记录(所有返回列的值都相同),只返回一条。
语法:SELECT DISTINCT field1 [ AS alias1] [,field2 [AS alias2]] […,fieldn [AS aliasn]]
FROM table_name [ AS table_ alias ];
示例:#查询学生表中所包含的年级ID
SELECT DISTINCT gradeid FROM student;
WHERE条件
WHERE条件:用于检索数据表中符合条件的记录
搜索条件可由一个或多个逻辑表达式组成,结果一般为真或假
搜索条件的组成: 逻辑操作符 比较操作符;
逻辑运算符
操作符名称 | 语法 | 描述 |
AND或&& | a AND b 或 a && b | 逻辑与,同时为真,结果才为真 |
OR或|| | a OR b 或 a||b | 逻辑或,只要一个为真,则结果为真 |
NOT或! | NOT a 或 !a | 逻辑非,若操作数为假,结果则为真 |
比较运算符
操作符名称 | 语法 | 描述 |
IS NULL | a IS NULL | 若操作符为NULL,则结果为真 |
IS NOT NULL | a IS NOT NULL | 若操作符不为NULL,则结果为真 |
BETWEEN | a BETWEEN b AND c | 若a范围在b与c之间则结果为真 |
LIKE | a LIKE b | SQL模式匹配,若a匹配b,则结果为真 |
IN | a IN (a1,a2,a3,….) | 若a等于a1,a2…中的某一个,则结果为真 |
注意: 数值数据类型的记录之间才能进行算术运算
相同数据类型的数据之间才能进行比较
NULL空值条件查询
NULL
NULL代表“无值”
区别于零值0和空符串“”
只能出现在定义允许为NULL的字段
须使用 IS NULL 或 IS NOT NULL 比较操作符去比较
语法:SELECT 字段1,字段2 ,…FROM 表名 WHERE 字段x IS NULL
BETWEEN AND范围查询
BETWEEN AND范围查询:根据一个范围值来检索
等同于 >= 和 <= 联合使用
语法:SELECT 字段1,字段2 ,…FROM 表名 WHERE 字段x BETWEEN 值1 AND 值2
示例:#查询课程表中课时在110和120之间的所有记录
SELECT * FROM subject WHERE classhour BETWEEN 110 AND 120;
#等同于:
SELECT * FROM subject WHERE classhour >= 110 AND classhour <=120;
LIKE模糊查询
在WHERE子句中,使用LIKE关键字进行模糊查询
与“%”一起使用,表示匹配0或任意多个字符
与“_”一起使用,表示匹配单个字符
示例:#查询包含“数学”的所有课程
SELECT * FROM subject WHERE SubjectName LIKE "%数学%";
#查询所有姓名为“李**”三个字的学生信息
SELECT StudentNo,StudentName FROM student WHERE StudentName LIKE "李__";
使用IN进行范围查询
在WHERE子句中使用IN进行范围查询
查询的字段x的值,至少与括号中的一个值相同
多个值之间用英文逗号隔开
语法:SELECT 字段1,字段2 ,…FROM 表名 WHERE 字段x IN ( 值1,值2,值3…值n)
示例:SELECT * FROM subject where ClassHour = 100 OR ClassHour =110
OR ClassHour = 120; #普通处理方式
SELECT * FROM subject where ClassHour IN ( 100, 110,120 );
#使用IN进行查询方式,更为简洁,效率更高
MySQL中常用的函数
聚合函数
字符串函数
日期时间函数
数学函数
MySQL中的聚合函数
函数名 | 作用 |
AVG() | 返回某字段的平均值 |
COUNT() | 返回某字段的行数 |
MAX() | 返回某字段的最大值 |
MIN() | 返回某字段的最小值 |
SUM() | 返回某字段的和 |
MySQL中常用的数学函数
函数名 | 作 用 | 举 例 |
CEIL(x) | 返回大于或等于数值x的最小整数 | SELECT CEIL(2.3) 返回:3 |
FLOOR(x) | 返回小于或等于数值x的最大整数 | SELECT FLOOR(2.3) 返回:2 |
RAND() | 返回0~1间的随机数 | SELECT RAND() 返回:0.5525468583708134 |
MySQL中常用的字符串函数
函 数 名 | 作 用 | 举 例 |
CONCAT(str1, str1...strn) | 字符串连接 | SELECT CONCAT('My','S','QL'); 返回:MySQL |
INSERT(str,pos,len,newstr) | 字符串替换 | SELECT INSERT( '这是SQL Server数据库', 3,10,'MySQL'); 返回:这是MySQL数据库 |
LOWER(str) | 将字符串转为小写 | SELECT LOWER('MySQL'); 返回:mysql |
UPPER(str) | 将字符串转为大写 | SELECT UPPER('MySQL'); 返回:MYSQL |
SUBSTRING (str,num,len) | 字符串截取 | SELECT SUBSTRING( 'JavaMySQLOracle',5,5); 返回:MySQL |
MySQL中常用的日期时间函数
函数名 | 作用 | 举例(结果与当前时间有关) |
CURDATE() | 获取当前日期 | SELECT CURDATE(); 返回:2016-08-08 |
CURTIME() | 获取当前时间 | SELECT CURTIME(); 返回:19:19:26 |
NOW() | 获取当前日期和时间 | SELECT NOW(); 返回:2016-08-08 19:19:26 |
WEEK(date) | 返回日期date为一年中的第几周 | SELECT WEEK(NOW()); 返回:26 |
YEAR(date) | 返回日期date的年份 | SELECT YEAR(NOW()); 返回:2016 |
HOUR(time) | 返回时间time的小时值 | SELECT HOUR(NOW()); 返回:9 |
MINUTE(time) | 返回时间time的分钟值 | SELECT MINUTE(NOW()); 返回:43 |
DATEDIFF(date1,date2) | 返回日期参数date1和date2之间相隔的天数 | SELECT DATEDIFF(NOW(), '2008-8-8’); 返回:2881 |
ADDDATE(date,n) | 计算日期参数date加上n天后的日期 | SELECT ADDDATE(NOW(),5); 返回:2016-09-02 09:37:07 |