MYSQL总结

来源:互联网 发布:网络直播怎么兴起的 编辑:程序博客网 时间:2024/06/16 10:12

MySQL简介

MySQL属于小型关系型数据库。大型有Oracle、DB2更稳定。 MySQL包含很多库、库中包含表,库可以被多个不同用户访问。
Oracle包含库、库中包含很多对象,有表,序列,索引,函数,过程。用户创建表自己访问。

这里写图片描述

拥有由于其体积小、速度快、总体拥有成本低,开放源码的特点

MySQL和Oracle 使用上区别
1.主键自增方式不同、

Oracle:表有自动递增使用序列sequence
MySQL:表有自动递增支持auto_increment

2.单引号的处理
3.创建时间函数不同,

Oracle: Sysdate
Mysql: now()

5.长字符串的处理不同
6.分页函数不同

Oracle:采用子查询+ROWNUM列实现
MySQL:采用limit ?,?

Mysql和oracle相同之处

建表语句相同、创建约束语句相同、增删改除相同

建表
建表语句相同
create table xxx( 字段名 类型, 字段名 类型 )

Oracle常用类型:NUMBER、VARCHAR2、DATE、CLOB、BLOB、TIMESTAMP

MySQL常用类型:int、long、double、float、varchar、date、time、datetime、timestamp、clob、blob

创建约束语句相同 alter table xxx add constraint primary key(xx)

主键值自增方式不同

Oracle:创建序列sequence,然后利用sequence.nextval做主键ID值,实现递增效果
create sequence user_seq;//默认从1开始递增加1
insert into USER(ID,NAME) values (user_seq.nextval,?)
MySQL:表有自动递增支持auto_increment create table xx(
ID int primary key auto_increment, NAME varchar(20)
)
insert into USER(NAME) values (?)

DML操作(增删改)

insert into 表 (字段1,字段2...) values (?,?)updateset 字段1=?,字段2=? where 字段=?delete fromwhere 字段=?

上述标准语句相同。

INSERT INTO users(name, age) VALUES(‘姚明’, 25), (‘比尔.盖茨’, 50), (‘火星人’, 600);Oracle: SYSDATE、ROWNUMMySQL: now()

DQL查询操作

select 字段… from 表 where 条件 group by 分组 having 组函数条件(将查询的结果当做条件) order by 排序

上述标准语句相同

join…on…相同
组函数max,count,min,avg,sum相同

注意:分页查询不同

Oracle:采用子查询+ROWNUM列实现
MySQL:采用limit ?,?

select * from dept limit 0,5

事务控制 提交不同

Oracle:默认关闭自动提交。执行一个DML后,需要commit一下
MySQL:自动提交,执行一个DML就修改数据库。

Mysql优点:

1.可移植性
2.支持多种操作系统
3.为多种编程语言提供了 API
4.支持多线程
5.优化sql查询算法
6.可单独、也可嵌入式的使用
7.提供TCP/IP、ODBC和JDBC等多种数据库连接途径
8.MySQL是开源的
9.支持大型的数据库

JDBC:java数据库连接
MySQL操作

mysql环境变量配置cmd命令进入
在计算机属性下配置环境变量path到D:mysql\bin下
进入cmd 输入

 如:mysql  -uroot -p101010-u-----用户名-p------密码

1. 选择库

show databases // 查看所有库use 库名  //进入(使用)某个库create database 库名//创建库drop database 库名//删除库 

进入use 库后才可以进行表操作

对字段的修改

增加字段名 alter table 表名 add ename varchar();
删除字段名 alter table 表名 drop column ename
修改字段名 alter table 表名 rename column 旧字段名 to 新字段名;
修改字段类型 alter table 表名 modify 字段名 数据类型;
alter table 表名 modify ename varchar(20);

查看表

show tables;//查看库中所有表名desc 表名;//查看表结构

删除表 drop table 表名;
创建表

