文章目录
# 数据库认识
MySQL
DB
数据库,存储数据的容器
DEMS
数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DB
SQL
结构化查询语言,用于和数据库通信的语言,不是某个数据库软件特有的,而是几乎所有的主流数据库软件通用的语言
MySQL的优点
1、开源、免费、成本低
2、性能高、移植性也好
3、体积小,便于安装
MySQL安装后的cmd部分命令
- 登入
mysql -h local -P 3306 -u root -p1020
mysql -u root -p1020
- 展示所有数据库
show databases;
- 创建数据库
create database 数据库名字;
- 使用数据库
use 数据库名字
- 查看当前库内的所有表
show tables;
- 创建表
create table Student(
-> Sno int not null auto_increment primary key,
-> Sname varchar(10) not null,
-> Sex char(1) not null,
-> Sage tinyint(100) not null,
-> Sdept char(4) not null)comment = '学生表';
- 删除表
drop table 表名;
- 使用其他库
在当前库下直接使用 use 表名;
DQL语言的学习
基础查询
语法:
select 查询列表 from 表名;
类似于:System.out.Println(打印的东西)
特点:
1.查询列表可以是:表中的字段,常量值,表达式,函数
2.查询的结果是一个虚拟的表格
查询1
#1.查询表中的当个字段
SELECT last_name FROM employees;
#2.查询表中的多个字段
SELECT last_name,salary,email FROM employees;
#3.查询表中的所有字段
#方式1:
SELECT `employee_id`,`first_name`,`last_name`,`email`,`phone_number`,`job_id`,`salary`,`commission_pct`,`manager_id`,`department_id`,`hiredate`
FROM
employees ;
#方式2:
SELECT * FROM employees
注意
使用哪个库之前,应该先:
USE 库名
''是区分字段与关键字的
选中命令,可以使用f12进行代码格式化
查询
# 查询常量值
SELECT 100;
SELECT 'john';
# 查询表达式
SELECT 100%98;
# 查询函数
SELECT VERSION();
起别名
#1.起别名
/*
便于理解
如果查询的字段有重名的情况,使用别名可以区分开来
AS可以省略
*/
#方式一
SELECT 100%98 AS 结果;
SELECT last_name AS 姓,first_name AS 名 FROM employees;
#方式二:
SELECT last_name 姓,first_name 名 FROM employees;
#查询slary,显示结果为 out put(如果别名有空格,建议加上双引号)
SELECT salary AS "out put" FROM employees;
去重
#去重 DISTINCT
#查询员工表中设计道德所有的部门编号
SELECT DISTINCT department_id FROM employees;
#+号的作用
/*
mysql中的+只有一个功能:运算符
select 100+90:两个操作都是数值型,则做加法运算
select '123'+90;其中一方为字符型,将字符型数值转换为数值型
转换成功,继续加法
select 'jphn'+90; 转换失败,则将字符型数值转换为0
select null+10; 只要其中一方为null,则结果肯定为null
*/
查询员工名和姓链接成一个字段,并显示为 姓名
SELECT
last_name+first_name AS 姓名
FROM
employees;
SELECT NULL+10;
函数:连接 CONCAT()
#连接 CONCAT函数(需要连接的字段名 )
SELECT CONCAT(first_name,last_name) AS 姓名 FROM employees;
显示表结构
DESC departments;
函数:IFNULL()
#IFNULL(expr1,expr2)
SELECT
IFNULL(commission_pct,0) AS 奖金率,commission_pct
FROM
employees;
函数:ISNULL()
判断某字段或表达式是否为null,如果是,则返回1,否则返回0
条件查询
语法:
select 查询列表 from 表名 where 筛选条件;
1 2 3
执行顺序 2-->3--->1
筛选条件的分类:
1.按条件表达式筛选:
> < = !=(<>) >= <=
2.按逻辑表达式筛选:
&& || !
and:如果两个条件都为true,结果九尾true,反之则为false
or:只要有一个条件为true,结果就为true,反之则为false
not
3.模糊查询:
like
between and
in
is null
注意
-
like:
一般和通配符搭配使用
% 任意多个字符,包含0字符
_ 占位符 -
转义字符
(\),但是推荐使用(自定义转义字符) ‘_KaTeX parse error: Expected group after '_' at position 1: _̲%' ESCAPE '’;
-
between and
1.使用 between and 可以提高代码的简洁度
2.两端的临界值都包含
3.两个临界值,不要调换顺序 -
in
含义:判断某个字段的值是否属于in列表中的某一项
特点:
1.使用in可以提高简洁度
2.in列表的值,必须统一或兼容(隐式转换) -
is null
=或<>不能判断null值
is null -
安全等于<=>
is null 仅仅可以判断null值,可读性较高
<=> 既可以判断数值,又可以判断null,但是可读性不高
案例
#案例
#1.查询工资大于>12000的
SELECT * FROM employees WHERE salary>12000;
#2.查询部门编号不等于90的员工名和部门编号
SELECT last_name,department_id FROM employees WHERE department_id<>90;
#逻辑表达式筛选
#3查询工资在10000-20000之间的,员工名,工资,以及奖金
SELECT last_name,salary,commission_pct FROM employees WHERE salary>=10000 AND salary<=30000;
#4查询部门编号不是90-110之间,活着工资高于15000的员工信息
SELECT * FROM employees WHERE NOT(department_id>=90 && department_id<=110) || salary>=15000;
#模糊查询
/*
like:
1.一般和通配符搭配使用
% 任意多个字符,包含0字符
_ 占位符
*/
#1.like 员工名中包含字符a的员工信息
SELECT * FROM employees WHERE last_name LIKE '%a%';
#2.查询员工名中第三个字符为n,第五个字符为l的员工名和工资
SELECT
last_name,
salary
FROM
employees
WHERE
last_name LIKE '__n_l%';
#3.转义字符(\),但是推荐使用(自定义转义字符) '_$_%' ESCAPE '$';
#查询员工名中第二个字符为_的员工名
SELECT
last_name
FROM
employees
WHERE
last_name LIKE '_$_%' ESCAPE '$';
#between and
/*
1.使用 between and 可以提高代码的简洁度
2.两端的临界值都包含
3.两个临界值,不要调换顺序
*/
#案例 查询员工表在100-200之间的员工信息
SELECT
*
FROM
employees
WHERE
employee_id BETWEEN 100 AND 120;
#in
/*
含义:判断某个字段的值是否属于in列表中的某一项
特点:
1.使用in可以提高简洁度
2.in列表的值,必须统一或兼容(隐式转换)
*/
#1.查询员工的工种名是 AD_VP IT_PROG AD_PRES 中的一个员工名和工种编号
SELECT
last_name,
job_id
FROM
employees
WHERE
job_id IN ('AD_VP','IT_PROG','AD_PRES');
# is null
/*
=或<>不能判断null值
is null
*/
# 查询没有奖金的员工名和奖金率
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct IS NULL;
#安全等于<=>
/*
is null 仅仅可以判断null值,可读性较高
<=> 既可以判断数值,又可以判断null,但是可读性不高
*/
SELECT
last_name,
commission_pct
FROM
employees
WHERE
commission_pct <=>NULL;
#案例 查询员工号为176的员工的姓名,部门号,年薪
SELECT
last_name,
department_id,
salary*12*(1+IFNULL(commission_pct,0)) AS 年薪
FROM
employees
WHERE
job_id = 176;
排序查询
-
语法:
select 查询列表 from 表 [where 筛选条件] order by 排序列表 [asc(升序)|desc(降序)]
-
特点:
1.asc表示升序,desc表示降序,如果不写默认为升序
2.order by 后面支持别名,单个字段,多个字段,表达式,函数 -
案例
#案例:查询员工信息,要求工资从高到低排序 SELECT * FROM employees ORDER BY salary DESC; #案例:查询部门编号>=90的员工信息,按照时间的先后顺序排列 SELECT * FROM employees WHERE department_id>=90 ORDER BY hiredate ASC; #案例 按照年薪的高低显示员工的信息和年薪[按照别名排序] SELECT *,salary*12*(1+IFNULL(commission_pct,0)) AS 年薪 FROM employees ORDER BY 年薪 DESC; #案例 按照员工姓名的长度进行排序[按照函数排序] SELECT LENGTH(last_name) AS 字节长度,last_name,salary FROM employees ORDER BY LENGTH(last_name) DESC; #案例 查询员工信息,先按工资升序排列,再按员工编号降序[多个字段排序] SELECT * FROM employees ORDER BY salary ASC,employee_id DESC;
常见函数介绍
字符函数
-
length 获取字符串的字节个数
-
concat 拼接字符串
-
upper,lower 大小写转换
-
substr 截取字符串
-
instr 返回子字符串自一次出现的索引
-
trim去除前后空格
-
lpad用指定的字符实现左填充为指定长度
-
RPAD 用指定的字符实现右填充为指定长度
-
replace 替换
-
代码
#length 获取参数值的字节个数 SELECT LENGTH('john'); #utf8 一个汉字占3个字节 SELECT LENGTH('你好hahaha'); #CONCAT 拼接字符串 SELECT CONCAT(last_name,'_',first_name) 姓名 FROM employees; #upper,lower 大小写转换 #将姓变大写,名变小写,然后拼接 SELECT CONCAT(UPPER(last_name),'_',LOWER(first_name)) 姓名 FROM employees; #substr 截取字符串 #注意:sql语句中索引从1开始 SELECT SUBSTR('你是谁的谁谁谁',2) SELECT SUBSTR('你是谁的谁谁谁',1,3) #案例,将姓名中国的首字符大写,其他字符小写,并使用_拼接 SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',LOWER(SUBSTR(last_name,2))) AS output FROM employees; #instr 返回子串第一次出现的索引,如果找不到返回0 SELECT INSTR('你是一个好人','好人') AS output; #trim 去前后空格 SELECT LENGTH(TRIM(' 好人 ')) AS output; SELECT TRIM('a' FROM 'aaaaa好人aaaaa啊aaaaa') AS output; #LPAD 用指定的字符实现左填充为指定长度 SELECT LPAD('NI',10,'*') AS OUTPUT; #RPAD 用指定的字符实现右填充为指定长度 SELECT RPAD('NI',10,'*') AS OUTPUT; #replace 替换 SELECT REPLACE('今天是个好天气好天气今天是','今天','周五') AS pm;
数学函数
#四舍五入
SELECT ROUND(1.45);#默认取整
SELECT ROUND(1.567,3);#小数点后保留3位
#ceil 向上取整 返回>=该参数的最小整数
SELECT CEIL(1.002);
#floor 向下取整,返回<=该参数的最大整数
SELECT FLOOR(-9.9);
#truncate 截断
SELECT TRUNCATE(1.6999999,2);
#mod 取余
/*
mod(a,b) a-a/b*b
与被除数有关
*/
SELECT MOD(10,3);
日期函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-96bUTt8d-1637852683310)(file:///C:\Users\雍星\AppData\Roaming\feiq\RichOle\49577038.bmp)]
#now 返回当前系统日期+时间
SELECT NOW();
#curdate 返回当前日期,不包含时间
SELECT CURDATE();
#curtime 返回当前时间,不含日期
SELECT CURTIME();
#可以获取指定的部分,年月日小时
SELECT YEAR(NOW()) 年;
SELECT MONTH(NOW()) 月;
SELECT MONTHNAME(NOW()) 月;
#str_to_date 将字符通过指定的格式转换为日期
SELECT STR_TO_DATE('2021-2-12','%Y-%m-%d') AS 日期;
#查询入职日期是1992--4-3的员工信息
SELECT * FROM employees WHERE hiredate = '1992-4-3';
#DATE_FORMAT 将日期转换为字符
SELECT DATE_FORMAT(NOW(),'%y年%m月%d日') AS op;
#查询有奖金员工的员工名,和入职日期
SELECT last_name,DATE_FORMAT(hiredate,'%m月-%d日 %y年') AS 入职日期
FROM employees
WHERE commission_pct IS NOT NULL;
其他函数
SELECT VERSION();
SELECT DATABASE();
SELECT USER();
流程控制函数
#1.if函数 if else 效果
SELECT IF(10>5,'大','小');
SELECT last_name,commission_pct,IF(commission_pct IS NULL,'没奖金哦','有奖金') 备注
FROM employees;
#2.case函数使用一: switch case效果
/*
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1;
when 常量2 then 要显示的值2或语句2;
...
else 要显示的值n或语句n;
end
*/