1.库的操作
#查看所有的库
SHOW DATABASES;
#选库
USE 库名;
USE mysql;
#创建库:create database [if not exists] 库名 [character set '编码集']
CREATE DATABASE db1;
#[if not exists] :如果库不存在则创建 存在则不创建。如果没有该字段库在则报错。
CREATE DATABASE IF NOT EXISTS db2;
#[character set '编码集'] :指定库的编码集
CREATE DATABASE db3 CHARACTER SET 'gbk';
#修改库的编码集 : alter database 库名 character set '编码集';
ALTER DATABASE db3 CHARACTER SET 'utf8';
#查看库的信息
/*
mysql8之前编码集utf8长度为3个字节(utf8mb3)
mysql8开始utf8编码集变成了utf8mb4(utf8编码集长度为4个字节)
注意:默认的utf8是utf8mb3
*/
SHOW CREATE DATABASE db3;
#删除库 : drop database [if exists] 库名
DROP DATABASE db3;
#[if exists] : 如果库存在则删除不存在则不删。如果没有该字段 库不存在则报错。
DROP DATABASE IF EXISTS db3;
2.表的操作
#查看所有的表
SHOW TABLES;
#查看表的字段信息
DESC person;
#查看表的信息
SHOW CREATE TABLE student;
/*
创建表:
方式一:
create table [if not exists] 表名(
字段名 字段类型,
字段名2 字段类型,
......
字段名n 字段类型 #注意:最后一个字段没有逗号除非该字段下面还有其它内容(约束)
) [character set '编码集']
注意:如果表没有指定编码集默认和库的编码集一致。
*/
CREATE TABLE person(
id INT,
NAME VARCHAR(23) #varchar是字符串类型
);
#IF NOT EXISTS :如果表不存在则创建 存在则不创建。如果没有该字段表存在则报错。
CREATE TABLE IF NOT EXISTS person(
id INT,
NAME VARCHAR(23) #varchar是字符串类型
);
CREATE TABLE student(
id INT,
NAME VARCHAR(23) #varchar是字符串类型
) CHARACTER SET 'utf8';#utf8默认是utf8mb3
#==================================================================
#创建表方式二(基于现有的表创建一张新表(没有数据)) :
#格式 :create table [if not exists] 表名 like 表名-存在的表
CREATE TABLE emp LIKE student;
CREATE TABLE emp2 LIKE myemployees.`employees`; #库名.表名 :跨库
#==================================================================
/*
创建表方式三 :将查询结果创建一张新表
create table [if not exists] 表名
as
select语句
*/
CREATE TABLE emp3
AS
SELECT employee_id,first_name,salary,job_id
FROM myemployees.`employees`
WHERE employee_id < 120;
#删除表 :drop table [if exists] 表名;
DROP TABLE emp3;
#[if exists] :如果表存在则删除不存在则不删。如果没有该字段表不存在则报错。
DROP TABLE IF EXISTS emp3;
3.字段的操作
#对字段的操作:alter table 表名 add/drop/change/modify [column] ......
#添加字段:alter table 表名 add [column] 字段名 字段类型;
ALTER TABLE emp ADD COLUMN age INT;
#修改字段的名字: alter table 表名 change [column] 原字段名 新字段名 字段的类型;
ALTER TABLE emp CHANGE age age2 INT; #修改字段名
ALTER TABLE emp CHANGE age2 age2 INT;#修改字段类型
#修改字段的类型:alter table 表名 modify [column] 新字段类型;
ALTER TABLE emp MODIFY age2 VARCHAR(20);
#修改表的名字 : ALTER TABLE 原表名 RENAME TO 新表名;
ALTER TABLE student RENAME TO stu;
DESC emp;
4.mysql的数据类型
CREATE TABLE student(
id INT,
gender CHAR,
NAME VARCHAR(20),
score DOUBLE(5,2),# 5=整数位+小数位 2=小数位 (如果插入的值超过了小数位的长度会四舍五入)
syear DATE
);
INSERT INTO student(id,gender,NAME,score,syear) VALUES(1,'男','小龙哥',23.356,'2023-12-10 11:11:11');
5.数据的操作之增,删,改
CREATE TABLE student(
id INT,
NAME VARCHAR(20),
age INT
);
#向表中插入单行数据: insert into 表名(字段名1,字段名2,......) values(值1,值2,......)
INSERT INTO student(id,NAME,age) VALUES(1,'longge',18);
#注意:如果插入的是全字段(给每个字段都插入值)那么表名后面的字段名可以省略不写
INSERT INTO student VALUES(2,'yuanyuan',20);
INSERT INTO student(id,age) VALUES(3,20);
#向表中插入多行数据:
#insert into 表名(字段名1,字段名2,......) values(值1,值2,......),(值1,值2,......),......
INSERT INTO student VALUES(4,'zhiling',20),(5,'reba',30);
/*
将查询的结果插入到表中
insert into 表名(字段名1,字段名2,.....)
select 字段名1,字段名2,....
......
注意:插入的字段和查询的字段的个数和类型要匹配。
*/
INSERT INTO student(id,NAME)
SELECT employee_id,first_name
FROM myemployees.`employees`
WHERE employee_id < 120;
#查看表结构
DESC myemployees.`employees`;
####===============================================================
#修改数据: update 表名 set 字段名1=值1,字段名2=值2,...... [where 过滤条件]
UPDATE student SET NAME='weige',age=56 WHERE id=3;
UPDATE student SET age = 18 WHERE id > 5;
UPDATE student SET age = 20;
####===============================================================
#删除数据:delete from 表名 [where 过滤条件]
DELETE FROM student WHERE id=5;
DELETE FROM student WHERE id>=100;
DELETE FROM student;
6.事务
事务回滚:类似撤销
CREATE TABLE account(
NAME VARCHAR(20),
balance INT
);
/*
事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。
案例:AA给CC转账1000
try{
开启事务
aa -= 1000;
System.out.println(1/0);
cc += 1000;
事务提交 - 一旦提交就不能回滚了
}catch(Exception e){
事务回滚
}
发生的问题:一个成功 一个失败。
解决思路:将多个操作看成一个整体要么都成功要么都失败-不允许有成功有失败的。
注意:对数据的操作才可以使用事务
*/
#开启事务-方式一
SET autocommit=FALSE;
#开启事务-方式二(一旦commit或rollback事务自动结束)
START TRANSACTION;
#具体的操作
DELETE FROM account;
#事务提交-一旦提交将不能再回滚
COMMIT;
#事务回滚
ROLLBACK;
#关闭事务
SET autocommit=TRUE;
#=============================================================
/*
delete from 和 truncate table的区别?
1.delete from可以使用事务。truncate table不能使用事务。
2.如果可以确认删除的数据不需要回滚用truncate table效率高。
*/
START TRANSACTION;
#清空表中的内容
TRUNCATE TABLE account;
ROLLBACK;
7.约束
/*
六种约束:
NOT NULL 非空约束,规定某个字段不能为空
UNIQUE 唯一约束,规定某个字段在整个表中是唯一的
PRIMARY KEY 主键(非空且唯一)
FOREIGN KEY 外键
CHECK 检查约束
DEFAULT 默认值
约束分类:列级约束 vs 表级约束
列级约束:同时只能约束一列
表级约束:同时可以约束多列
创建表时添加约束
添加列级约束
添加表级约束
创建表后添加约束(知道即可)
添加列级约束
添加表级约束
注意:default 和not null只有列级约束
*/
DROP TABLE p2;
#创建表时添加列级约束
CREATE TABLE stu(
id INT PRIMARY KEY,#主键约束 = 非空且唯一
sid INT UNIQUE, #唯一约束
NAME VARCHAR(20) NOT NULL, #非空约束
score INT CHECK(score > 60),#check约束
age INT DEFAULT 18 #默认约束
);
DESC stu;
INSERT INTO stu(id,sid,NAME,score,age) VALUES(1,1000,'a',70,20);
INSERT INTO stu(id,sid,NAME,score,age) VALUES(2,1001,'b',71,21);
INSERT INTO stu(id,sid,NAME,score,age) VALUES(3,1002,'c',72,22);
INSERT INTO stu(id,sid,NAME,score,age) VALUES(4,1003,'d',73,23);
INSERT INTO stu(id,sid,NAME,score,age) VALUES(5,1004,'e',61,25);
INSERT INTO stu(id,sid,NAME,score) VALUES(6,1005,'f',62);
/*
注意:default 和not null只有列级约束
*/
#在创建表时添加表级约束
#主键
CREATE TABLE stu2(
id INT,
sid INT,
NAME VARCHAR(20),
#添加主键的表级约束 :CONSTRAINT 索引名 PRIMARY KEY(字段名1,字段名2,......)
CONSTRAINT stu2_id_sid PRIMARY KEY(id,sid)
);
DESC stu2;
INSERT INTO stu2(id,sid) VALUES(1,2);
INSERT INTO stu2(id,sid) VALUES(1,3);
#唯一
CREATE TABLE stu3(
#
id INT,
sid INT,
NAME VARCHAR(20),
#添加unique的表级约束 :CONSTRAINT 索引名 UNIQUE(字段名1,字段名2,......)
CONSTRAINT stu3_id_sid UNIQUE(id,sid)
);
DESC stu3;
INSERT INTO stu3(id,sid) VALUES(1,2);
INSERT INTO stu3(id,sid) VALUES(1,3);
#check
CREATE TABLE stu4(
id INT,
sid INT,
CHECK(id > 10 AND sid > 20)
);
INSERT INTO stu4(id,sid) VALUES(11,21);
INSERT INTO stu4(id,sid) VALUES(13,20);
#创建表后添加约束
CREATE TABLE stu5(
id INT,
sid INT,
NAME VARCHAR(20),
age INT,
score DOUBLE(5,2)
);
/*
primary key
添加约束 : alter table 表名 add primary key (字段名)
修改约束 : alter table 表名 modify 字段名 类型 primary key
删除约束 : alter table 表名 drop primary key
*/
ALTER TABLE stu5 ADD PRIMARY KEY(id);
ALTER TABLE stu5 DROP PRIMARY KEY;
ALTER TABLE stu5 MODIFY id INT PRIMARY KEY;
DESC stu5;
/*
unique:
添加约束 : alter table 表名 add unique(字段名)
添加约束 : alter table 表名 add constraint 索引名 unique(字段名)
修改约束 :alter table 表名 modify 字段名 类型 unique
删除约束 :alter table 表名 drop index 索引名
*/
ALTER TABLE stu5 ADD UNIQUE(sid); #sid就是索引名
ALTER TABLE stu5 ADD CONSTRAINT stu5_age_name UNIQUE(age,NAME);
ALTER TABLE stu5 DROP INDEX stu5_age_name;
ALTER TABLE stu5 DROP INDEX sid;
DESC stu5;
CREATE TABLE emp(
id INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(20)
);
INSERT INTO emp(NAME) VALUES('a');
/*
外键约束
1.先创建主表还是从表?先创建主表再创建从表
2.插入数据时先往主表还是从表?先往主表中插入数据再往从表中插入数据
3.删除数据时先删除主表还是从表?先删除从表再删除主表
*/
CREATE DATABASE d1;
#主表
CREATE TABLE dept(
dept_id INT AUTO_INCREMENT PRIMARY KEY,
dept_name VARCHAR(20)
);
#从表
CREATE TABLE emp(
emp_id INT AUTO_INCREMENT PRIMARY KEY,
last_name VARCHAR(15),
dept_id INT,
#外键约束:该员工的部门号必须是dept表中有的部门号
#格式:CONSTRAINT 索引名 FOREIGN KEY(本表中的字段名) REFERENCES 主表的表名(主表的字段名)
CONSTRAINT emp_dept_id_fk FOREIGN KEY(dept_id) REFERENCES dept(dept_id)
);
#插入数据:先往主表中插入数据再往从表中插入数据
INSERT INTO dept(dept_id,dept_name) VALUES(10,'IT');
INSERT INTO emp(last_name,dept_id) VALUES('longge',10);
#删除数据
DELETE FROM emp;
DELETE FROM dept;
#=====================================================
#级联删除 :当我们删除部门表中的数据时该部门中所有的员工将被直接删除
#主表
CREATE TABLE dept2(
dept_id INT AUTO_INCREMENT PRIMARY KEY,
dept_name VARCHAR(20)
);
#从表
CREATE TABLE emp2(
emp_id INT AUTO_INCREMENT PRIMARY KEY,
last_name VARCHAR(15),
dept_id INT,
#ON DELETE CASCADE: 级联删除
CONSTRAINT emp2_dept_id_fk FOREIGN KEY(dept_id) REFERENCES dept2(dept_id) ON DELETE CASCADE
);
#级联删除--当我们删除10号部门时 10号部门中所有的员工也将被删除掉
DELETE FROM dept2 WHERE dept_id=10;
8.分页
/*
limit 索引值,数据的条数
分页公式 :(页数-1)*数据的条数,数据的条数
*/
#需求:查询表中的前十条数据
SELECT *
FROM employees
LIMIT 0,10;
#再拉取十条
SELECT *
FROM employees
LIMIT 10,10;
#再拉取十条
SELECT *
FROM employees
LIMIT 20,10;