create table x_user(id int primary key auto_increment,//自动提交name varchar(20),age int);

修改表

alter table x_user add (birth date);

操作表数据

insert into x_user (name,age,birth) values ('james',25,'2013-06-05');update x_user set age=22 where id=1;delete from x_user where id=6;select * from x_user where name like '%o%';

分页查询

select * from x_user limit 抓取记录起点,抓取最大记录数;select * from x_user limit 3;//查询前3条,等价limit 0,3select * from x_user limit 0,3//查询前3条select * from x_user limit 3,3//从第4条抓,最多取3个

now() 创建当前时间

insert into x_user (name,age,birth) values ('xdl',10,now());select count(*) from x_user; -----统计数量select max(age) from x_user;-------查找指定字段最大值

Java访问MySQL
修改连接参数改变即可

url 改为 jdbc:mysql://localhost:3306/库名driverClassName 改为 com.mysql.jdbc.Driverusername 改为 rootpassword 改为 自己密码

查询SQL语句编写

select ... from ... where ... group by ... having ... order by ...

1. from字句

两个表直接关联 from A join B on(A.xx=B.xx)
两个表间接关联 from A join C on (A.xx=C.xx) join B on (C.xx=B.xx)

内连接

join… on…、inner join… on… (查询出两个表对等记录,最终记录是由双方表决定)

外连接

left outer join... on...、right outer join... on...full outer join... on...(查询某个表记录,另一个表没有对等,补null值。最终记录是由某一方表决定)//以A表记录为准全部取出,B没有对等补nullfrom A left outer join B on(A.xx==B.xx)from B right outer join A on(A.xx==B.xx)//以B表记录为准全部取出,A没有对等补nullfrom A right outer join B on(A.xx=B.xx)

2. where 字句

编写检索条件,条件字段一定出现在from数据表中,如果没有,from部分还需要加表。(注意不要出现分组函数,例如max,min等)
条件:>、<、>=、<=、!=、is null、is not null等 (参考搜索界面的输入条件)

3. group by字句
分组统计,可以所有记录一组、可以按某个字段或多个字段相同的做一组

group by deptnogroup by sex,city

有时可以先将group by放过,等select确定后再决定是否追加group by

select c1,c2,max(c3) //必须追加 group by c1,c2select max(c3)//可以不追加group by字句

4. having字句
使用分组函数做检索条件,过滤记录
5. select字句
根据页面显示项目决定。
6. order by字句
根据想要的顺序排序。
SQL语句级联删除
修改一下外键,下面是个例子:

alter table 表名add constraint 外键名(emp_字段名_fk)foreign key(字段名) references 主表名(主表id)on delete cascade

例:
前加级联删除

create table(id number,dept_id number constraint emp_dept_id_fk foreign key(dept_id) reference dept(id)on delete casecode);

后加级联删除

alter table add emp  constraint emp_dept_id_fk foreign key(dept_id) reference dept(id) on delete casecode

注释:

column:列名
referenced_table_name:外键参考的主键表名称
ref_name:外键要参考的表的主键列 on
delete:删除级联

数据库优化:

1:数据库设计—-表结构设计、字段规范设计、表引擎设计、索引规范(id,外键、查询比较频繁的字段、时间字段)
2:sql语句层次的优化—4张表、select * from XXXXX、select username from user left join role on role.roleid = user.roleid

避免写循环、(批量操作功能—-id用逗号隔开—1,2,3,4
select userid from user where userid in(1,2,3,4),is not null \ nvl())
分页查询(10条数据,count(0))
查数据不为空is not null
count(0) 0或1 不写*

mysql:
分库:
场景:

1:第三方平台数据库
2:涉及到分布式
3:数据量特别特别大
4:业务,按照访问曝光度(常用和不常用的访问)

解决:

1:跨库查询—多数据源—id

分表:
场景:

1:常用的字段和不常用字段,进行分表—主子表
2:根据数据量—-日志表—分表(除了表名外,其它表结构一模一样)

解决:

1:主外键
2:根据数据量—-分表
a:根据表的容量来分表—配置mysql的触发器
b:根据时间来分表(常用) —

按照时间来分表

1:一个月一分表
2:tabname_201709
tablname_201708
3:监听器—-监听的是当前服务器的时间—每个月20-24号之间,监听到符合条件的时间后,自动复制一张表,目的是提前创建
4:查询:
1:给定限制条件—-日期时间段
2:后台根据时间段进行截取,创建动态sql
3:分页,并且按照时间排序