(1)DB:
DataBase(数据库,数据库实际上在硬盘上以文件的形式存储)
(2)DBMS:
DataBase Management System 数据库管理系统
mysql/Oracle/DB2/Sybase/sqlservrt
(3)SQL:是一门标准通用的查询化语言 适合于所有的数据库产品 SQL属于高级语言 只要能看懂单词 写出来就明白了什么意思 SQL执行时候 实际上内部也会先进行编译然后在执行
DBMS负责执行SQL语句 通过执行SQL语句来操作BD中的数据
表是数据库的基本组成单元,所有的数据都以表格的形式组织,谜底是增强可读性
一个表 包含行 和 列
行:被称为数据/记录
列:字段 column
每一个字段包含字段名 数据类型 相关约束
1.DQL: 数据查询语言 查询语句 凡是select语句都是dql
2.DML:数据操作语言 insert delete update 对表当中的数据进行增加 删除 修改
3.DDL:数据定义语言 create drop alert 对表结构的增删改
4.TCL:事务控制语言 commit 提交事务 rollback 回滚事务
5.DCL:数据控制语言 grant 授权 revoke 撤销权限等
1-3常用
所有代码命令以 ; 结尾
1.打开数据库
mysql -u 用户名 -p 密码;
2.查看数据库
show databases;
3.创建属于自己的数据库
create database 表名;
4.使用数据库中某一个
use 表名;
5.查看当前使用的数据库中的表
show tables;
6.初始化数据
source 路径
7.删除数据库
drop database 表名;
8.查看表结构
desc 名字;
select 字段1,字段2 from 表名
select 字段 from 表名 where 查询条件;
注:在数据库中null不是一个值 不能用等号衡量 只能用 is null 或者
is not null
%任意多个字符 _代表任意一个字符
select 字段 from 表名 where name like ‘%o%’
查询表中带o字符的所有名字字段
order by 排序条件可以多个 从左到右执行 左边权重最大 只有左边无法完成排序时候 才能有执行 而且 orderby 语句在SQL语句中执行顺序是处于最后执行的.
注意:默认排序为升序 指定升序用 asc 降序是的desc
select name,grand from user order by grand (asc/desc)
特定:输入多行 输出一行
count:查找的对象 计算个数
sum:和
Max:最大值
Min:最小值
Avg:平均数
分组函数自动忽略null
单行处理函数 : 输入一行 输出一行
空处理函数:if null
注意:分组函数不能直接作用于where当中作为条件运算
select name,sal from n where sal>avg(sal)//错误
count(字段) count(*)区别?
count *不能统计某个字段的个数 而是统计总记录条数
count 某个字段 表示统计某个字段不能空的数据总量
6.group by / having
按照某个字段或者某些字段进行分组
having:是对分组后的数据进行再次过滤
当一条语句中有group by 的话
select 后面只能跟分组函数和参加分组函数的字段
分组字段可以有多个
找出不同编号的每个工作岗位的最高薪资
select max(sal),job,id from emp group by id,job
distinct
select distinct job from rmp //去重重复的工作名
注意:distinct语句只能出现在最前方 如果出现在后方 很可能出逻辑错误
在实际开发中 大部分的情况不是单表查询 一般都是多表查询 比如 学生和班级就是两张表
连接查询分为两种92不用了/99新语法 常用
按照表的连接方式划分:
内连接:
等值连接 非等值连接 自连接
外连接:
左外连接 右外连接
全连接
笛卡尔积现象:
如果两张表没有过滤条件 name输出结果将会是两张表中数据的乘积。注意:即使使用了过滤条件避免了笛卡尔积现象 但是他的乘积数不会改变 因为他要过滤时候需要一一判断是否匹配 然后输出有效数据
表的别名:执行效率高 可读性好
select e.ename,d.dname from emp e,dept d;
等值连接
最大特点是条件的等量关系
查询每个员工的部门名称 要求实现员工名 部门名
92:
select e.ename,d.dname from emp e,dept d where e.no=d.no
99:
select e.ename,d.dname
from emp e
join dept d
on e.no=d.no
//因为条件on中的条件是相等 所以是等值连接
99的语法结构清晰 表的连接条件和后来的where分离
非等值连接:最大特点是on后的判断条件不是等值,可能使用一个区间也可能是大于某某 可以用between and等条件
自连接:特点 一张表看做两张 自己连接自己用
内连接和外连接区别
内连接 : 假设ab表进行连接 使用内连接 凡是ab表中能匹配上的记录出来就是内连接 ab表没有主次之分 都是平等的
外连接:解释两表使用外连接 两个表中一个是主表一个是副表主要查询的是主表中的数据 捎带上副表中的数据 当副表中的数据没有和主表匹配上 副表内自动模拟出null与之匹配
外连接:
左外连接 :表示左边表为主表
右外连接:表示右边表示主表
写法:
...
a
(left/right) join
b
on
判断语句
外连接最重要的特点就是:主表中的数据无条件的全部查询出来
也就是嵌套查询
使用在select 或者from或者where后面都可以
放到from后最常用
mysql> select t.*,s.grade
-> from (select deptno ,avg(sal)as avgsal from emp group by deptno) t
-> join salgrade s
-> on t.avgsal between s.losal and s.hisal;
union:可以将查询结果相加 可以将两张完全不相干的表连接
这是mysql特有的 其他数据库不通用
limit去结果集中的部分数据
语法机制:limit startindex length;
startindex 表示初始位置 0表示第一条数据
length 长度
取出工资前五的员工
Select
ename,sal
from
emp
order by
sal desc
limit 0,5;
----------------------------
Select
ename,sal
from
emp
order by
sal desc
limit 5
limit 的优先级是最后执行
语法结构:
create table 表名(
字段名1 数据类型,
字段名2 数据类型
);
常见的数据类型
类型 | |
---|---|
int | 整数型 |
bigint | 长整型 |
float | 浮点型 |
char | 定长字符串(java中的String) |
varchar | 可变长字符串(java中Stringbuffer) |
date | 日期类型 |
blob | 二进制大对象 存储视频 图片 |
clob | 字符大对象 存储较大的文本 |
char和varchar的选择
在实际开发中 当某个字段中的数据长度不可发生改变时候 是定长的用char 比如 生日 性别。 当一个字段的数据长度不确定时候 例如 简介 姓名 用 varchar
注意:当你执行插入语句之后 表格中一定会多出一条数据 即使数据中某些值没有达到预期 只能用update更新
语法结构:
insert into 表名(字段1,字段2)values(数据1,数据2);
注意:这个顺序是可以打乱的 可以先输入姓名再输入学号也可以
只要前后顺序对应就好 不填默认是null
也可以一次插入多条数据
Insert into t_student(no,name,sex,classno,birth)
values
(1,‘zhangsan’,‘1’,‘1001’,‘1999-10-20’),
(。。。。),
(。。。。);
也可以不写values前面的字段名 但是不写时候必须后面值和你创建表时候定义的顺序一一对应,第一个是id 那你第一个插入必须是id
将数据插入一个新表时候
Create
table
emp2
as
select
ename,empno
from emp;
将数据插入一个已有表中
Insert into
dept1
select
*
from
dept
语法结构:
update
表明
set
字段名1=值1,。。。。。
where
条件
如果没有判断条件的话
将会把表中所有字段1修改为值1
语法结构:
delete from 表名 where 条件;
如果没有where条件 那么你的表会成为一张空表 数据全部删除
如何算出大表:
truncate table 表名:注意 这个方式无法挽回 永久性删除
在创建表的时候 可以给表的字段添加相应的约束 添加约束是为了保证表中的合法性 有效性 完整性
非空约束:not null 约束的字段不能为null
唯一约束:unique 约束的字段不能重复
主键约束: primary key 约束的字段不能为null 也不能重复
外键约束: foreign key
检查约束: check 这是Oracle数据库的约束 mysql没有
主键约束:primary key
字段就是建表时候你设置的字段比如id
主键值 你输入的id就是主键值
表的三范式有要求 第一范式就要求任何一张表都应该有主键
主键作用:唯一标识 类似于身份证
根据字段数量:
单一主键 : 常用
复合主键 : 少用
根据主键的性质来划分
自然主键:
主键值最好是一个和业务没有关系的字段
业务主键:
主键值和系统的业务挂钩 例如:银行卡号 身份证
不推荐用业务主键
一张表中只能有一张主键约束
mysql提供主键自增(重要)
create table user(
id int primary key auto_increment;//id自增
);
设置外键可以减少冗余现象 将数据重复的内容 分开写
T_class
No(pk) class
101 背景大型
102 背景
T_student
Id(pk) name no(fk)
1 zx 101
2 Ls 101
3 ls 102
4 zx 102
t_student中的no字段引用的是t_class中的no字段 此时 student为子表
class 为父表
顺序要求:
删除数据时候:先删除子表,再删除父表
添加数据时候:先添加父表,在添加子表
创建表的时候:先创建父表
删除表的时候:先删除子表
Create table t_class(
No int,
Class varchar(255),
Primary key(no);
);
Create table t_student(
Id int ,
Name varchar(255),
No int,
Foreign key(no) references(引用的意思) t_class(no);
);
当你写完外键以后 数据不能乱写 必须和父表挂钩 挂钩的不一定是主键 但必须是唯一值 并且外键可以为null
就是不同的存储引擎在内存里边的存储方式不一样
默认的字符集utf-8