MySQL入门

day02==============================================================

MySQL登录
mysql -uroot -hlocalhost -p123456 -P8888
-u 用户名
-h IP地址.本机可以使用localhost/127.0.0.1
-p 密码
-P 端口号

查看当前有哪些数据库
show databases;

使用某个数据库
use 数据库名;

建立数据库
create database 数据库名;


建立数据表
create table 表名(
字段1 数据类型 [完整性约束条件],
字段2 数据类型 [完整性约束条件],
...,
字段n 数据类型 [完整性约束条件]);

数据-增删改查
insert into 表名 (字段列表) values(值);

delete from 表名 [where];

update 表名 set 字段列名 = 数值 ;

select * from 表名;

*delete:DML 一条一条删除
*truncate:DDL 先删除表再重建表格

查看表结构
describe
describe 表名 \G; 格式化输出

--详细查询建表的语句
show create table 表名;

删除表
drop table student;

修改表结构
修改表名
alter table 表名 rename to 新表名;
修改字段的数据类型
alter table 表名 modify 字段名 数据类型;
修改字段名
alter table 表名 change 字段名 新字段名+数据类型;
增加字段
alter table 表名 add 字段名+数据类型+约束;
可在后面家位置语句:first/after 字段名/before 字段名;
删除字段;
alter table 表名 drop 字段名;

查看库中的引擎
show engines \G;
- engine 是引擎的名称
- support 表示MySQL是否支持该类型的引擎
- Yes 代表支持
- comment 对引擎的评论 引擎的特点介绍
- transactions 该引擎是否支持事务
- xa 是否遵守分布式交易处理的XA规范
- savepoint 是否支持保存点.在事务处理中可以回滚到保存点. Yes代表支持

查看MySQL所支持的引擎
show variables like 'have%';

查看当前默认存储引擎
show variables like '%storage_engine%';

修改默认存储引擎

- 直接修改my.ini配置文件
在配置文件中使用`default-storage-engine=InnoDB`.修改完成后要重启服务
- 使用SQL语句修改
lter table 表名 engine = 引擎名;

MySQL支持的完整性约束
约束关键字说明
主键约束 PRIMARY KEY 表示当前属性为该表的主键.可以唯一的表示数据表中的一条记录
外键约束 FOREIGN KEY 保证数据的参照完整性.它的取值引用另外一张表的主键
非空约束 NOT NULL 标识该字段不可以为空
唯一性约束 UNIQUE 标识该字段的取值唯一.不可以重复
默认值约束 DEFAULT 在没有赋值的情况下,会自动赋予的默认值
检查约束 CHECK(MySQ不支持) 用于检查字段是否符合指定的条件
自动增长 AUTO_INCREMENT 自增增长(MySQL的特色)

新建表创建主键约束
constraint 约束名 约束类型 (字段1,...,字段n) -->(缩写) 约束类型(字段1,...,字段n)

对已有表增加主键
alter table 表名 add constraint 约束描述 primary key (字段名);

删除主键
alter table 表名 drop primary key;

外键约束
对已有表添加外键
alter table 表名 add constraint 约束名 foreign key(字段) references 主键表(主键) ;
alter table score add constraint SCORE_STU_SID foreign key(sid) references stu(sid) ;

新建表时添加外键
constraint 外键描述 foreign key(字段) references 主键表(主键);
CONSTRAINT TEST_STU_SID FOREIGN key (sid) REFERENCES stu(sid);

删除外键
alter table 表名 drop foreign key 外键约束名;

day03==============================================================

基本查询
SELECT 属性列表 FROM 表名或者视图列表(数据源)
[WHERE 条件表达式]
[GROUP BY 分组] [HAVING 筛选条件表达式]
[ORDER BY 排序字段][ASC|DESC]
[LIMIT X OFFSET Y]

as "别名",使用双引号

查询条件表达式

