MySQL+JDBC

最基本的命令语句

显示所有数据库

show databases;

现在需要进入某个数据库了

use xxx;

查看某张表的结构

desc xxx;

如果用户需要创建新的数据库,则可以使用如下命令:

create database [IF NOT EXISTS] 数据库名;

如果用户需要删除指定数据库,则:

drop database 数据库名;

建立了数据库之后,如果想操作该数据库(例如为该数据库建表,在该数据库中执行查询等操作),则需要进入该数据库。进入指定数据库可以使用如下命令:

use 数据库名;

进入指定数据库后,如果需要查询该数据库下包含多少个数据表,则可以使用如下命令

show tables;

如果想查看指定数据表的表结构(查看该表有多少列,每列的数据类型等信息),则可以使用如下命令:

desc 表名;

语句分类

查询语句:主要由select关键字完成,查询语句是SQL语句中最复杂、功能最丰富的语句。

  • DML (Data Manipulation Language,数据操作语言)语句:主要由insert、update和delete 三个关键字完成。
  • DDL (Data Definition Language,数据定义语言)语句:主要由create、alter、drop和 truncate四个关键字完成。
  • DCL (Data Control Language,数据控制语言)语句:主要由 grant和 revoke两个关键字完成。
  • 事务控制语句:主要由commit、rollback和 savepoint三个关键字完成。

创建表 table

单纯创建空表

table里创建都是一列一列的创建
table—列,例如:

姓名学号专业班级年龄

“姓名、学号、专业班级”都是一个个列(table),规定其中放入什么东西,就是datatype

create table [模式名.] 表名
 ( 
  #可以有多个列定义
 column Name1 datatype [default expr] ,
 ...
 )

其中default是在没有的情况下默认的内容,初始化都为这个内容。

create table test
(
   #整型通常用int 
   test_id int,
   #小数点数
   test price decimal,
   #普通长度文本,使用default指定默认值
   test_name varchar (255)default 'Xxx',
   #大文本类型
   test_desc text,
   #图片
   test_img blob,
   test_date datetime
);

注意格式,比如最后一个不要逗号、括号必须如上摆放。

修改表结构

使用alter table

  • 增加列定义
  • 修改列定义
  • 删除列定义
  • 重命名列名

增加

alter table表名add
(
  #可以有多个列定义
  column name1 datatype [default expr] ,
)

如果是多个的话

   #为hehe数据表增加一个hehe_id字段,该字段的类型为int
   alter table hehe
   add hehe_id int;
   #为hehe 数据表增加aaa、bbb字段,两个字段的类型都为varchar(255)
   alter table hehe
   add
   (
    aaa varchar(255)default 'xxx',
    bbb varchar (255)
   );

ps:MySQL里面字符串是单引号,不是双引号。

修改

alter table 表名
modify column_name datatype [default expr][first|after col_name]

上面的[first|after col_name]需要将目标修改到指定位置
这种方法每次只能修改一个列定义

#将hehe表的hehe_ id列修改成varchar (255)类型
alter table hehe
modify hehe_id varchar (255);
# 将hehe表的bbb列修改成int类型alter table hehe
modify bbb int;

MySQL不支持一次性修改多个列,如果要多修改,那就只能多用几次modify。但是其他数据库可以如Oracle

删除

alter table 表名
drop colum_name

drop就是一次性把这一列的都删了。

删除表

drop table 表名
  • 表结构被删除,表对象不再存在。
  • 表里的所有数据也被删除。
  • 该表所有相关的索引、约束也被删除。

truncate

删了表内的内容,但是表的结构保存。
不能指定删除,一下子全删了

truncate 表名

重命名

alter table 表名
rename to 新名

改变列名字:

alter table 表名
change old_column_name new_column_name type [default expr][firstlafter col_name]

数据库约束

可以更好的保证数据完整性,强制约束的校验标准

  • NOT NULL:非空约束,指定某列不能为空。
  • UNIQUE:唯一约束,指定某列或者几列组合不能重复。
  • PRIMARY KEY:主键,指定该列的值可以唯一地标识该条记录
  • FOREIGN KEY:外键,指定该行记录从属于主表中的一条记录,主要用于保证参照完整性。
  • CHECK:检查,指定一个布尔表达式,用于指定对应列的值必须满足该表达式。

NOT NULL

create table Cstat
     (
     Cstat_id int not null,
     Cstat_name varchar(255) default 'xyz' not null,
     Cstat_gender varchar(2) null
     );

还可以修改限制

UNIQUE

#增加非空约束
alter table hehe modify hehe gender varchar (2)not null;
#取消非空约束
alter table hehe modify hehe_name varchar(2)nu11;
#取消非空约束,并指定默认值
alter table hehe modify hehe_name varchar(255) default 'abc' null;

多个字段联合约束

nameage
zs45
zs25

unique(name,age);
那就是得name+age都得一样才行

primary

但凡有一个相同,就不行。

nameagesex
zs45female
zs25male

这里只有名字一样都是zs,但是还是不行。

primary和unique的区分

unique是 ∪ ,有一个不同就不算一样
primary是 ∩,有一个相同就算一样

FOREIGN KEY

横跨两个表的比较,所以基本上都是表级约束。

DML语句(增删改内容)

insert

给一张表加入内容

