栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java入门-------MySQL(尚马day20) week5(6)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java入门-------MySQL(尚马day20) week5(6)

3.1 DDL 1. 操作库
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  
​
String

4 日期类型
-- 年月日  date
-- 年月日 时分秒 datetime  timestamp
-- 时分秒 time
-- 年 year(2/4) 2022 22

3.3 DML

insert delete update

1. insert

对于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. mysqlFront

5.约束

限定字段数据。 数据需要满足一些规则。

表级约束 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. 多对多

学生+老师 学生+课程

角色+权限

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/760304.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号