DQL(Data Query Language)数据查询语言

Posted zhouxiongjie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DQL(Data Query Language)数据查询语言相关的知识,希望对你有一定的参考价值。




数据库的好处

  • 可持久化数据到本地
  • 实现结构化查询

数据库的常见概念

  • DB(DATABASE):数据库
  • DBMS(DATABASE Management stytem):数据库管理系统
  • SQL:结构化查询语言,用于和数据库通信的语言,不是某个数据库特有的,而是几乎所有主流数据库软件通用的语言

数据库存储数据的特点

  • 数据存放在表中,然后表再放在库中
  • 一个库中可以存着多张表
  • 表中有一个或者多个列,列又称为"字段"

mysql 的优点

  • 开源,免费,成本低
  • 性能高,移植性好
  • 体积小,便于安装

MYSQL的启动与停止

方式一:命令行方式
    启动:net start '服务名'
    停止:net stop '服务名'
方式二:
    右击计算机 → 管理 → 服务
    

MYSQL服务的登录和退出

  • 登录
    mysql -h(主机名) - P(端口号) -u(用户名) -p(密码)
  • 退出
    exit或Ctrl + C





进阶一:基础查询

语法:

SELECT `查询列表` FROM `表名`;

特点:

1.查询列表可以是:表中的字段,常量值,表达式,函数
2.查询的结果是一个虚拟的表

查询表中的单个字段:

SELECT `name` FROM `student`;  

查询表中的多个字段:

SELECT `name`,`age` FROM `student`;

查询表中的所有字段:

SELECT * FROM `student`;

按顺序查询表中的所有字段:

SELECT `age`,`name`,`score` FROM `student`;

查询常量值:

字符型和日期型的值必须以‘‘引起来

SELECT 100; 
SELECT 'john';

查询表达式

SELECT 100%98

查询函数

SELECT version();

起别名

好处:
便于理解
如果要查询的字段中有重名的情况,使用别名可以区分开来

方式一:  
SELECT 100%98 AS 结果;
方式二:  
SELECT 100%98 结果;
案例:  
SELECT `name` AS 'out put' FROM student;

去重

关键字:DISTINCT

SELECT DISTINCT `class_id` FROM `student`;

+号的作用

两个操作数都为数值型,则做加法运算
SELECT 100+90;  
如果一方为字符型,试图将字符型数值转换成数值型  
如果转换成功,则继续做加法运算
SELECT '100'+99;  
如果转换失败,则将字符型数值转换成0
例:得到结果为90
SELECT 'Tom'+90
只有一方为null,则结果肯定为null
例:得到结果为null
SELECT null+90

concat(str1,str2,str3)函数的使用

将last_name 和 first_name 作为新字段拼接
例:  
SELECT CONCAT(last_name,first_name) AS '姓名' FROM `student`;

IFNULL(字段名,要替换为的值)函数的使用

将成绩为null的值替换为0分
IFNULL(score,0) AS 成绩;

ISNULL(字段名)函数的使用

判断字段名,表达式,函数是否有null,返回1和0

SELECT ISNULL(`score`) FROM `student`;

显示表结构

关键字:DESC

DESC `student`;

进阶二:条件查询

语法

执行步骤1,2,3,先查询是否有此表,然后执行筛选条件,最后查询列表

SELECT 
    查询列表    3
FROM 
    表名    1
WHERE 
    筛选条件;  2

一:按条件表达式筛选

条件运算符:>,<,=,不等于(!=, <>),>=,<=

二:按逻辑表达式筛选

逻辑运算符:and,or,not

三:模糊查询

模糊查询:like,betweer and,in,is null

like特点:

一般和通配符 % 配合使用,包含0个字符
_ 任意单个字符

betweer and

能提高语句的整洁度
包含边界值

in

用于判断某字段的值是否属于in列表中的某一项
特点:
提高语句的简洁度

is null

查询为空的条件时不能使用 = null

案例1.按条件表达式筛选:
SELECT * FROM `student` WHERE `score` > 80;

案例2.按逻辑表达式筛选:
SELECT * FROM `student` WHERE name = 'xiaoming' AND sex = 'boy';

案例3.按模糊查询
SELECT * FROM `student` WHERE `name` LIKE '%a%';

案例4.按模糊查询,要求是90分以上的学生信息
SELECT * FROM `student` WHERE `score` LIKE '9_';

案例5.查询学生中第二个为_的学生,通过转义
SELECT * FROM `student` WHERE `name` LIKE '_\_%';

    也可以通过ESCAPE '需要转义的字符';
    SELECT * FROM `student` WHERE `name` LIKE '_$_%' ESCAPE '$';
    
案例6.查询学生分数在60-90之间的学生信息
SELECT * FROM `student` WHERE `score` BETWEEN 60 AND 90;

案例7.查询名字为小红,小明的学生
SELECT * FROM `student` WHERE `name` IN ('小红','小明');

