目录
最基本的命令语句
显示所有数据库
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;
多个字段联合约束
name | age |
---|---|
zs | 45 |
zs | 25 |
unique(name,age);
那就是得name+age都得一样才行
primary
但凡有一个相同,就不行。
name | age | sex |
---|---|---|
zs | 45 | female |
zs | 25 | male |
这里只有名字一样都是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 不能用等于号
要用 is 和 is 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);
关闭自动提交、打开事务。