insert into test(test_id,test_price,test_name,test_desc,hehe_id)values(515,48.4,'Nt','acfun',256480);

重点在于 表名(参数标题表)values(参数表);
记得一一对应(数量和数据类型)

ps:甚至可以一次性就加好几行
values(xxx)(xxx)


表的复制

create table ()表名 as select语句

当作查询结果当作一个新的表创建出来

批量插入

insert into xxx select from xxx;

更新(update)

update 表名 set 字段名1=1,字段名2=2... where 条件;
--注意:没有条件整张表数据全部更新。

update cpy set hehe_id =1405,test_name = 'jourer' where test_price = 3;

关于where 要修改名字为张三的人的年龄
xxxx where name=‘张三’

删除

detete from

delete from cpy where test_name = 'Nt';

删除了所有test_name为Nt的。


ps:delete的效率比较低,大规模的会很慢

truncate table cpy;

效率高很多,但是风险大

查询

单表查询

select是最经典 的查询语句。

#数据列实际上可当成一个变量select teacher_id +5from teacher_table;
#查询出teacher_table表中teacher_id* 3大于4的记录select *
from teacher table
where teacher id*3>4;

可以用 算术表达式 来表示的where


起别名:不想让列名当列标题,可以起别名

select 列名 AS 新名字

条件 查询

查询工资在某个范围内

select name from 表名 where sal >=1000 and sal<=5000;
select name from 表名 where sal between 1000 and 5000;

找出salary从1000到5000的。
还可以选字母
从A 到 H的也可以


查某个具体:

select aa列 from 表名 where bb列='';

根据bb项为某个目标,来查询对应aa列的内容。


判断null 不能用等于号
要用 isis not


or / and

且 / 或 的区别。
同时是的,and;选择其中一个是的就行,or。

函数

case函数

在这里插入图片描述

各种函数

在这里插入图片描述
在这里插入图片描述

多表连接查询

在这里插入图片描述
假设两个表,现在需用其中一个表中的信息查询对应另一个表的内容。
比如上面那张图,女生对应男朋友要在男生表里面查询
在这里插入图片描述表1.xxx = 表2.yyy
类似结构体的顿号。

(左右)连接查询

join … on … 连接查询

操作描述
lnner join如果表中至少有一个匹配,就返回行
left join会从左表中返回所有的值,即使右表中没有匹配
right join会从右表中返回所有的值,即使左表中没有匹配

就是选一边的为基准,另一边去贴合。

自连接

把一张表拆成两张,然后自己连接自己
在这里插入图片描述用算法的思想理解即可。

子查询

where 后面跟的东西也是,相当于if内部写一个函数
在这里插入图片描述
where(where(判断2)判断1)

PrepareStatement和SQL注入

SQL注入:
简单来说,就是系统是会检测ture or false
你输入错误的密码肯定是false
但是你输入true可以 卡bug
让系统以为你输入的true是系统返回值,而非系统判断的内容

解决办法— PrepareStatement

如果你想插入三四个人的信息(姓名,年龄,性别);
不必完全重复写三四次,只需要准备好一个模板即可
PrepareStatement就是这个模板

insert into student_table values(?,?,?);

这里面的 ? 就是变量,每次填入姓名、年龄、性别即可。

事物管理

事务是由一步或几步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。程序和事务是两个不同的概念。一般而言,一段程序中可能包含多个事务。事务具备4个特性:原子性(Atomicity)、一致性(Consistency)、隔离性( Isolation)和持续性(Durability)。这4个特性也简称为ACID 性。

  • 原子性(Atomicity):事务是应用中最小的执行单位,就如原子是自然界的最小颗粒,具有不可再分的特征一样,事务是应用中不可再分的最小逻辑执行体。
  • 一致性(Consistency):事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库只包含事务成功提交的结果时,数据库处于一致性状态。如果系统运行发生中断,某个事务尚未完成而被迫中断,而该未完成的事务对数据库所做的修改已被写入数据库此时,数据库就处于一种不正确的状态。比如银行在两个账户之间转账:从A账户向B账户转入1000元,系统先减少A账户的1000元,然后再为B账户增加1000元。如果全部执行成功,数据库处于一致性状态;如果仅执行完A账户金额的修改,而没有增加B账户的金额,则数据库就处于不一致性状态;因此,一致性是通过原子性来保证的。
  • 隔离性(Isolation):各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务都是隔离的。也就是说,并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间不能互相影响。
  • 持续性(Durability):持续性也称为持久性(Persistence),指事务一旦提交,对数据所做的任何改变都要记录到永久存储器中,通常就是保存进物理数据库。

个人理解:就是组织一系列的数据库操作,封装起来,就好比程序就是把几个特定的步骤集成起来,一个程序用于解决某特定问题。

提交和回滚

要么提交(commit),不是提交成功的都回滚(roll back)。
提交分为:

  • 显式提交:使用commit。
  • 自动提交:执行DDL或DCL语句,或者程序正常退出。
    回滚:
  • 显式回滚:使用rollback。
  • 自动回滚:系统错误或者强行退出。(比如出现未处理的Expectation)

意义何在?

其实每一条SQL语句,都算是一个自动提交
但一旦提交不可以恢复!
所以就是给了你一个权限,先暂时控制某些事务先别提交、或者遇到某些情况都别提交,留有余地。

conn.setAutoCommit(false);

关闭自动提交、打开事务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值