案例8.查询值为空的score
方法一:使用is null
SELECT `name`,`score` FROM `student` WHERE `score` IS NULL;
方法二:使用安全等于 <=>
SELECT `name`,`score` FROM `student` WHERE `score` <=> null;

TODO:面试题

SELECT * FROM `student`; 和 SELECT * FROM `student` WHERE last_name like '%' AND first_name like '%';有什么区别?  
答:当表中没有null值时,查询的结果是一致的,当表中有null值时,WHERE筛选条件就会过滤为 null 的结果  
第二条如果 last_name 和 first_name 有索引时,语句会根据索引去查找数据库,而第一条语句会全表扫描,所以第二条语句有索引的情况下会大大提高搜索效率。

进阶三:条件查询

语法

SELECT 
    查询列表
FROM
    表名
WHERE
    筛选条件
ORDER BY 
    排序列表    ASC|DESC  
ASC:升序    不加默认为升序
DESC:降序  



案例1.成绩按从高到低排序
SELECT * FROM `student` ORDER BY `score` DESC;  

案例2.成绩按从低到高排序
SELECT * FROM `student` ORDER BY `score`;

案例3.查询学生分数大于90分,且入学时间从早到晚的学生信息
SELECT * FROM `student` WHERE `score`> 90 ORDER BY time;

案例4.按表达式排序
按年薪的高低显示员的信息和年薪
salary:工资
bonus:奖金
SELECT *,`salary` * 12 *(1+IFNULL(Bonus,0)) AS 年薪 FROM `Employee` ORDER BY 年薪;

案例5.按学生的姓名的长度排序
SELECT LENGTH(name) AS 姓名长度,`name` FROM `student` ORDER BY 姓名长度;

案例6.查询学生信息,要求先按分数升序,再按id降序(当工资相同时,再按id降序排列)
SELECT * FROM `student` ORDER BY `score` ,`id` DESC;

进阶四:常见函数

语法

SELECT 
    函数名(实参列表)
FROM
    表名;

特点

  • 函数名
  • 函数功能

分类

  • 当行函数
    例:concat、length、ifnull
  • 分组函数
    做统计使用,又称为统计函数,聚合函数,组函数

字符函数

length:统计字节个数
例:SELECT LENGTH('name');

concat:拼接字符串
例:SELECT CONCAT(last_name,'_',first_name) FROM `student`;

upper:将字符串转换为大写
lower:将字符串转换为小写
例:将姓转换为大写,名转换为小写,然后拼接  
SELECT CONCAT(UPPER(`last_name`),LOWER(`first_name`)) AS 姓名 FROM `student`;

substr/substring:索引取值,索引从1开始,参数传一个str,开始为值,结束位置
例:SELECT SUBSTR('这是mysql教程',3,7)

姓名中首字符大写,其他字符小写,然后用_拼接,显示为name
SELECT CONCAT(UPPER(SUBSTR(`last_name`,1,1)),'_',LOWER(SUBSTR(`last_name`,2))) AS `name` FROM `student`;

instr:返回字字符串在主字符串的第一次出现的索引位置,如果找不到返回0
SELECT INSTR('这是MYSQL教程','是') AS `查找` FROM `student`;

trim:去除字符串中前后的指定字符,默认去除空格
例:SELECT TRIM('  997    ');
SELECT TRIM('1' FROM '111999888111') AS `str`;

lpad:用指定的字符实现左填充指定长度
rpad:用指定的字符实现右填充指定长度
例:SELECT LPAD('学生')

replace:替换
SELECT REPLCAE('aaaaaabbbbbbcccccacabcb','a','d') AS `替换后字符串`;

数学函数

round:四舍五入,第一个参数为值,第二个参数为保留的小数位数
例:SELECT ROUND(1.5689,3);

ceil:向上取整,返回值>=该参数的最小整数
例:SELECT CEIL(1.00)

floor:向下取整,返回值<=该参数的最小整数
例:SELECT FLOOR(-8.99)

truncate:截断,第二个参数为值的小数位保留位数
例:SELECT TRUUNCATE(2.999,2);

mod:取余
例:SELECT MOD(9,2)

日期函数

now:返回当前系统日期 + 时间
例:SELECT NOW();

curdate:返回当前系统日期,不包含时间
例:SELECT CURDATA();

curtime:返回当前系统时间,不包含日期
例:SELECT CURTIME();

获取指定的部分:年、月、日、小时、分、秒
例:SELECT YEAR(NOW()) AS 年;
    SELECT MONTH(NOW()) AS 月;

以上是关于DQL(Data Query Language)数据查询语言的主要内容,如果未能解决你的问题,请参考以下文章

MySQL基本操作

一张表格阐释DDL,DML,DCL,DQL

DQL:数据查询复杂的(多表)

如何将RETURNING更新查询用于DQL

LINQ (Language Integrated Query)

MySQL基本方法