| 查询条件 | 符号或关键字 |
| :----------: | :---------------------------: |
| 比较 | =、<、>、>=、<=、<>、!= |
| 指定范围 | between and 、not between and |
| 指定集合 | in、not in |
| 匹配字符 | like、not like |
| 判断是否为空 | |
| 多个条件查询 | and(且)、or(或)、not(非) |

匹配字符
_ 只代表一个字符
% 代表任意字符

子查询
子查询就是把一个查询语句嵌套在另外一个查询语句中

带有In的子查询
select * from stu where sid [not] in (select distinct sid from score);

带有运算符的子查询
select * from stu where sid > (select max(sid) from score);

带有Exists关键字的子查询
使用Exists关键字时,内层查询返回true或者false
select * from stu where sid < 5 and
[not] exists (select cid from score where cid = 10);

带有Any的子查询(只要满足任何一个条件.就可以执行外层查询)
select * from stu where sid > any (select sid from score );

带有All的子查询(全部满足,才能执行外层语句)
select * from stu where sid > all (select sid from score );

联合查询
- union
- union al
用union会把重复的去除.而使用union all就是单纯的合并


多表查询

内连接
select 字段列表 from 表1 inner join 表2 == select 字段列表 from 表1,表2
内连接可以加条件.但是使用的不是where.而是on
select * from stu inner join score on stu.sid = score.sid;

左外连接
select * from 表1 left join 表2 on 表1.字段 = 表2.字段
select * from stu left join score on stu.sid = score.sid;

执行顺序
from --> where --> group by --> on --> select --> order by


day04==============================================================

//读取文件
InputStream is = DbTools.class.getClassLoader().getResourceAsStream("config.properties");

Properties类 -- 读取数据库基本配置
Properties.load(InputStream inStream) ,从输入流中读取属性列表(键和元素对),数据来自config.properties
Properties.getProperty(String key),通过键找到值,读取配置文件获取driver,url,user,password

载入驱动类
class.forName(String driver)

DriverManager工具类(驱动管理类)
通过指定参数获得链接,返回一个数据库连接 Connection对象
DriverManager.getConnection(url, user, password);

Connection类--数据连接对象,实现与数据库会话
.prepareStatement(String sql)
把sql语句转化成一个PreparedStatement对象,返回值就是该PreparedStatement对象

PreparedStatement类 --数据预处理对象
.getParameterMetaData(),获取sql语句中的?通配符集
.getParameterCount(),查看sql语句的个数
.setObject(int parameterIndex, Object x) 使用给定对象设置指定参数的值。

.executeQuery() ,执行sql指令,并返回该查询生成一个ResultSet类型的数据集合
.executeUpdate() ,执行sql指令,INSERT、UPDATE 或 DELETE 语句,返回int受影响的行数;
ResultSet类 --数据库结果集对象
.next():判断有误下一行,返回Boolean值,用于while循环;
.getString(String columnLabel),通过key,找到值
.getInt(String columnLabel),通过key,找到值


day05==============================================================

Class的获取方式

// -- 第一种方式
Class<?> clz = Class.forName("类的路径");
clz.newInstance();//

// -- 第二种方式 对象.getClass();
类名 对象 = new 类名();
Class<? extends 类名> clz = 对象.getClass();

// -- 第三种方式 类名.class
Class clz3 = Demo01.class;

在Java中用于创建对象的方式有5种
- 使用new + 构造方法创建
- 使用反射创建(有两套写法)
- 使用反序列化
- 使用克隆创建

---------------------------------------------------------------------------
//加载这个类到内存
Class<?> clz = Class.forName("类的路径");
Class clz = 类名.class;

1.使用无参构造实例化,返回Object,可以直接硬转
Class clz = 类名.class;
Object 对象 = clz.newInstance();

2.使用有参的构造实例化
方法一:
Class clz = 类名.class;

//通过Class对象获取所有的字段信息
Field[] fields = clz.getDeclaredFields();

Object 对象 = clz.newInstance();

