mysql> create database mydb ; -- 创建数据库 数据库名称一旦定义 无法修改 Query OK, 1 row affected (0.00 sec) mysql> drop database mydb; -- 删除数据库(连着库里面的表都全部删除 数据无法回滚的) mysql> show create database mydb;-- 展示创建数据库的相关的信息 +----------+-----------------------------------------------------------------+ | Database | Create Database | +----------+-----------------------------------------------------------------+ | mydb | CREATE DATAbase `mydb` | +----------+-----------------------------------------------------------------+2.操作表
-- 创建表格(数据 列(字段) 数据类型 约束) create table 表名( 列名1 数据类型 [约束], 列名2 数据类型 [约束], ..... 列名n 数据类型 [约束] ); -- 需求: 创建表 存储所有的用户信息 create table userinfo( id int, username varchar(20), gender char(1), phone char(11), age tinyint(2) unsigned, balance decimal(15,4), password varchar(70), birthday date, create_time datetime, update_time datetime, last_login_time datetime ); 映射关系: 代码操作数据。 一张表就是一个类。 表里面的字段就是类里面属性, 表里面字段的数据类型 就是类里面属性的数据类型。
操作表结构: alter(了解)
mysql> drop table a; -- 删除表 (数据无法回滚) Query OK, 0 rows affected (0.14 sec) mysql> alter table userinfo add address varchar(30); -- 新增新的列 mysql> alter table userinfo drop address; -- 删除指定的列 -- 可以修改列名 也可以修改类的数据类型 mysql> alter table userinfo change username username varchar(25); mysql> alter table userinfo change username name varchar(25); -- 修改列的数据类型 mysql> alter table userinfo modify name varchar(20); -- 修改指定的表的名称 mysql> alter table userinfo rename tb_userinfo; Query OK, 0 rows affected (0.10 sec)3.2. 数据类型
java数据类型: 引用+基本 基本: 4类8种
整数类型 byte short int long
小数类型 float double
布尔类型 boolean
字符类型 char
1 整数类型-- 1. tinyint(n) 类似byte -128-127 人的年龄 unsigned 0-255 tinyint(1) 类似boolean 0false 1true -- 2. int(n) 类似int id -- 3. bigint(n) 类似long id 时间的毫秒数 n: 限定列宽的宽度。 -- unsigned 无符号数字 -- zerofill 以0填充 int(5) 00100 1000000 -- 格式化类: NumberFormat 0 #2 小数类型
-- float(m,n) 学生的成绩 商品单价 -- double(m,n) m: 规定小数的总位数 n:限定小数点后面有几位数据 double(5,2) 111.23 -- 与钱相关的一些数据 -- BigDecimal -- decimal(m,n) 定点数 优先3 字符类型
-- char(m) 定长 性别char(1) 手机号码 身份证号码 -- varchar(m) 可变长度 用户名 简介 m: 限定存储字符个数。 char(5) 'abc' 存储的时候还是存储5个字符'abc__' 查询的时候 先trim 再展示数据 varchar(5) 'abc' 存储就是3个字符 -- text -- longtext String4 日期类型
-- 年月日 date -- 年月日 时分秒 datetime timestamp -- 时分秒 time -- 年 year(2/4) 2022 223.3 DML
1. insertinsert delete update
对于insert 有几行记录受影响? >=1
-- 1. 对所有的列都新增新的数据 insert into 表名 values (数据1,....数据n); -- 有几个字段 就新增几个数据即可 mysql> insert into tb_userinfo values ( -> 1,'jackMa','m','111111',40,6666666, -> '1234','1977-01-01','2020-01-01 12:00:00',null,null -> ); mysql> select * from tb_userinfo; +------+--------+--------+--------+------+--------------+----------+------------+---------------------+-------------+-----------------+ | id | name | gender | phone | age | balance | password | birthday | create_time | update_time | last_login_time | +------+--------+--------+--------+------+--------------+----------+------------+---------------------+-------------+-----------------+ | 1 | jackMa | m | 111111 | 40 | 6666666.0000 | 1234 | 1977-01-01 | 2020-01-01 12:00:00 | NULL | NULL | +------+--------+--------+--------+------+--------------+----------+------------+---------------------+-------------+-----------------+
-- 在很多情况下 不需要对所有的列赋值 指定列新增记录 -- 2. insert into 表名 (列名1,...列名n) values (数据1,....数据n); mysql> insert into tb_userinfo (id,name,password,create_time) values (2,'ponyMa','1234',now()); Query OK, 1 row affected (0.05 sec) mysql> insert into tb_userinfo (id,name,create_time) values (3,'马云',now()); ERROR 1366 (HY000): Incorrect string value: 'xC2xEDxD4xC6' for column 'name' at row 1 -- 不能存储汉字数据? mysql> show create database mydb; +----------+-----------------------------------------------------------------+ | Database | Create Database | +----------+-----------------------------------------------------------------+ | mydb | CREATE DATAbase `mydb` | +----------+-----------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> alter database mydb CHARACTER SET UTF8; -- 修改指定数据库的编码格式 Query OK, 1 row affected (0.00 sec) mysql> show create database mydb; +----------+---------------------------------------------------------------+ | Database | Create Database | +----------+---------------------------------------------------------------+ | mydb | CREATE DATAbase `mydb` | +----------+---------------------------------------------------------------+ -- 修改完数据库的编码格式 还是会有可能出现不能存储中文问题 -- 有可能是因为这张表 他是在修改编码格式之前创建好的。 -- 对于cmd这个客户端而言 没法修改 只能先删除 再创建新的一张表 -- 局部修改指定的一个数据库的编码格式 。 mysql> show variables like '%character%'; +--------------------------+---------------------------------------------------------+ | Variable_name | Value | +--------------------------+---------------------------------------------------------+ | character_set_client | gbk | | character_set_connection | gbk | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | gbk | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | C:Program FilesMySQLMySQL Server 5.7sharecharsets | +--------------------------+---------------------------------------------------------+ -- 全局修改mysql的服务器的编码格式: -- my.ini default-character-set=utf8 character-set-server=utf8 -- 修改了核心配置文件 重新启动mysql的服务。
-- 一次新增多条记录 性能比较高 -- 3. insert into 表名 (列1....列n) values (数据1,....数据n),(数据1,....数据n),(数据1,....数据n);2. update
一次更新一行记录。 带条件修改。条件语句 where
-- 1. update 表名 set 列1=新的数据,... 列n=新的数据; -- 修改表里面所有的记录 mysql> update tb_userinfo set age=35,gender='m'; -- 2. update 表名 set 列1=新的数据,... 列n=新的数据 where 条件1 and/or 条件2; mysql> update tb_userinfo set balance=7000,birthday=now() where id=4;3. delete
删除. 删除一个 删除多个。
-- delete from 表名; -- 删除表里面的所有的数据(清空表) 可以回滚 -- delete from 表名 where 条件1 and/or 条件2; mysql> delete from tb_userinfo where id=3 or id=4; mysql> delete from tb_userinfo where id in (1,2);4. 客户端工具
// 1. navicat // 2. sqlyog // 3. mysqlFront5.约束
限定字段数据。 数据需要满足一些规则。
表级约束 primary key
行级约束: not null default unique primary key
5.1 not null非空约束 。 限定列的数据不能为null。
-- INSERT INTO tb_product (id,prod_price) VALUES (5,10); -- prod_name必须赋值 不能为null not null -- 修改这个列的特征 DESC tb_product; ALTER TABLE tb_product MODIFY prod_name VARCHAr(20) NOT NULL; CREATE TABLE a1( id int not null, name varchar(20) not NULL );5.2 default
默认约束。 给指定列设置默认值。
-- CREATE TABLE a1( -- id int not null, -- name varchar(20) NOT NULL DEFAULT '无名氏', -- age int -- ); -- ALTER TABLE a1 modify name varchar(20) not null DEFAULT '无名氏'; -- DESC a1; -- INSERT INTO a1 (id,`name`,age) VALUES (1,null,20);5.3 unique
unique。保证列的数据唯一性。 也称为唯一性索引。
NOT NULL+ UNIQUE ===> PRI
索引----> 目录 效率比较快的。 底层是结合一些算法维护索引。 创建唯一性约束 自带索引的。 有索引的字段在查询的语句中 比没有索引列 性能更快。 推荐在sql中大量创建索引。 第4阶段。
-- CREATE TABLE a1( -- id int not null, -- name varchar(20) NOT NULL UNIQUE DEFAULT '无名氏', -- age int NOT null -- ); -- 在NOT NULL UNIQUE 下 默认约束就没有意义 -- NOT NULL+ UNIQUE ===> PRI -- ALTER TABLE a1 modify name varchar(20) UNIQUE;5.4 primary key
主键约束。 数据特征: not null+unique
也可以称为主键索引。 自带索引。
-- 1. 一张表里面只有1个主键约束。 -- 2. 任意类型的列都可以充当主键列。-----> 整型(自增)+字符类型(uuid) -- 3. 可以有多个列同时充当一个主键列。(联合主键)---->必须使用表级约束 表设计: 理论上遵循3大范式 第1范式: 保证列的原子性。 列不可再分。 河南省郑州市高新 没有保证原子性。 provice city area 第2范式: 在遵循第1范式的基础之上 保证行记录的唯一性。 id唯一。 一般都是主键约束。 第3范式: 在遵循第2范式的基础之上. 尽可能减少/不能出现数据/列的过度冗余。 主键列或者外键列的数据除外。可以允许冗余。 具体的表设计看具体的需求。
-- DROp TABLE a1;
--
-- CREATE TABLE a1(
-- id int PRIMARY KEY auto_increment,
-- name varchar(20) NOT NULL UNIQUE,
-- age int NOT NULL
-- );
--
-- DESC a1;
-- id: PRIMARY KEY 必须要唯一 手动维护唯一性???
-- mysql自己维护主键列id的数据 自己累增+1
-- 主键列是整型的话 一般都会与auto_increment 联合使用。
-- ALTER TABLE a1 MODIFY id int auto_increment;
-- id的数据自增了 在insert的时候 就不需要对id赋值 了
-- 自定义自增的初始值 默认1 每次自增+1
-- ALTER TABLE a1 auto_increment 1001;
-- SET GLOBAL auto_increment_increment=5;
-- 可以获得上一次新增的id的数据
-- SELECT LAST_INSERT_ID();
-- SELECT * FROM a1;
INSERT INTO a1 (`name`,age) VALUES ('张翠翠4',20);
SELECt * FROM a1;
-- create TABLE b(
-- id VARCHAr(100),
-- name VARCHAr(20),
-- PRIMARY KEY(id) -- 表级约束
-- );
-- DESC b;
-- 1.要么在代码里面 UUID 传过来一个唯一的字符串的数据
-- 2. 交给mysql服务器维护 id值 UUID()
INSERT INTO b (id,name) VALUES (UUID(),'tom');
-- CREATE TABLE c(
-- name VARCHAr(20),
-- pass VARCHAr(100),
-- age int,
-- PRIMARY key(name,pass)
-- );
-- desc c;
-- 场景: 一般经常出现在中间表里面、(维护其他多张表的关系)
INSERT INTO c(name,pass) VALUES ('tom','1234');
5.5 foreign key
外键约束。使用外键约束修饰的列 称为外键列。
1. 一张表里面可以有多个外键列 2. 外键约束维护多表关系的。 3. 一张表里面如果有外键列的话 这张表作为从表或者子表。 4. 外键列的数据要严格操作主表/基表里面的主键列的数据。
表与表之间的关系: 1. 用户与购物车 1对1关系 2. 购物车与购物项 一对多 购物车里面有很多购物项 还有总价 3. 购物项与商品 一对一 得知: 4. 用户与商品 多对多1. 一对一
-- 新增外键约束 -- tb_cart.uid 将这个列变为外键列 -- ALTER TABLE tb_cart ADD ConSTRAINT FOREIGN KEY (uid) REFERENCES tb_userinfo(id);
在外键约束下操作主表+子表数据:
-- 新增外键约束
-- tb_cart.uid 将这个列变为外键列
-- ALTER TABLE tb_cart ADD ConSTRAINT FOREIGN KEY (uid) REFERENCES tb_userinfo(id);
-- 一:有外键约束 删除/更新 RESTRICT
-- 新增用户信息
-- 1. 新增主表
-- INSERT INTO tb_userinfo (name) VALUES ('王五');
-- 2.删除主表
-- DELETe FROM tb_userinfo WHERe id =11; -- 子表没有参考主表的信息
-- DELETe FROM tb_userinfo WHERe id =1;
-- 不能删除 子表在使用这个数据
-- 根本原因: 在外键约束里面 删除/更新 RESTRICT
-- 3. 修改主表信息
-- UPDATe tb_userinfo SET gender = 'n' WHERe id =1;
-- 操作子表
-- 1. 新增子表的数据
-- INSERT INTO tb_cart (total_money,uid) VALUES (1000,6); -- 这个数据必须存在于主表里面
-- 2. 删除子表的数据
-- DELETE FROM tb_cart WHERe id=1011;
-- 3. 修改子表的数据
-- UPDATe tb_cart SET total_money = 2000,uid=10 WHERe id = 1001;
-- 二:有外键约束 删除/更新 SET NULL
-- 删除主表
-- DELETE FROM tb_userinfo WHERe id =1;
-- 子表里面没有记录关联数据 直接删除
-- 有 会先将子表里面记录update为null 然后再删除主表的数据
-- 二:有外键约束 删除/更新 CASCADE 级联
-- 删除主表
-- DELETE FROM tb_userinfo WHERe id =6;
-- SELECt * FROM tb_userinfo;
-- SELECt * FROM tb_cart;
-- 总结: 外键约束可以维护多表数据。
-- 弊端: 性能低。不太推荐使用外键约束的。 外键列还正常使用。
-- 只需要将一个普通列看成外键列即可。 弱化外键思想。伪外键
2.一对多
3. 多对多一个购物车有多个购物项
学生+老师 学生+课程
角色+权限



