数据库(Database)是按照数据结构来组织、存储和管理数据的建立在计算机存储设备上的仓库
数据库是长期储存在计算机内、有组织的、可共享的数据集合
分类:
(1)非结构化数据:
(2)半结构化数据:
数据之间有着相同的存储结构 属性:值
每一条数据的属性可以不同
(3)结构化数据
创建在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据
数据之间有着相同的存储结构 属性 值
同一个结构模型中每一条数据的属性都是相同的,但是值有可能不同,这些数据非常便于存储和管理
于是针对这些数据,专门设计一套数据存储的软件,现在我们说的数据库主要用来存储这些数据
产品

问题
SQL
sql一般指结构化查询语言(Structured Query Language),简称SQL.
全世界所有的结构化数据库都适用
分类
DQL:Data Query Language 数据查询语言
定义数据库的一些组件 表 索引 视图 自增序列...
DML:Data Manipulate Language 数据操纵语言
数据库的增、删、改、查
DDL:Database Definition Language 数据定义语言
Create Drop Alter
- DCL:Data Control Language 数据库控制语言
权限
事务的提交:commit
事务的回滚:rollback
SQL语言属于第四代语言,而java c++ 才属于第三代
自己百度,我用的是Mysql80+Navicat16
关系模型中常用的概念
| 字段名 | 中文 | 类型 | 空? | 默认值 | 克其他说明 |
|---|---|---|---|---|---|
| EMPNO🔑 | 雇员编号 | int(11) | 否 | 主键 | |
| ENAME | 雇员名称 | varchar(255) | 是 | ||
| JOB | 岗位工种 | varchar(255) | 是 | ||
| MGR | 上级 | int(11) | 是 | ||
| HIREDATE | 雇佣日期 | date | 是 | ||
| SAL | 工资 | decimal | 是 | ||
| COMM | 奖金|津贴 | decimal | 是 | ||
| DEPTNO | 部门编号 | int(11) | 是 | 外键,dept表的deptno 关联 |
| 字段名 | 中文 | 类型 | 空? | 默认值 | 其他说明 |
|---|---|---|---|---|---|
| DEPTNO🔑 | 部门编号 | int(11) | 否 | 主键 | |
| DNAME | 部门名称 | varchar(255) | 是 | ||
| LOC | 地址 | varchar(255) | 是 |
| 字段名 | 中文 | 类型 | 空? | 默认值 | 其他说明 |
|---|---|---|---|---|---|
| GRADE | 等级 | int(11) | |||
| LOSAL | 最低薪资 | int(11) | |||
| HISAL | 最高薪资 | int(11) |
格式
select 列名*N from 表名 where 查询条件1 and/or 查询条件2 group by 列 Having 分组条 件 Order by 排序
规则
sql在书写的时候除了查询条件之外,大小写都可以
select * from user where uname ='zs';
SELECT * FROM USER WHERE UNAME = 'zs';
保持大小写风格
-- 属于SQL语句的注释
所有的查询条件为字符串时,需要用''进行修饰,否则就会当做列名去处理
select查询列和别名
emp是存储员工信息的表
- -- 查询所有员工信息(*通配符,默认查询所有的列)
- select * from emp;
- -- 查询员工的姓名
- select ename from emp;
- -- 查询员工的薪资 select sal from emp;
- -- 查询员工的姓名和薪资
- select ename , sal from emp;
- select ename sal from emp;
- select ename sal comm from emp;
- -- 查询员工的姓名和薪资,推荐使用单引号
- select ename '员工姓名', sal "薪资" from emp;
- -- 查询到的数据可以直接进行运算
- select ename ,sal ,sal * 12 from emp;
- select ename ,sal ,comm ,(sal+comm) * 12 from emp;
4.select的条件查询
普通条件查询 = > < != <> >= <=
- -- 查询员工编号为7369的员工
- select ename,sal from emp where empno = 7369;
- -- 查询员工姓名叫做
- SMITH select ename,deptno,job from emp where ename = 'SMITH';
- select ename,deptno,job from emp where ename = 'smith';
- -- 查询薪资大于2000的员工姓名
- select ename from emp where sal > 2000;
- -- 查询工作为SALESMAN
- select * from emp where job = 'SALESMAN';
- -- 查询部门在20的员工
- select * from emp where deptno = 20;
- -- 查询薪资不等于2000的员工
- select * from emp where sal != 2000;
- select * from emp where sal != 2000;
- -- 查询 员工编号 为 7369 7788 7881的员工信息
- select * from emp where empno in (7369,7788,7881);
- -- 查询 员工编号除了 7369 7788 7881之外的所有员工信息
- select * from emp where empno not in(7369,7788,7881);
- -- 查询除了10,20部门之外的所有员工
- select * from emp where deptno not in (10,20);
- -- 查询不发放津贴的员工信息
- select * from emp where comm is null;
- -- 查询发放津贴的员工信息
- select * from emp where comm is not null;
空值(Empty Value):
NULL:
0:
- -- 查询薪资范围在1000-4000之间的员工信息 [1000.4000]
- select * from emp where sal between 1000 and 4000;
- -- 查询名字中有S的员工
- select * from emp where ename like '%S%';
- -- 查询名字最后一个字符是S
- select * from emp where ename like '%S';
- -- 查询名字第一个字符是S
- select * from emp where ename like 'S%';
- -- 查询名字第二个字符是A
- select * from emp where ename like '_A%';
- -- 查询名字中有%的员工
- select * from emp where ename like '%\%%';
- -- 查询名字第8 188个字符是A,这是需要一些特殊的手段-》函数
- -- % 代表任意字符的任意次数 _任意字符的一次
(1)and 必须前后同时满足条件才能返回结果
(2)or前后有一个满足条件就能返回结果
- -- 查询在20部门并且薪资大于2000的员工
- select * from emp where deptno =20 and sal >2000;
- -- 查询在20部门或者薪资大于2000的员工
- select * from emp where deptno = 20 or sal >2000;
- --查询不在20部门并且薪资小于2000的员工
- select * from emp where deptno <> 20 and sal <2000;
5.select结果排序 order by
使用asc是升序排列(默认),使用desc可以降序排序
单列
- -- 按照薪资进行排序(默认升序)
- select * from emp order by sal;
- -- 按照薪资进行排序(降序)
- select * from emp order by sal desc;
- -- 按照薪资进行排序(升序)
- select * from emp order by sal asc;
- -- 按照津贴进行排序(null排在最前面)
- select * from emp order by comm;
- -- 多个排序的列
- select * from emp order by deptno,sal;
- -- 多个排序的列(部门升序 薪资降序)
- select * from emp order by deptno,sal desc;
- -- 多个排序的列(工作,薪资)
- select * from emp order by job,sal;
6.select结果分页
- -- 每次查询前N行
- SELECT
- *
- FROM
- emp
- LIMIT 4;
-
- -- 查询第N页,每页显示M个
- select * from emp limit 0,3;
- select * from emp limit 3,3;
- select * from emp limit 6,3;
- select * from emp limit (n-1)*M,M;
- -- 查询薪资大于1000的逆序排列,然后显示前5条记录
- select * from emp where sal >1000 order by sal desc limit 0,5 ;
7.SQL语句错误
select enane from emp
1054 - Unknown column 'enane' in 'field list'
将来出现错误的时候,直接将错误编号输入到百度查询或者询问Gpt3.5即可
函数都是数据口提前给我们准备好的,所以我们可以直接可以调用,使用函数可以让指定的列计算出我们需要的数据
单行函数
指的是操作一行数据返回一行数据,操作10行数据返回10行数据
字符串函数
| 函数名称 | 作用 |
|---|---|
| LENGTH | 计算字符串长度函数,返回字符串的字节长度 |
| CONCAT | 合并字符串函数,返回结果为连接参数产生的字符串,参数可以是一个或多个 |
| INSERT | 替换字符串函数 |
| LOWER | 将字符串中的字母转换为小写 |
| UPPER | 将字符串中的字母转换为大写 |
| LEFT | 从左侧截取字符串,返回字符串左边的若干个字符 |
| RIGHT | 从右侧截取字符串,返回字符串右侧的若干个字符 |
| TRIM | 删除字符串左右两侧的空格 |
| REPLACE | 字符串替换函数,返回替换后的新字符串 |
| SUBSTRING | 截取字符串,返回从指定位置开始的指定长度的字符串 |
| REVERSE | 字符串反转(逆序)函数,返回与原始字符串顺序相反的字符串 |
- -- 长度
- - select ename,length(ename) from emp;
- -- 截取
- - select ename,SUBSTR(ename,1,3) from emp;
- - select * from emp where substr(ename,5,1)='S';
- -- 大小写
- - select ename, upper(ename),lower(ename) from emp;
- -- 拼接
- - select CONCAT(empno,'=',ename) from emp;
- -- 替换
- - select ename,REPLACE(ename,'T','—') from emp;
| 函数名称 | 作用 |
|---|---|
| CURDATA 和 CURRENT_DATE | 两个函数作用相同,返回当前系统的日期值 |
| CURTIME 和 CURRENT_TIME | 两个函数作用相同,返回当前系统的时间值 |
| NOW 和 SYSDATE | 两个函数作用相同,返回当前系统的日期和时间值 |
| UNIX_TIMESRAMP | 获取UNIX时间戳函数,返回一个以UNIX时间戳为基础的无符号整数 |
| FROM_UNIXTIME | 将UNIX时间戳转换为时间格式,与UNIX_TIMESTAMP互为反函数 |
| MONTH | 获取指定日期中的月份 |
| MONTHNAME | 获取指定日期中的月份英文名称 |
| DAYNAME | 获取知道那个日期对应的星期几的英文名称 |
| DAYOFWEEK | 获取指定日期对应的一周的索引位置值 |
| WEEK | 获取指定日期是一年中的第几周,返回值的范围为052或153 |
| DAYOFYEAR | 获取指定日期是一年中的第几天,返回值范围是1~366 |
| DAYOFMONTH | 获取指定日期是一个月中的第几天,返回值范围是1~31 |
| YEAR | 获取年饭,返回值范围是1970~2069 |
| TIME_TO_SEC | 将时间参数转换为秒数 |
| SEC_TO_TIME | 将秒数转换为时间参数,与TIME_TO_SEC互为反函数 |
| DATE_ADD 和 ADDDATE | 两个函数功能相同,都是向日期添加指定的时间间隔 |
| DATE_SUB 和 SUBDATE | 两个函数功能相同,都是向日期减去指定的时间间隔 |
| ADDTIME | 时间加法运算,在原始时间上添加指定时间 |
| SUBTIME | 时间减法运算,在原始时间上减去指定时间 |
| DATEDIFF | 获取两个日期之间间隔,返回参数1减去参数2的值 |
| DATE_FORMAT | 格式化指定的日期,根据参数返回值那个格式的值 |
| WEEKDAY | 获取指定日期在一周内的工作日索引 |
- -- 获取当前系统时间
- - select hiredate,sysdate() from emp;
- - select hiredate,CURRENT_DATE(),CURRENT_TIME(),CURRENT_TIMESTAMP() from emp;
- -- 日期转换
- - select DATE_FORMAT(sysdate(),'%Y-%m-%d %H:%i:%s')
- - select hiredate, date_format(now(),'%Y年%m月%d日 %H时%i分%s秒') from emp;
- -- 分别获取 年月日 时分秒 星期
- - select
- - SECOND MINUTE HOUR DAY WEEK MONTH YEAR
- -- 日期的加减操作
- - select hiredate,ADDDATE(hiredate,9),ADDDATE(hiredate,-9) from emp;
- - select DATE('2012-11-11') ;
| 函数名称 | 作用 |
|---|---|
| ABS | 求绝对值 |
| SQRT | 求二次方根 |
| MOD | 求余数 |
| CEIL 和 CEILING | 两个函数功能相同,都是返回不小于参数的最小整数,即向上取整 |
| FLOOR | 向下取整,返回值转化为一个BIGINT |
| RAND | 生成一个0~1之间的随机数,传入整数参数时,用来产生重复序列 |
| ROUND | 对所传参数进行四舍五入 |
| SIGN | 返回参数的符号 |
| POW 和 POWER | 两个函数的功能相同,都是所传参数的次方的结果值 |
| SIN | 求正弦值 |
| ASIN | 求反正弦值,与函数SIN互为反函数 |
| COS | 求余弦值 |
| ACOS | 求反余弦值,与函数COS互为反函数 |
| TAN | 求正切值 |
| ATAN | 求反正切值,与函数TAN互为反函数 |
| COT | 求余切值 |
- -- 向上取整 向下取整
- - select ceil(12,1),floor(12.9)
- -- mod abs pow PI rand round TRUNCATE(直接进行截取,不进行四舍五入)
- -- 保留多少位有效数字
- - select round(1.4999999,2),round(1.4999999),round(1.4999999,-1)
- - select TRUNCATE(1.4999999,2)
- -- 日期--》字符串
- - date_format(date,expr)
- - select DATE_FORMAT(sysdate(),'%Y-%m-%d %H:%i:%s');
- -- 字符串--》日期
- - 要注意字符串和格式的匹配
- - select STR_TO_DATE('2020-4-16 17:15:24','%Y-%c-%d %H:%i:%s');
- -- 数字--》字符串
- - 直接拼接一个字符串即可,可以自动转换
- -- 字符串--》数字
- - 依靠函数提供的参数
转换函数
(1)空值的处理
if null (exp1,exp2) exp1 != null ? exp1 : exp2
select IFNULL (comm,888) from emp;
(2)加密算法
select MD5('123456');
select
AES_ENCRYPY('123456','abcd'),AES_DECRYPT(AES_ENCRYPT('123456','abcd'),'abcd')
今天就预习到这里后续有时间会在继续补充的,有点小累!!!