// -- 3.遍历fields数组
for (int i = 0; i < fields.length; i++) {
Field f = fields[i];

// -- 私有的设置可见.不然无法访问
f.setAccessible(true);

//判断该字段属于哪个变量,然后给与赋值
if(f.getName().equalsIgnoreCase("name")){
f.set(dog, "旺财");
}

方法二:
//加载类到内存
Class clz = 类名.class;
//获取类的构造函数
Constructor<?> con = d.getConstructor(String.class,String.class,int.class);
//通过该构造函数建立实例对象
con.newInstance("参数1","参数2",参数3);
-----------------------------------------------------------------------------------


day06=============================================================

SQL语言分类
DCL
数据控制语言 (DCL:Data Control Language)
是用来设置或者更改[数据库用户]或角色权限的语句,这些语句包括GRANT、DENY、REVOKE等语句,
DDL
数据库模式定义语言 (DDL: Data Definition Language)
是用于描述数据库中要存储的现实世界实体的语言。Create/Drop
DML
数据操作语言 (DML:Data Manipulation Language)
Update/Delete/Insert
DQL
数据查询语言(DQL: Data Query Language)./Select

TCL/TP;
据库事务控制语句 它的语句能确保被DML语句影响的表的所有行及时得以更新。
TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。


MySQL数据类型:
- 整数类型
- 浮点类型
- 定点数类型
- 日期和时间类型
- 字符串类型
- 二进制类型

整数
整数类型 字节数 无符号范围 指数写法 有符号范围 默认长度
TINYINT 1 0`255 2^8 -128~+127 4
SMALLINT 2 0`65535 2^16 6
MEDIUMINT 3 0`16777215 2^24 9
INT 4 2^32 11
INTEGER 4 2^32 11
BIGINT 8 2^64 20

ZEROFILL属性
设置ZEROFILL属性的字段,会显示默认长度的数值,用0填充

浮点类型
浮点数
单精度 FLOAT
双精度 DOUBLE double(x,y):x带边默认长度,y为小数个数,小数位四舍五入
定点数 DECIMAL/DEC 同上

字符串类型
- CHAR
- VARCHAR
- TEXT
- ENUM
- SET
- BLOB(有些书籍会把它也算是字符串.)

CHAR是定长的,VARCHAR是可变长度.

SET类型是用于规范取值范围.它的写法是alter table test modify num set('A','B','C');


MySQL 视图

数据与原表格是同步的

创建语法:
create [algorithm={undefined|megre|temptable}] view 视图名
[{属性类表}] as select 语句 [with [cascaded |Local] check option];


MySQL 触发器
创建语法:
create trigger 触发器名 BEFORE|AFTER 触发事件 on 表名 for each row 执行语句;
eg//create TRIGGER trg1 after insert on t1 for each ROW insert into t2 values(1);


修改默认结束符号
delimiter //


MySQL 常见函数
select abs(-0.1); 绝对值
select sqrt(16); 开平方
select mod(5,2); 求余数
select ceil(2.3),ceil(-2.3),ceiling(2.3),ceiling(-2.3);向上取整
select floor(2.3),floor(-2.3); 向下取整
select round(2.44); 四舍五入
select truncate(2.44,1); 取制定位数的数值,不四舍五入
rand()和rand(x); 返回的都是(0-1)之间的随机数. x是种子.
select pow(3,3); 幂运算
select exp(10); e的10次方,e≈2.71828

字符串函数
select "abc",char_length("abc"),length("abc");
select concat("该死的","星期一");
select concat_ws(":","该死的","星期一","偏偏还下雨");
select insert("Hello",3,3,"World");
select upper("mysql"),ucase("mysql"),lower("MYSQL"),lcase("MYSQL");
select left("HelloWorld",3);取左边3个字符
select right("HelloWorld",3);

#\lpad(s1,len,s2) 使用字符串s2填充到字符串s1的左边,使其长度到大len
select lpad("1",3,"0");
select rpad("1",3,"0");

select repeat("你好!",10); 重复生成N个字符

# replace(s,s1,s2) 使用s2来代替s中的s1部分

select replace("HelloWorld","ll","AA");

# 字符串大小比较函数
# strcmp(s1,s2)
# s1 大于 s2 返回1
# s1 等于 s2 返回0
# s1 小于 s2 返回-1
select strcmp("abc","ABC");

求下标
# position(s in ss) 求s在ss中的下标

# 反转字符
select reverse("你好中国");


日期函数
curdate()
# 求月份, select month(curdate());
# 求星期, select dayname(curdate());
# 求这周的第几天,星期天开始, select dayofweek(curdate());
# 计算日期是本年的第几周, week(curdate());
# 计算日期是本年的第几天, dayofyear(curdate());
# 计算日期是本月的第几天, dayofmonth(curdate());
# 当前日期减去X天后是哪一天, select subdate(curdate(),3);
# 求两个日期差, select datediff(curdate(),"2019-05-01");

条件判断函数
IF(exp,v1,v2),exp作为条件,v1和v2两种可能的值
select sname,sage,if(sage < 19 ,"未成年","成年") as 是否成年 from stu;

IFNull(v1,v2),如果v1的值不为空就显示v1,否则显示v2
select ifnull(tt,"无名氏")from test;

CASE函数
创建语法:
select 字段1,字段2,case when exp1 then v1 [when exp2 then v2] [else vn] end from 表名;

eg//select tt,num,case when num = 1 then 'A' when num = 2 then 'B'
when num = 3 then 'C' else 'D' END as "Level" from test;
+--------+------+-------+
| tt | num | Level |
+--------+------+-------+
| 张三 | 1 | A |
| 李四 | 2 | B |
| 王五 | 3 | C |
| 赵六 | 4 | D |
+--------+------+-------+



MySQL 事务

一个独立的业务中包含N条SQL语句.这N条SQL语句形成一个有机整体.这N条
SQL语句之间**要么都成功,要么都失败**.我们把这个整体就叫做事务.

事务只和连接有关//就是Connection类对象
try{
conn.setAutoCommit(false); //取消自动提交
执行sql指令1
执行sql指令2
.... //全部执行完,
conn.commit(); //提交所有Sql语句
}catch{
conn.rollback(); //try中出现,回滚之前的操作
}

事务的四个特性
ACID;
A 原子性: Atomicity
C 一致性: Consistency
I 隔离性: Isolation
D 持久性: Durability

A 原子性
整个事务中的所有操作,要么全部完成,要么全部不完成

C 一致性
一个事务处理前后,数据的总数是不变的

I 隔离性
-->>

D 持久性
事务结束后,所有的修改必须写到本地,持久的保存.


事务的术语
- 开启事务 start transaction
- 结束事务 end transaction
- 提交事务 commit(提交/ 提交之后不可以回滚)
- 回滚事务 rollback(回到开始的地方) / rallback to savepoint(回到某个存档点)

事务的隔离级别
- 读未提交 read uncommitted 脏读
- 读已提交 read committed
- 可重复读 repeatable read
- 串行化 serializable (事务A和事务B,事务A在操作数据表时,事务B只能排队等待.
直到事务执行完成(commit).这个隔离级别是很少用的.
它可以解决所有问题.但是因为等待导致吞吐量太低.)

# 查看提交方式
show variables like '%commit%';
修改提交方式
set autocommit = 1/0; (1,自动提交2,手动提交)

# 查看隔离级别
show variables like '%isolation%';

# 设置当前会话的隔离级别
set session transaction isolaction level read committed

# 设置全局的隔离级别
set global transaction isolaction level read committed


# 因为隔离级别导致的问题

隔离级别是针对修改的.我们对数据的读和写都有可能产生问题

- 读
- 脏读
- 不可重读
- 幻影读
- 写
- 更新丢失
- 乐观锁
- 悲观锁


















posted on 2019-07-28 10:28  Pinghu_gary  阅读(118)  评论(0)    收藏  举报

导航