校招面试整理出来的,比较简单,给自己记笔记用的。
数据库中常用的概念
DB:database:”数据库“,存储数据的容器
DBSM:数据库管理系统 , 数据库管理软件
sql:结构化查询语言,御用数据库通讯的语言,不是某个软件特有的,而是所有主流数据库软件通用的语言
数据库存储的特点
数据存放到表中,然后表放在库中
一个库有多张表,每张表有唯一的表名
表中有一个或多个列,列又称为字段,相当于属性
表中的每一行数据,都是后端语言的一个对象
1.基础
-
显示表的结构
DESC TBALE1; DESC是description的缩写
-
基础查询select
select 查询列表 from 表名
-
语法的执行顺序
select name1 , name2 //3 from table1 //1 where name = 'xxx'; //2
-
起别名的方式
-
使用as
-
使用空格 。如果使用空格,就要注意别名不要有空格,如果有空格,则用引号
-
-
去重
如果查询的某个字段在存在多个重复,那么使用
DISTINCT
select DISTINCT name FROM TABLE1;
-
‘+’的作用
select 90+100;
select '123' + 90; 会将‘123’转化为数字进行操作
select 'add' + 90; 如果‘add’转化不成数字,变为0
select null + 90; 只要其中一个为null,则全为null
-
将查询到的两个字段进行拼接:
concat
select concat(name1 , name2) as name from table1;
-
判断是某个字段值是否为空
因为在使用
+
或者是concat
的时候 ,如果是name1
为nullselect concat(name1 , name2) as name from table1;
那么输出的字段的那一列都是null
判定是不是null的语句
-- select IFNULL(字段 ,null的时候的默认值) as 奖金率 , 不是null的返回值(基本上不是null就是返回这个字段了) from table1 select IFNULL(name1 , 0) AS 姓名 , name1 FROM TABLE1 ; -- 如果是在使用concat(name1 , name2)的时候 name1为null , 可以如下操作 select concat(IFNULL(name1 , 0) , '-' , name2) from TABLE1;
-
条件查询
/*select 查询列表 from 表名 where 筛选条件 分类:按条件表达式筛选 按条件表达式筛选 1.条件运算符 > 、 < 、 = 、 <>(不等于) 、 >= 、 <= 2.逻辑表达式进行筛选 && , || , ! 或者是 not , and , or 3.模糊查询 like , betweent...and... , in , is null */
-
模糊查询:
-
like:
一般和通配符一起使用通配符:
%:任意多个字符,包括0个字符
_:占一个位置
案例:
1.搜素包含a字符的
select name1 from table1 where name1 like '%a%';
2.搜索第三个字符为a,第五个字符为m的
select name1 from table1 where name1 like '__a_m%'
3.搜索第二个字符为_的(支持使用
\
进行转义)select name1 from table1 where name1 like
'_\_%'
同时还支持自定义转义字符(
使用 ESCAPE 转义字符
)select name1 from table1 where name1 like
'_$_%'
ESCAPE '$'
-
between and
在区间[a ,b]之间
-
in
用于判断某字段的值是否属于in列表中的某一项
in列表中的值要必须一致或者是兼容(可以转换成同一种)
不支持转义 , 是使用
_或者是%
select name1 , cname from table1 while name in ('xxx' , 'ooo' ,'ggg');
-
is null
sql语句中当判断某个值是null的时候,不能使用 类似
id=null
,应该换成is null
不为空的时候 使用
is not null
-
安全等与 <=>
-
-
2.常见函数
2.1.字符函数
length(str) 【获取字符串的长度 ,返回的是字节数 , 一个汉字是三个子节 ,使用的utf8】
-- 子节长度为4
SELECT LENGTH('addd') as 子节长度;
-- 子节长度为15 一个函数3个子节
SELECT LENGTH('用户输入123') 字节长度;
concat 【连接字符或是字符串】
-- aaa-- -ccc
SELECT CONCAT('aaa','#','ccc')AS 字符;
lower(str) , upper 【转换大小写】
-- AUSTIN-- david
SELECT CONCAT(UPPER(last_name), '# ' ,LOWER(first_name)) AS con_name from employees;
substr,substring 【截取字符串】
注意sql中索引从1开始
-- 从第4个开始(注意sql的索引是从0开始的) 结果:建数据工具
SELECT SUBSTR('查询创建数据工具' , 4) AS text;
-- 从第4个开始,截取3个长度
SELECT SUBSTR('查询创建数据工具' , 4 , 3) AS text;
instr(str1 , str2) 【返回str2在str1的起始索引 , 如果找到返回索引值,如果找不到返回0】
-- 能够匹配到字符串 结果:3
SELECT INSTR('查询创建数据工具','创建') AS 位置;
-- 匹配不到字符串 结果:0
SELECT INSTR('查询创建数据工具' , '吹牛') AS location;
trim(str) 【去除前后空格】
-- 结果:14
SELECT LENGTH(' 查询 ') as length;
-- 结果:6
SELECT LENGTH(TRIM(' 查询 ')) AS length;
LPAD(str , 长度 , 填充字符(如'*')) 【用指定的字符实现左填充指定长度】
-- LPAD(str,len,padstr) 结果:****创建查询工具
SELECT LPAD("创建查询工具",10,'*') AS text;
replace(str , 要替换的 , 替换成的) 【替换】
-- REPLACE(str,from_str,to_str) 结果:创建查询数据工具
SELECT REPLACE('创建查询工具','查询','查询数据') AS text;
-- 要替代的字符或者是字符串不在整个字符串中,返回原字符串 结果:创建查询工具
SELECT REPLACE('创建查询工具','mm','查询数据') AS text
2.2.数学字符
round(num) 四舍五入
-- 结果:1
SELECT ROUND(1.333) as num;
-- 结果:2
SELECT ROUND(1.545) as num;
-- 结果:1.333 第二个参数是保留的小数位
SELECT ROUND(1.3334 , 3) as num;
-- 结果:1.334
SELECT ROUND(1.3336 , 3) as num;
ceil(num) 【向上取整,返回>=该参数的最小整数】
-- 向上取整 结果:2
SELECT CEIL(1.1) as text;
-- 结果:1
SELECT CEIL(1.0) AS text;
floor(num)
-- 向下取整 结果:1
SELECT FLOOR(1.1) as text;
-- 结果:1
SELECT FLOOR(1.0) as text;
truncate(num , n)【截断 保留n位小数,后面的值截取掉】
-- 直接从小数点后第二位进行劫取 结果:1.22
SELECT TRUNCATE(1.222,2) as text;
-- 结果:1.22
SELECT TRUNCATE(1.227,2) AS text;
mod【取余】
mod的算法 mod(a , b) <=> a - a / b * b;
-- 取余 结果:2
SELECT MOD(5,3) AS text;
2.3.日期函数
-
now 【返回系统当前的日期+时间】
-
curdate 【返回系统当前的日期 , 不包含时间】
-
curtime 【返回当前的时间,不包含系统日期】
-
可以获取指定的部分 year() , mounth() 等。 年,月,日,小时,分钟,秒
-- 结果:2020-10-21 15:53:59 SELECT NOW() AS time; -- 结果:2020-10-21 SELECT CURDATE() AS time; -- 结果:2020-10-21 SELECT CURTIME() AS time; -- 结果:2020 SELECT YEAR(NOW()) as time; -- 结果:10 SELECT MONTH(NOW()) as time;
-
-- 格式化字符串里的时间,要注意前面的字符串是什么样的,后面的就是什么样的,只是要将里面的数字换成格式符
-- 结果:2008-05-03
SELECT STR_TO_DATE('03-05 2008','%d-%m %Y') AS time;
-- 将时间格式化 结果:2020年10月21日
SELECT DATE_FORMAT(CURDATE(),'%Y年%m月%d日') as time;
2.4.其他函数
2.5.流程控制函数
-
if函数 【三个参数类似于三元表达式】
SELECT last_name , salary , IF(ISNULL(commission_pct),'哈哈哈没奖金','搞得不丑') AS 备注 FROM employees;
-
case函数
/* 查询的参数是个范围 工资大于20000 等级A 大于18000 等级B 大于14000 等级C 其他 等级D */ SELECT last_name , salary , CASE WHEN salary > 20000 THEN 'A' WHEN salary > 18000 THEN 'B' WHEN salary > 14000 THEN 'C' ELSE 'D' END AS level FROM employees ORDER BY salary DESC; /* 查询的参数是指定的值 部门id为100 工资*1.1 部门id为101 工资*1.2 部门id为102 工资*1.5 其他 不变 */ SELECT last_name , department_id , salary AS 原始工资 , CASE department_id WHEN 100 then salary*1.1 WHEN 60 THEN salary*1.2 WHEN 90 THEN salary*1.5 ELSE salary END AS 最终工资 FROM employees;
2.6.测试
-
显示系统时间
-
查询员工号,姓名,工资,以及工资提高20%后的结果(new salary)
-
将员工的姓名按照首字母排序,并输出 首字母 , 姓名的长度 , 姓名 ,
-
做一个查询,产生下面的结果
<last_name> earns <salary> monthly but wants <salary*3>
king earns 3000 monthly but wants 9000
-
使用case -when , 按照下面条件,输出last_name , salary , job_id , grade
job grade
AD_PRES A
ST_MAN B
IT_PROG C
-- 1. 显示系统时间
SELECT NOW() ;
-- 2. 查询员工号,姓名,工资,以及工资提高20%后的结果(new salary)
SELECT employee_id , last_name , salary , salary * 1.2 AS "new salary"
FROM employees;
-- 3. 将员工的姓名按照首字母排序升序,并输出 首字母 , 姓名的长度 , 姓名
-- 要注意的是按照首字母排序,和按照last_name排序是不同的,因为如果是按照last_name排序的时候,会先使用第一个字母排,然后再使用第二个字母排,直到最后一个
SELECT SUBSTR(last_name , 1 , 1) AS 首字母 , LENGTH(last_name) AS 长度 , last_name
FROM employees ORDER BY 首字母;
-- 4. 做一个查询,产生下面的结果
--
-- <last_name> earns <salary> monthly but wants <salary*3>
--
-- king earns 3000 monthly but wants 9000
SELECT CONCAT(last_name, ' earns ' , salary , ' monthly but wants ' , salary*3) AS text
FROM employees;
--
-- 5. 使用case -when , 按照下面条件,输出last_name , salary , job_id , grade
--
-- job grade
--
-- AD_PRES A
--
-- ST_MAN B
--
-- IT_PROG C
--
SELECT last_name , salary , job_id ,
CASE job_id
WHEN 'AD_PRES' THEN
'A'
WHEN 'ST_MAN' THEN
'B'
WHEN 'IT_PROG' THEN
'C'
END AS grade
FROM employees;