创建带字符的数据库
create database 数据库名 character set字符集;
修改数据库字符集
alter database 数据库名 character set 字符集;
删除数据库
drop database 数据库名;
drop table if exists 表名;
char与character的区别
char类型适合存储 固定长度的字符串,比如 密码 ,性别一类
varchar类型适合存储 在一定范围内,有长度变化的字符串
创建表
CREATE TABLE 表名(
字段名称1 字段类型(长度),
字段名称2 字段类型 注意 最后一列不要加逗号
);
快速创建一个表结构相同的表(复制表结构)
create table 新表明 like 旧表名
修改表
rename table 旧表名 to 新表名
修改表的字符集
alter table 表名 character set 字符集
向表中添加列, 关键字 ADD
alert table 表名 add 字段名称 字段类型
例句:ALTER TABLE category ADD cdescVARCHAR(20);
修改表中列的 数据类型或长度 , 关键字 MODIFY
alter table 表名 modify 字段名称 字段类型
例句:ALTER TABLE category MODIFY cdescVARCHAR(50);
去重
distinct
修改列名称 , 关键字 CHANGE
修改列名称 , 关键字 CHANGE
例句:ALTER TABLE category CHANGE cdesc description VARCHAR(30);
删除列 ,关键字 DROP
alter table 表名 drop 列名;
插入数据
insert into 表名 (字段名1,字段名2…) values(字段值1,字段值2…);
方式1: 插入全部字段,将所有字段名都写出来
INSERT INTO student (sid,sname,age,sex,address)VALUES(1,‘孙悟空’,20,‘男’,‘花果 山’);
插入全部字段,不写字段名
INSERT INTO studentVALUES(2,‘孙悟饭’,10,‘男’,‘地球’);
插入指定字段的值
INSERT INTO category (cname)VALUES(‘白骨精’);
更改数据
不带条件的修改
update 表名 set 列名 = 值
例句:UPDATE student SET sex = ‘女’;
带条件的修改
update 表名 set 列名 = 值 [where 条件表达式:字段名 = 值 ]
例句:UPDATE student SET sex = ‘男’ WHERE sid = 3;
一次修改多个列, 将sid为 2 的学员,年龄改为 20,地址改为 北京
例句:UPDATE student SET age = 20,address = ‘北京’ WHERE sid = 2;
删除数据
语法格式1:删除所有数据 delete from 表名
语法格式2: 指定条件 删除数据
如果要删除表中的所有数据,有两种做法
- delete from 表名; 不推荐. 有多少条记录 就执行多少次删除操作. 效率低
- truncate table 表名: 推荐. 先删除整张表, 然后再重新创建一张一模一样的表. 效率高
查询数据
select 列名 from 表名
排序
SELECT 字段名 FROM 表名 [WHERE 字段 = 值] ORDER BY 字段名
[ASC / DESC] ASC表示升序排序DESC表示降序排序
只按照某一个字段进行排序, 就是单列排序
使用 salary 字段,对emp 表数据进行排序 (升序/降序)
默认升序排序 ASC SELECT * FROM emp ORDER BY salary;
降序排序
SELECT * FROM empORDER BY salary DESC;
同时对多个字段进行排序, 如果第一个字段相同 就按照第二个字段进行排序,以此类推
在薪水排序的基础上,再使用id进行排序, 如果薪水相同就以id 做降序排序
SELECT * FROM emp ORDER BY salary DESC, eid DESC;
聚合函数
where 与 having的区别
limit 关键字
limit是限制的意思,用于 限制返回的查询结果的行数 (可以通过limit指定查询多少行数据
limit 语法是MySql的方言,用来完成分页
limit 语法是 MySql的方言,用来完成分页 limit offset , length;
关键字可以接受一个 或者两个 为0 或者正整数的参数
offset 起始行数, 从0开始记数, 如果省略 则默认为 0, length返回的行数
约束
主键约束 primary key 不可重复 唯一 非空 eid INT PRIMARY KEYAUTO_INCREMENT,
DELETE:只是删除表中所有数据,对自增没有影响
TRUNCATE:truncate是将整个表删除掉,然后创建一个新的表自增的主键,重新从 1开始
唯一 约束 unique 表中的某一列的值不能重复( 对null不做唯一的判断 )
ename VARCHAR(20) UNIQUE
主键约束与唯一约束的区别:
- 主键约束 唯一且不能够为空
- 唯一约束,唯一 但是可以为空
- 一个表中只能有一个主键 , 但是可以有多个唯一约束
非空 not null 某一列不予许为空 ename VARCHAR(20) NOT NULL,
外键 foreign key 外键指的是在 从表 中 与 主表 的主键对应的那个字段,比如员工表的dept_id,就是外键
新建表时添加外键
FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名)
已有表添加外键
ALTER TABLE 从表 ADD FOREIGN KEY (外键字段名) REFERENCES 主表(主 键字段名);
事务
开启事务 start transaction; 或者 BEGIN;
提交事务 commit;
回滚事务 rollback;
手动提交事务流程
执行成功的情况: 开启事务 -> 执行多条 SQL 语句 -> 成功提交事务
执行失败的情况: 开启事务 -> 执行多条 SQL 语句 ->事务的回滚
事务的四大特性 ACID
原子性:每个事务都是一个整体,不可再拆分,事务中所有的 SQL 语句要么都执行成功, 要么都失败。
一致性:事务在执行前数据库的状态与执行后数据库的状态保持一致。如:转账前2个人的 总金额是 2000,转账后 2 个人总金额也2000
隔离性:事务与事务之间不应该相互影响,执行时保持隔离的状态.
持久性:一旦事务执行成功,对数据库的修改是持久的。就算关机,数据也是要保存下来的
事务隔离级别
读未提交:read uncommitted 不可以解决脏读,不可重复读,幻读
读已提交:read committed 可解决脏读
可重复读:repeatable read 可解决脏读,不可重复度
串行化: serializable 可以解决脏读,不可重复读,幻读
read uncommitted < read committed < repeatable read < serializable
表和表的关系
一对多:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键;
多对对:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。
一对一:外键唯一主表的主键和从表的外键(唯一),形成主外键关系,外键唯一 UNIQUE
多表查询的分类
隐式内连接
SELECT 字段名 FROM 左表, 右表 WHERE 连接条件;
显式内连接
SELECT 字段名 FROM 左表[INNER] JOIN 右表 ON 条件
左外连接
SELECT 字段名 FROM 左表 LEFT JOIN 右表 ON 条件
右外连接
SELECT 字段名 FROM 左表 RIGHT [OUTER ]JOIN 右表 ON 条件
子查询
where型 子查询: 将子查询的结果, 作为父查询的比较条件
where型 子查询: 将子查询的结果, 作为父查询的比较条件
exists型 子查询: 子查询的结果是单列多行, 类似一个数组, 父层查询使用 IN 函数 ,包含子查询的结果
索引
主键索引 (primarykey) 主键是一种唯一性索引,每个表只能有一个主键, 用于标识数据表中的每一条记录
唯一索引(unique) 唯一索引指的是 索引列的所有值都只能出现一次, 必须唯一.
普通索引 (index) 最常见的索引,作用就是 加快对数据的访问速度
添加主键索引
ALTER TABLE 表名 ADD PRIMARY KEY ( 列名 )
添加唯一索引
create unique index索引名 on 表名(列名(长度))
添加普通索引
create index 索引名 on 表名(列名[长度])
添加删除索引
ALTER TABLEtable_name DROP INDEX index_name;
索引的优点
- 大大的提高查询速度
- 可以显著的减少查询中分组和排序的时间。
索引的缺点
- 创建索引和维护索引需要时间,而且数据量越大时间越长
- 当对表中的数据进行增加,修改,删除的时候,索引也要同时进行维护,降低了数据的维护速度
JDBC
什么是jdbc:java访问数据库的标准规范,
作用是统一了访问数据库的标准规范,可以使用一套代码操作所有的关系型数据库。
ResultSetHandler实现类
在类中表示一对多的关系
Java类表示一对多关系,可以在多的一方添加一个成员变量,这个成员变量的类型 就是一的一方的类型
在类中表示多对多的关系
Java类表示多对多关系,可以在中间表分别创建成员变量,这个成员变量的类型 就是一的一方的类型
在类中表示多对一的关系
Java类表示多对多关系,可以在一的一方添加一个集合,集合中保存的就是多的一方的数据信息