1、数据库概述
数据库库是存储、调用、分析数据的仓库,主要分为关系型数据库管理系统(RDBMS)与非关系型数据库管理系统两类
- 关系数据库是数据库应用的主流
- 关系型数据库以行和列的形式存储数据,这一系列的行和列被称为表,一组表组成数据库。
- 目前主流关系型数据库有Oracle、DB2、Microsoft SQL Server、MySQL等。
操作关系型数据库时使用的语言叫结构化查询语句,简称SQL结构化查询语言。
2、数据定义语言DDL
数据定义语言是用来对数据库管理系统中的对象进行“增删改查”操作的SQL语句,一般应用DDL语言对数据库不同对象进行定义操作时,需要提前具备相应数据库管理权限。
- 针对数据库对象的操作语言
- 针对数据表对象的操作语言
3、数据库基本命令
定义数据库
- 创建数据库:create database 数据库名称;
- 查看数据库:show create database 数据库名称;
- 查看数据库列表:show databases;
- 使用数据库:use 数据库名称;
- 删除数据库:drop database 数据库名称;
数据表-增删改查
- 创建数据表:create table 表名;
- 使用test数据库:use test;
- 创建员工信息表:
create table emp(
depid char(3),
depname varchar(20),
peoplecount int);
- 查看表是否创建成功:show tables;
- 删除数据表:drop table emp;
- 自增字段:
create table emp(
id int primary key auto_incerment,
name varchar(4) not null,
math int default 0,
minmax float unique);
数据表-约束条件
- 主键约束
单字段主键
create table emp(
primary key,
depname varchar(20));
多字段主键
create table emp(
depid char(3) primary key,
depname varchar(20)
peoplecount int,
primary key(depname,depid));
- 非空约束
create table emp(
depid char(3),
not null,
peoplecount int);
- 唯一性约束
create table emp(
primary key,
not null,
peoplecount int unique);
- 默认约束
create table emp(
primary key,
default,
peoplecount int unique);
数据表-修改数据表
- 修改数据表名:alter table emp rename emodep;
- 修改数据类型:alter table empdep modify depname varchar(30);
- 修改字段名:alter table empdep change depname dep varchar(30);
- 修改字段名+字段类型:alter table empdep change dep depname varchar(20);
- 添加新字段+添加约束条件:alter table empdep add maname varchar(10) not null;
- 修改字段排列顺序:
- 将顺序放第一位:alter table empdep modify maname varchar(10) first;
- 将a顺序放b顺序之后:alter table empdep modify maname varchar(10) after depid;
- 删除字段:alter table empdep drop maname;
数据库操作语言DML
- 数据填充insert/load:
- 插入数据: insert into 表名(字段1,字段2,...) values ......
- 导入外部数据: load data local infile '文件路径.txt' into table Mon fields terminated by '\t' ingore 1 lines;
- 数据修改update:
- 为字段赋值:update 表名 set 字段名 = 值;
eg:update fruits set f_name = concat('fruit_',f_name);
- 数据删除delete:
- 删除某字段:delete from fruits where f_id = 'b5';
数据库查询
- select 查询语法
select <目标列表组> from <数据源表名> where <元组选择条件>
group by <分列组> having <组选择条件>
order by <排序列1> <排序要求1>;
- 多表查询
将两个以上的数据表通过关键字段连接在一起,并从不同表中选取不同字段进行查询的方法
select a_list1,a_list2,a_list3,b_list1,b_list2,b_list3,concat(a_list1,b_list1)
from a join b on a.key = b.key
- 内连接:select <sekect_list> from a inner join b on a.key=b.key;
- 左连接:select <sekect_list> from a left join b on a.key=b.key;
- 右连接:select <sekect_list> from a right join b on a.key=b.key;
- 联合查询:select a.* from a union all select b.* from b
- 全连接查询:
select * from a left join b on key1=key2 union select * from a right join b on key1=key2
- 子查询:写在()中,把内层查询结果当做外层查询参照的数据表来用
查询操作符
and:用来联合多个条件进行查询,条件与条件之间是“和/且”的意思;
or:用来联合多个条件进行查询,条件与条件之间是“或”的意思;
in:判断某个字段的值是否在指定的集合中,若在指定集合中则满足查询条件,若不在则不满足;
between:判断某个字段的是否在指定的范围内,若在则满足查询条件,若不在则不满足;
like:用来匹配字符串是否相等,如果与指定的字符串相匹配,则满足查询的条件,否则不满足;
is null:用来判断字段的值是否为空值(null),如果为空值则满足查询条件,否则不满足;
其中not是可选参数,加上not表示字段不是空值是满足条件。
distinct:用来消除重复记录,达到数据去重作用;
- 操作符合子查询组合应用
any:表示满足其中任意一个条件即可
any
(select id from fruits where price between 10 and 20);
all:表示满足所有条件才满足:
all
(select price from fruits where price<=20);
exist:表示存在:select * from fruits where exist (select * from fruits where price>20);
as:可以将表和字段名重新命名为别的名称使用,只在查询中有效
limit:查询后只显示limit指定数字的行数结果
4、数据库常用函数
- 数学函数
abs(x) | 绝对值 |
bin(x) | 二进制(oct返回八进制,hex返回十六进制) |
exp(x) | e的x次方 |
greatest(x1,x2,x3,...,xn) | 最大值 |
least(x1,x2,x3,...,xn) | 最小值 |
ln(x) | x的自然对数 |
log(x,y) | x的以y为底的对数 |
mod(x,y) | x/y的模(余数) |
pi() | pi的值(圆周率) |
rand() | 0-1内的随机值 可以提供一个参数使随机数生成器生成一个指定值 |
floor(x) | 小于x的最大整数值(去掉小数取整) |
ceiling(x) | 大于x的最小整数值(进一取整) |
round(x,y) | 参数x的四舍五入的有y位小数的值(四舍五入) |
truncate(x,y) | x截短为y为小数的结果 |
sign(x) | 数字x的符合值(正数为1,负数为-1,0为0) |
sqrt(x) | 平方根 |
- 字符串函数
ascii(char) | ascii码值 |
bit_length(str) | 字符串的比特长度 |
concat(s1,s2,...,sn) | 将s1,s2,...,sn连接成字符串 |
insert(str,x,y,instr) | 将字符串str从第x位置开始,y个字符长的子串替换为字符串instr,返回结果 |
find_in_set(str,list) | 如果发现str,返回str在list中的位置 |
lcase(str)/lower(str) | 将所有大写字母给为小写 |
ucase(str)/upper(str) | 将所有小写字母给为大写 |
left(str,x) | 最左边的前x个字符 |
right(str,x) | 最右边的后x个字符 |
length(str) | 字符长度数 |
position(substr,str) | 子串substr在字符串str中第一次出现的位置 |
quote(str) | 用反斜杠转义str的单引号 |
repeat(str,srchstr,rpicstr) | str重复x次的结果 |
reverse(str) | 颠倒字符str |
rtrim(str) | 去掉字符串str开头的空格 |
trim(str) | 去掉字符串str开头和结尾的所有空格 |
- 日期及时间函数
date_format(date,fmt) | 依照指定的fmt格式格式化日期date值 |
from_unixtime(ts,fmt) | 依照指定的fmt格式,格式化unix时间戳ts |
monthname(date) | 返回英文月份名(eg:October) |
dayname(date) | 返回英文星期名(eg:Monday) |
now() | 当前日期和时间 |
curdate()/current_date() | 当前日期 |
curtime()/current_time() | 当前时间 |
quarter(date) | date在一年当中的季度(1-4) |
week(date) | date在一年当中的第几周(0-53) |
dayofyear(date) | date在一年当中的第几天(1-366) |
dayofmonth(date) | date在一个月当中的第几天(1-31) |
dayofweek(date) | date在一周当中的第几天(1-7) |
year(date) | 年份 |
month(date) | 月份 |
day(date) | 天数部分 |
hour(time) | 小时值 |
minute(time) | 分钟值 |
second(time) | 秒值 |
date(datetime) | 日期值 |
time(datetime) | 时间值 |
- 逻辑函数
- 空值函数
- ifnull(expression,alt_value)
- 判断函数
- if(expr1,expr2,expr3)
- 逻辑表达式
- case when expr1 then expr2 [when expr3 then expr4 ... else expr] end;
- 开窗函数
select *,avg(sal) over() 平均工资 from emp;
(2)partition by 子句:如查询各部门的平均工资
select *,avg(sal) over(partition by deptno);
- 其他函数
group_concat(col) | 由属于一组的列值连接组合而成的结果 |
cast() | 将一个值转换为指定的数据数据 |
数据表ER图
E-R图也称实体-联系图(Entity Relationship Diagram),用来描述现实世界的概率模型。