MySQL 基础day3—— 库、表、字段的操作,mysql 的数据类型,数据的操作,事务、约束及分页

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值