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 月;