数据库:
概述
用来存储数据管理数据的仓库
分类:关系型数据库MySQL 和 非关系型数据库Redis
SQL语言
概述:
结构化查询语言,用来操作数据库的语言,是一种标准.
分类:
DML(Data Manipulation Language)是数据操纵语言
DDL(Data Definition Languages)是指数据定义语言
DCL(Data Control Language)是指数据控制语言
DQL:(Data QueryLanguage)是指数据查询语言
1.数据库的常见操作:
创建数据库
create database 库名; create database kuming;
create database 库名 default character set utf8;防止中文乱码
create database 库名 charset utf8;简写方式
展示所有的数据库
show database;
删除库
drop database 库名字; drop database kuming;
2.表的常见操作:
使用指定的数据库
user 库名字; user kuming;
创建表
create table 表名(字段名称 字段类型(字段长度),字段2,字段3,...)
create table a(name varchar(40),字段2,字段3,...)
查看表
show tables;
修改表(添加字段)
alter table 表名 add column 字段名 字段类型(字段长度);
alter table b add column aaa varchar(40);
查看表结构
desc 表名; desc a;
删除表
drop table 表名字; drop table biaoming;
3.数据的常见操作:
查询表中的数据/记录
select * from 表名; select * from b; *是通配符 意思是查所有
插入表中的数据
insert into 表名 values(值1,值2,值3,值4) insert into b values('a',1,'a','a');
表中有多少字段就需要添加多少值,顺序不能改变,字符串类型需要用' '或者" "包裹
修改表中的数据/记录
update 表名 set 字段名='字段的值';
update b set name='a';
这个是把字段的所有的值都修改了 一般不用
update 表名 set 字段名='字段的值' where 字段名字='字段的值'
update b set name='nex' where nex='a'
通常这样写 where 后面添加的是条件 只修改那一行的记录
删除表中的数据/记录
delete from 表名字; delete from b; 这是指删除表中所有的记录 一般不用!
delete from 表名字 where 字段名='字段的值'; delete from b where age=11;
这是指删除b表中age=11的那一条记录
字段约束
1.非空约束
哪个字段添加了非空约束,从此,字段值不能为空,使用not null
create table a(a int not null);
2.唯一约束
哪个字段添加了唯一约束,从此,字段值不能相同,使用unique
create table a(a int unique)
3.主键约束
每个表都应该设计主键 , 主键是每条记录/数据的唯一标识
现象: 字段的值必须唯一且不能为空,使用primary key
create table a(id int primary key);
主键 = 唯一 + 非空;
设置主键自增策略
主键自增策略: 使用auto_increment,让主键的值交给数据库自动维护,实现自动递增
create table a(id int primary key auto_increment)
基础函数的使用
upper–全转大写
select upper(name) from b;
lower–全转小写
select lower(name) from b
length–求长度
根据utf-8,一个字母或者数据长度为1,一个汉字长度为3
select length(name) from b
substr–截取子串
substr(name,1) 括号里面name是要截取的字段名,1是从第几个开始截取
select substr(name,1),name from b
substr(name,1,5) 括号里面name是要截取的字段名,1是从第几个开始截取,5是截取几个数据
select substr(name,1,5),name from b
concat–拼接字符串
concat(name,'阿巴阿巴'); 括号里面name是需要拼接的字段名,后面是拼接的内容
select concat(name,'阿巴阿巴') from b
后面可以无限拼接
select concat(name,'阿巴阿巴'...) from b
replace–替换
replace(name,'a','苹果'); name是字段名,后面指的是把a换成苹果
select replace(name,'a','苹果'),name from b
ifnull-替换数据中的null值
ifnull(name,10); name是字段名,后面是要把null替换的值
select ifnull(name,10) from b;
对小数的函数:
select age,round(age) from a; 四舍五入,取整
select age,round(age,1) from a; 四舍五入,保留一位小数
select age,ceil(age) from a; ceil向上取整
select age,floor(age) from a; floor向下取整
对日期数据的函数:
select now(); 当前时间
select year(now()); 当前年
select month(now()); 当前月
select day(now()); 当前日
select hour(now()); 当前时
select minute(now()); 当前分
select second(now()); 当前秒
select uuid(); 生成一个32位的随机数
\表示转义符号,把'当做普通的字符在使用而不是字符串的标识
select 'xi\'an'
条件查询:
基础语法
去重distinct
select distinct age from a
查询年龄不是18的数据
select * from a where age!=18;
select * from a where age<>18; <>表示不等于,效果同上
查询年龄是18并且名字叫rosi的人
select * from a where age=18 and name='rosi'
查询年龄是18或者年龄是19的人
select * from a where age=18 or age=19
select * from a where age in(18,19) 效果同上,意思是括号里的都包含
模糊查询like
%是统配符,通配0-n个字符,_通配一个字符;
查询名字里面包含a的人;
select * from a where name like '%a%';
查询名字首字母是a的人;
select * from a where name like 'a%';
查询第二个名字是a的人;
select * from a where name like '_a';
条件查询
1.null
null的数据用 is / is not 关键字来过滤
查询没有工资的员工信息
select * from a where gongzi is null
查询有工资的员工信息
select * from a where gongzi is not null
2.between and
查询工资5000-10000的员工信息
select * from a where gongzi between 5000 and 10000
3.limit分页
select * from a limit 2; 只取前两条
select * from a limit 0,2; 从第n+1条数据开始,总共展示两条
select * from a where gongzi>10000 limit 0,2; limit通常放在最后
4.order by
order by排序,按照字典顺序排,汉字查码表编号,默认升序ASC
按照工资升序排序
select * from a order by gongzi; 默认升序
select * from a order by gongzi asc;
按照工资降序排序
select * from a order by gongzi desc;
聚合函数
概述:
基础函数:
upper lower length concat substr replace ifnull now()/date()/year()…
聚合函数:
把一个字段的值聚合起来,进行获取最大值,最小值,平均数,求和,求个数…
max() min() sum() avg() count()
测试
聚合函数 max min sum avg
分别是 最大值 最小值 求和 平均数
select max(gongzi),min(gongzi),sum(gongzi),avg(gongzi) from a
求总记录数 count
select count(*) from a; 低效(新版本说效果一样)
select count(1) from a; 高效
select count(name) from a; 了解,不推荐
统计工资大于1w的人数
select count(1) from a
where gongzi>10000
分组
概念:把表里的所有数据 按照 合理的维度 分成不同的组
1.group by
当查询中出现了混合列(聚合列和非聚合列),必须分组,通常按照非聚合列分组
统计每个部门的平均工资
select avg(gongzi),bumen from a
group by bumen
2.having
如果分组后的数据还想继续过滤,就需要使用having
group by跟having是固定搭配
统计每个部门的平均工资,并且只要工资>10000的部门
select avg(gongzi),bumen from a
group by bumen
having avg(gongzi)>10000
能用where尽量用where,where高效,因为执行时机早一些
事务
概述
1,数据库事务用来保证 多个SQL 要么全成功,要么全失败.英文叫transaction.
MySQL数据库会自动管理事务,Oracle数据库需要程序员管理事务.
MySQL也允许程序员手动管理事务
2,事务的四大特征:ACID
原子性: 把多条SQL看做一个原子密不可分,要么全成功,要么全失败
一致性: 保证数据守恒,将来广泛的应用到分布式系统里
隔离性: MySQL数据库可以支持高并发,可能会有数据安全的隐患,也有复杂的隔离级别
持久性: 对数据库的操作增删改,有持久影响
3,隔离级别:
read uncommitted读未提交:性能好,但是安全性差
read commited读已提交:是Oracle数据库默认的隔离级别,性能较差,但是安全性较好
repeatable read可重复读:是MySQL数据库默认的隔离级别,性能再差一点,但是安全性特别好
Serializable串行化:性能非常差,但是安全性比较好
也可以查:SELECT @@tx_isolation;
开启事务 start transaction 提交事务 commit
测试
start transaction; 开启事务
insert into a values('rosi',18,18888.88,'二'); 执行增删改SQL
commit; 提交事务commit,不提交是查不到的,没有持久影响
多次插入数据
insert into a values('rosi',18,18888.88,'二');
insert into a values('jack',18,8888.88,'二');
批量插入:高效,因为只需要开启关闭一次事务
insert into a values
('rosi',18,18888.88,'二'),('jack',18,8888.88,'二');
字段约束
1.默认约束
default,给字段设置默认值
create table a(
id int primary key auto_increment,
sex varchar(10) default '男' 默认性别是男
)
2.检查约束
check,给哪个字段添加了检查约束,字段的值必须符合检查的条件才可以
create table a(
id int primary key auto_increment,
age int,
check(age<200 and age>0)
)
3.外键约束
准备两张表使用以下外键约束
create table d(
id int primary key auto_increment,
name varchar(20),
age int,
sex char(1) default '男' 默认约束
)
create table e(
id int primary key,
address varchar(20),
foreign key(id) references d(id) foreign(当前表的主键名) references 对方表(对方的主键)
)
使用外键的约束:
约束的情况1:子表的主键值 必须取自 主表的主键值
约束的情况2:主表的记录不能随便删除,要保证没有被子表使用才可以删