-
一、认识数据库
-
数据库的好处
- 1、可以持久化数据到本地
- 2、结构化查询
-
数据库存储数据的特点
- 1、数据存放到表中,然后表再存放到库中
- 2、一个库中可以有多张表,每张表具有唯一的表名来标识自己
- 3、表中有一个或多个列,列又称为“字段”,相当于Java中“属性”
- 表中每一行数据,就相当于Java中的“对象”
-
常见的数据库管理系统
- MySQL(甲骨文)、Oracle(甲骨文)、DB2(IBM公司)、SQLserver(微软)
-
数据库的常见概念
- DB:数据库
- DBMS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DB
- SQL:结构化查询语言,用于和数据库通信的语言,通用语言
-
-
二、了解MySQL
-
MySQL的背景
- 前身属于瑞典一家公司MySQL AB
- 08年被sun收购
- 09年sun被Oracle收购
-
MySQL的优点
-
1、开源免费、成本低
-
2、性能高、移植性也好
-
3、体积小,便于安装
-
-
MySQL服务的登录和退出
- 登录:mysql【-h主机名 -p端口号】-u用户名-p密码 , 括号内可省略
- 退出:exit或者 ctrl+c
-
MySQL的服务的启动和停止
- 方式一:通过命令行
- net start 服务名
- net stop 服务名
- 方式二:计算机--右击--管理--服务
- 方式一:通过命令行
-
MySQL的安装
-
属于c/s架构的软件,既有服务端又有客户端,但是一般来讲 安装服务端
-
安装路径必须是英文的
-
安装社区版
-
-
-
三、DQL语言(Data QueryLanguage 数据查询语言标准语法)
-
语法特点
- 1、不区分大小写,但关键字大写,表名、列小写
- 2、每条命令最好用分号结尾
- 3、每条命令根据需要,进行缩进或换行
- 4、注释:单行注释(#文字)、单行注释(__空格 注释文字)、多行注释(/*注释文字*/)
- 5、查询列表可以是字段、常量、表达式、函数也可以是多个
- 6、查询结果是一个虚拟表
- 7、选中代码,按F12,可将数据格式化
-
进阶1:基础查询
- 语法
- select 查询列表 from 表名;
- 1、查询单个字段:select 字段名 from 表名;
- 2、查询多个字段:select 字段名,字段名 from 表名;
- 3、查询所有字段:select * from 表名;
- 4、查询常量值:selec 常量值;
- 注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要
- 5、查询函数:selec 函数名(实参列表);
- 6、查询表达式:select 100/123
- 支持加减乘除 取模 但是不支持Java中的++ -- *=
- 7、起别名
- select 字段名 as 别名
- 起别名为英文含有特殊符号(空格、#等)时,可加上单或双引号:select salary as 'out put' from employees;
- 案例:select last_name as 姓,first_name as 名 from employees;【此处的as可以省略;】
- 8、去重:
- select distinct 字段名 from 表名
- 注意:只能一个字段名
- select distinct department_id from employees
- select distinct 字段名 from 表名
- 9、MySQL中的+号:只有运算符的功能
- ①select 数值+数值:例如select 100+90:若俩数值相加,则直接加法运算
- ②select 字符+数值:例如select '120'+90:只要其中一方为字符型,则试图将字符串转换为数值型,转换成功,则继续做加法运算
- ③select 字符+数值:例如select 'Doris'+90:若转换失败的默认为0,再进行相加
- ④select null+任何值:只要其中一方为null,则结果肯定为null
- java中的+号:①运算符,两个操作数都为数值型;②连接符:只要有一个操作数为字符串
- 10、【补充】连接函数:concat函数
- 功能:拼接字符
- select concat(字符1,字符2,字符3,…)
- SELECT CONCAT(last_name,' ',first_name) AS 姓名 FROM employees;
- 题目:显示employees的所有列,各个列之间用逗号隔开,列头显示为out_put:
SELECT
CONCAT(last_name,',',first_name,',',IFNULL(commission_pct,0)) AS out_put
FROM employees;
- 题目:显示employees的所有列,各个列之间用逗号隔开,列头显示为out_put:
- 11、【补充】ifnull函数
- 功能:判断某段或表达式是否为null,如果为null,则返回指定的值,否则返回原本的值
- select ifnull(commission_pct,0)from employees;
- 12、【补充】isnull函数
- 功能:判断某字段或表达式是否为null,如果是,则返回1,否则返回0
- select isnull(commission_pct),commission_pct from employees;
-
- 语法
-
进阶2:条件查询
- 语法:
- select 查询表列 from 表名 where 筛选条件;
- 1、简单条件运算符
- 按条件表达式筛选,
- 条件运算符有:> 、 < 、 = 、 != 、 <> 、 >= 、 <= 、<=>安全等于
- 2、逻辑运算符
- 按逻辑表达式筛选,逻辑运算符:&& 、 || 、 ! 、 and 、 or 、 not
- && 和 and:两真才为true
- || 或 or:只要有一真则为真
- ! 或 not:若连接的条件本身为false,结果则为true
- 案例2(and、or、>、<)
案例2:查询部门编号不是在90到110之间,或者高于15000的员工信息
SELECT
*
FROM
employees
①WHERE
department_id NOT BETWEEN 90 AND 110 OR salary>15000;
②或者——————————————————————————————————
where
department_id<90 OR department_id>110 OR salary>15000;
③或者——————————————————————————————————
where
NOT (department_id>=90 AND department_id<=110) OR salary>15000;
- 按逻辑表达式筛选,逻辑运算符:&& 、 || 、 ! 、 and 、 or 、 not
- 3、模糊查询 like、between and、in、is null
- like
- 一般和通配符连用,可用于判断字符型,也可以判断数值型
- %:表示通配符,可以表示0个或多个字符
- _:表示占位符,只能表示1个字符
- 案例3(转义符、like)
#案例3查询员工名中第二个字符为_的员工名
SELECT
last_name
FROM
employees
WHERE
last_name LIKE '_$_%' ESCAPE '$';
- 例子:select department_id from employees where department_id like '1__' 结果则显示部门编号为1开头的三位数
- 一般和通配符连用,可用于判断字符型,也可以判断数值型
- between and
- 可以提高语句的简洁度
- 包含临界值,且大小不能颠倒
- between 100 and 120(相当于A>=100 and A<=120),所以前值小,后值大
- 案例
#案例2:查询部门编号不是在90到110之间,或者高于15000的员工信息--------------------------------4
SELECT
*
FROM
employees
WHERE
department_id NOT BETWEEN 90 AND 110 OR salary>15000;
- in
- in 含义:判断某字段的值是否属于in列表中的某一项,
- 特点:
- ①比or做筛选更简洁
- ②in列表的值类型必须一致或兼容
- ③是否等于某一项,而不是模糊判断,所以不支持写通配符%或_,错误示例:in('IT_PORT','AD_%')
- 案例
#in 案例:查询员工的工种编号是IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
SELECT
last_name,
job_id
FROM
employees
WHERE
job_id in ('IT_PROG','AD_VP','AD_PRES');
- is null / is not null
- 等于=或不等于<> 不能判断null值
- is null 或is not null 能判断null值
- 案例
#is null 案例1:查询没有奖金的员工名和奖金率------------------------------------------10
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct is null;
- 安全等于<=> (可读性较差,不常使用)
- 案例
#安全等于<=>
#案例1:查询没有奖金的员工名和奖金率------------------------------------------11
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct <=> null;
#案例2 查询工资为12000的员工信息----------------------------------------------12
SELECT
last_name,
salary
FROM
employees
WHERE
salary <=> 12000;
- 案例
- 经典面试题
- 1、试问:select * from employees;和select *from employees where commision_pct like '%%' and last_name like '%%';
- 答案:不一样;因为奖金率这一列会有null。
- 2、试问:select * from employees;和select *from employees where commision_pct like '%%' or last_name like '%%' or employee_id like '%%';
- 答案:一样,因为总会有一字段满足不为null。
- 1、试问:select * from employees;和select *from employees where commision_pct like '%%' and last_name like '%%';
- like
- 语法:
-
进阶3:排序查询
- 语法:
- select 查询列表
- from 表
- where 筛选条件
- order by 排序列表 asc/desc
- 特点:
- 1、查询asc代表升序,desc代表降序,不写时,默认升序asc
- 2、order by 子句中支持对单个字段、多个字段、表达式、函数、别名 排序
- 3、order by 子句一般都是放在查询语句的最后,limit子句除外
- 案例
- #案例:查询员工信息,要求工资从高到低排序
- SELECT
- *
- FROM
- employees
- ORDER BY salary DESC;
- 语法:
-
进阶4:常见函数
- 概念:
- 类似Java的方法,将一组逻辑语句封装在方法体中对外暴露方法名
- 好处:
- 1、隐藏了实现细节
- 2、提高代码的重用性
- 调用:
- select 函数名() 【from 表】;
- 特点:
- ①叫什么(函数名)
- ②干什么(函数功能)
- 分类
- 1、单行函数 如concat、length、ifnull等
- 2、分组函数又称为统计函数、聚合函数、组函数, 其功能:做统计使用
- (一)单行函数
- 一、字符函数10个
- 1、length 获取参数值的字节个数
- select length (’张三丰hahahaha‘) 其中中文占3位,故字节数为15
- 字符节查询
- utf8 表示:一个中文占3个字符,一个英文占1个字符
-
- utf8 表示:一个中文占3个字符,一个英文占1个字符
- 2、concat 拼接字符串
- 3、upper、lower变大小写
- select upper(’john‘);运行结果为JOHN
- 案例:将姓大写,名小写,然后拼接
- select concat(upper(last_name),'_',lower(first_name)) 姓名 from employees;
- 4、substr、substring 截取字段
- 注意:索引从1开始
- 案例:截取从指定索引处后面所有字符
- select substr('李莫愁爱上了陆展元',7)as out_put;
- 运行结果:陆展元
- select substr('李莫愁爱上了陆展元',7)as out_put;
- 案例:截取从指定索引处指定字符长度的字符
- select substr('李莫愁爱上了陆展元',1,3)as out_put;
- 运行结果:李莫愁
- select substr('李莫愁爱上了陆展元',1,3)as out_put;
- #案例: 姓名中首字符大写,其他字符小写,然后用_拼接,显示出来
- SELECT CONCAT(upper(SUBSTR(last_name,1,1)),'_',lower(SUBSTR(last_name,2))) FROM employees;
- 5、instr
- 返回子串第一次出现的索引,如果找不到返回0
- 案例:select instr('杨不悔爱上了殷六侠’,‘殷六侠’)运行结果为:7
- 案例:select instr('杨不悔殷六侠爱上了殷六侠’,‘殷六侠’)运行结果为:4
- 返回子串第一次出现的索引,如果找不到返回0
- 6、trim 去收尾空格 或其他指定字符
- 案例:select trim(‘ 张翠山 ’) as out_put; 运行结果:张翠山
- 案例:SELECT TRIM('a' FROM 'aa张翠山a aa'); 运行结果:张翠山a 空格
- 7、lpad
- 用指定字符,左填充指定长度
- 案例: SELECT LPAD('祝思华',2,'*') as out_put; 运行结果:祝思
- 案例: SELECT LPAD('思华',3,'') as out_put; 运行结果:思华
- 用指定字符,左填充指定长度
- 8、rpad
- 用指定字符,右填充指定长度
- 案例: SELECT RPAD('思华',3,'+') as out_put; 运行结果:思华+
- 案例:SELECT RPAD('祝思华',2,'*') as out_put; 运行结果:祝思
- 用指定字符,右填充指定长度
- 9、replace
- 案例:SELECT REPLACE('张无忌爱上了周芷若','周芷若','赵敏'); 运行结果:张无忌爱上了赵敏
- 测试练习题
- 案例测试练习1:将员工的姓名按首字母排序,并写出姓名的长度(length)
SELECT last_name,LENGTH(last_name) as 'length'
FROM employees
ORDER BY SUBSTR(last_name,1,1) ASC;
- 案例测试练习4: 做一个查询,产生下面的效果 # earns monthly but wants Dream Salary S
#ELECT CONCAT(last_name,'earns',salary,'monthly but wants',salary*3) 'Dream Salary'
FROM employees
WHERE salary=24000;
- 案例测试练习1:将员工的姓名按首字母排序,并写出姓名的长度(length)
- 1、length 获取参数值的字节个数
- 二、数学函数
- 1、round 四舍五入
- 案例:select round(1.65); 运行结果:2
- 案例:select round(1.657,2); 运行结果:1.66
- 2、ceil 向上取整,>=该参数的最小整数
- 案例:select ceil(1.052); 运行结果:2
- 案例:select ceil(1.000); 运行结果:1
- 案例:select ceil(-1.002); 运行结果:-1
- 3、floor 向下取整,<=该参数的最大整数
- 案例:select floor(-9.0999); 运行结果:-10
- 4、truncate 截断函数(即小数点后保留几位)
- select truncate(1.699,1); 运行结果为1.6
- 5、mod 取模 取余
- mod(a,b)=a-a/b*b 所以结果只看被取余数的数的正负即可
- select mod(10,3);运行结果:1
- select mod(-10,-3);运行结果:-1
- 效果同select 10%3;
- 1、round 四舍五入
- 三、日期函数
- 1、now 返回当前系统日期+时间
- select now();
- 2、curdate 返回当前系统日期
- select curdate();
- 3、curtime 返回当前系统时间
- select curtime();
- 4、获取指定的部分,年、月、日、小时、分、钟、秒
- select year(now()) as 年;
- select month(now()) as 月;
- select monthname(now()) as 月; 运行结果为:英文月份
- 5、 str_to_date 将字符转换成日期
- 将字符通过指定的格式转换为日期
-
- 案例:查询入职日期为1992-4-3的员工信息 select STR_TO_DATE('1998-3-2','%Y-%c-%d') as out_put;
- 注意:括号内带上单引号
- 将字符通过指定的格式转换为日期
- 6、date_format 将日期转换成字符
- 将日期通过指定的格式转换为字符
-
- 案例1
- SELECT DATE_FORMAT(NOW(),'%y年%m月%d日') AS out_put;
- 运行结果:22年05月05日
- SELECT DATE_FORMAT(NOW(),'%y年%m月%d日') AS out_put;
- 案例2
- #案例 查询有奖金的员工名和入职日期(××月/××日 ××××年)
- SELECT
- last_name,
- DATE_FORMAT(hiredate,'%m月%d日 %Y年')
- FROM
- employees
- WHERE
- commission_pct IS NOT NULL;
- 将日期通过指定的格式转换为字符
- 1、now 返回当前系统日期+时间
- 四、其他函数【补充】
- 查询版本号:select version();
- 查询版本号:select database();
- 查询用户:select user();
- 五、流程控制函数【补充】
- 1、if函数
- 案例
- SELECT
- last_name,commission_pct,IF(commission_pct IS null,'没奖金,呵呵','有奖金') AS 备注
- FROM employees;
- 2、case函数
- 效果一:switch case的效果
- 案例:
案例:查询员工的工资,要求
部门编号=30,显示的工资为1.1倍
部门编号=40,显示的工资为1.2倍
部门编号=50,显示的工资为1.3倍
其他部门,显示的工资为原工资- 代码:
SELECT salary 原始工资,department_id,
CASE department_id
WHEN 30 THEN salary1.1
WHEN 40 THEN salary1.2
WHEN 50 THEN salary*1.3
ELSE
salary
END AS 新工资
FROM employees;
- 代码:
- 案例:
- 效果二:多重if的效果
- 案例:
查询员工的工资情况
如果工资>20000,显示A级别
如果工资>15000,显示B级别
如果工资>10000,显示C级别
否则,显示D级别- 代码:
SELECT salary,
CASE
WHEN salary>20000 THEN 'A'
WHEN salary>15000 THEN 'B'
WHEN salary>10000 THEN 'C'
ELSE 'D'
END AS 工资级别
FROM
employees;
- 代码:
- 案例:
- 效果一:switch case的效果
- 1、if函数
- 一、字符函数10个
- (二)分组函数
- 功能
- 又称为统计函数、聚合函数或组函数
- 分类
- 求和、平均、最大、最小、计数
- 特点
- 参数支持哪些类型
- 1、一般都支持数值型
- sum、avg
- 数值型
- max、min
- 数值型、字符型
- count
- 数值型、字符型
- 但不支持计数 空值null
- sum、avg
- 2、以上分组函数都忽略null值
- 1、一般都支持数值型
- 3、可以和distinct搭配 去重
- select count(distinct salary),from employees;
- 4、count函数的详细介绍
- select count(salary) from employees;
- 数行数:select count(*) from employees;
- 数行数:select count(1) from employees;
- 此处的1可以替换为任何数值,也可替换为任何‘字符’,加上引号,相当于加上一列1,去数1的个数。
- 效率,优先使用count(*)
- 在MYISAM存储引擎下,count(*)的效率最高
- 在INNODB存储引擎下,count(*)和count(1)的效率差不多,比count(字段)效率高一些
- 5、和分组函数一同查询的字段有限制:要求是group by后的字段
- 参数支持哪些类型
- 功能
- 概念:
-
下一篇预告:进阶5:分组查询
-
MySQL学习笔记整理
最新推荐文章于 2024-06-18 10:49:00 发布