Mysql 数据库(表设计、多表关联)

1.概述

👻:DB:(DataBase)数据库

🐳:用于存储数据

👻:DBMS:数据库管理系统(DataBase Management System )

🐳:用于创建/管理DB

👻:SQL:结构化查询语言(Structure Query Language)

🐳:用于与数据库通信,非数据库特有的

2.语法

👻不区分大小写,一般关键字大写,表名、列名小写

👻注释:


#单行注释
-- 单行注释(有空格)
/*
多行注释
*/

3.DDL

👻用于创建和修改数据表结构

👻创建、删除数据库

🐳:创建数据库

数据库一旦创建,名字不能修改


CREATE DATABASE [if not exists] 数据库名 [CHARSET utf8] 
🐳:删除数据库

DROP DATABASE 数据库名 / [IF EXISTS数据库名]
🐳:修改字符集

ALTER DATABASE 数据库名 CHARSET gbk

👻设计表

💀表是数据存储的基本单位

💀表==Java中类

💀表中有列/字段(类中属性)

💀一行数据就是一条记录(对象)


char(n) 长度为n的定长字符串
    若n=5,但只存储2个字符,仍占5个字符空间
varchar(n) 最大长度为n的可变字符串
date 年月日
datetime 年月日时分秒

👽主键:在数据库表中,必须有一列用来作为主键,以表示唯一的一条记录,主键不为空,不重复,一张表中只能有一列作为主键.

👽 约束:

PRIMARY KEY 添加主键约束 不为空,不重复

AUTO_INCREMENT 主键自动增长

NOT NULL 不为空约束 可以在一张表中给多列添加

UNIQUE 唯一约束 可以在一张表中给多列添加

CHECK(height<n) 检查约束

COMMENT 字段注释


 -- 创建表 
CREATE TABLE student(
          num INT  PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
          NAME VARCHAR(5) NOT NULL COMMENT '姓名',
          gender CHAR(5) DEFAULT '男' COMMENT '性别',  
          birthday DATE,
          height DOUBLE(3,2) CHECK(height<3),
          phone CHAR(11) NOT NULL UNIQUE,
          address VARCHAR(30),
          reg_time DATETIME
)

-- 删除表
DROP TABLE IF EXISTS student

-- 修改表名
RENAME TABLE stu TO student

-- 复制表结构,不复制数据
CREATE TABLE stu LIKE student

4.DML


-- 插入语句  自动增长列不用管
INSERT INTO student(NAME,gender,birthday,height,phone,address,reg_time)
            VALUES('李四','男','2001-1-1',1.96,'152333329','陕西 汉中',NOW())

INSERT INTO student SET NAME='小五',gender='男',phone='64235897462' 

INSERT INTO student(NAME,gender,birthday,height,phone,address,reg_time)
            VALUES('小明','男','2018-5-1',1.85,'1745257275','陕西 汉中',NOW()),
                  ('大黄','男','2014-9-1',1.78,'12365978','陕西 汉中',NOW()),
                  ('萧山','男','2005-4-5',1.94,'483659455','陕西 汉中',NOW());

-- 修改          
UPDATE stu SET birthday='2013-5-6',address='陕西西安',reg_time=NOW() WHERE num=2

-- 删除
DELETE FROM student WHERE num=6
#删除之后,行所在序号也随之删除

-- TRUNCATE TABLE 表名    清空整张表

5.DQL(基础查询)

👻单行函数:对每行数据处理,操作完仍是多少行

🐳:逻辑处理

-- case when 条件 then 结果1 else 结果2 end; 可以有多个when
SELECT
  num,
  NAME,
  (CASE WHEN state=0 THEN '未注册' ELSE '已注册' END )AS state
FROM student

-- ifnull(被检测值,指定值)函数检测是否为null,如果为null,则返回指定值,否则返回原本的值
SELECT NAME,IFNULL(address,'暂未登记') FROM student

--if 函数
SELECT num,NAME,IF(state=0,'未注册','已注册') FROM student
🐳:数学函数

round(数值):四舍五入

ceil(数值):向上取整,返回>=该参数的最小整数

floor(数值):向下取整,返回<=该参数的最大整数

truncate(数值,保留小数的位数):截断,小数点后截断到几位

mod(被除数,除数):取余,被除数为正,则为正;被除数为负,则为负

rand():获取随机数,返回0-1之间的小数


SELECT ROUND(height) FROM student

SELECT CEIL(height) FROM student

SELECT FLOOR(height) FROM student

SELECT TRUNCATE(height,1) FROM student

SELECT MOD(100,10) FROM student

SELECT RAND() FROM student
🐳:日期函数

now():返回当前系统日期+时间

curdate():返回当前系统日期,不包含时间

curtime():返回当前时间,不包含日期

YEAR(日期列),MONTH(日期列),DAY(日期列) , HOUR(日期列) ,MINUTE(日期列) SECOND(日期列)

str_to_date:将日期格式的字符转换成指定格式的日期

date_format:将日期转换成字符串

datediff(big,small):返回两个日期相差的天数


SELECT NOW() FROM student

SELECT CURDATE() FROM student

SELECT CURTIME() FROM student

SELECT YEAR(birth) FROM student

SELECT STR_TO_DATE('2002-05-09','%Y-%m-%d') FROM student

SELECT DATE_FORMAT(birth,'%Y-%m-%d') FROM student

SELECT DATEDIFF('2023-3-4','2004-2-19')
🐳:分组函数:将多行数据处理后变为一个,如:求和,平均数

SELECT COUNT(*) FROM student

SELECT MAX(height) FROM student

SELECT SUM(height) FROM student

SELECT AVG(height) FROM student
🐳:条件查询

-- != 和<> 作用相同
SELECT * FROM student WHERE gender != '男'
SELECT * FROM student WHERE gender <> '男'

SELECT * FROM student WHERE gender = '男' AND height >1.70;
SELECT * FROM student WHERE gender = '男' OR height >1.70;

SELECT * FROM student WHERE height IN(1.75,1.78,1.98);
SELECT * FROM student WHERE height NOT IN(1.75,1.78,1.98);

SELECT * FROM student WHERE height BETWEEN 1.70 AND 1.98
🐳:模糊查询

SELECT * FROM student WHERE NAME LIKE '张%'
 % 表任意多个字符,查姓氏为张的名字

SELECT * FROM student WHERE NAME LIKE '张__'
 下划线表任意单个字符,查名为几个个数的名字
🐳:合并

UNION、UNION ALL


-- UNION  合并且删除重复
SELECT * FROM student WHERE num<=3
UNION
SELECT *FROM student

-- UNION ALL  合并但不删除重复
SELECT * FROM student WHERE num<=3
UNION ALL
SELECT *FROM student
🐳:排序

DESC 降序 , ASC 升序 , 默认升序


SELECT * FROM student ORDER BY height

-- 先条件后排序
SELECT * FROM student WHERE num>2 ORDER BY height DESC

-- 多列排序
SELECT * FROM student ORDER BY height DESC,num ASC
🐳:限制查询结果

limit(offset,rows) 后面有一个参数,就检索前多少行;

后面有两个参数,从offset+1行开始,检索rows行。


-- 实现多结果分页
SELECT *FROM student LIMIT 0,3

SELECT * FROM student WHERE num>2 ORDER BY height LIMIT 3,3
🐳:分组查询

语法:
select 分组函数,列(要求出现在group by的后面)
from 表
[where 筛选条件(原始表的数据)] 
group by 分组的列表
[having 分组后的筛选]
[order by 子句]

6.多表关联及查询

🐳数据库设计范式:

1范式:确保列的原子性(不可拆分);

2范式:表要有主键(非必须),主键唯一,精确地表示记录;

3范式:将不同信息存储到不同表,消除冗余,使用外键关联。

👀外键:引用另一个表的记录,外键类型和主键列一致;

外键有弱关联关系:无任何约束;

外键有强关联关系:添加约束。

👀添加外键约束:

规则:FK_ForeignTable_PrimaryTable_On_ForeignColumn


--                                    约束名                                          引用
ALTER TABLE student ADD CONSTRAINT fk_major_student_majorid FOREIGN KEY(majorid) REFERENCES major(id)

🐳规则:

从表存在与主表的对应记录,则不能从主表中删除该行;

删除主表前,先删除从表;

不可改变主表的值导致从表数据孤立;

主表无记录时,不可将该记录添加到从表。

🐳笛卡尔乘积现象:表1有m行,表2有n行,结果=m*n

原因:未建立有效的连接

解决:添加有效连接

🐧内连接

语法:Select 结果 from 表1 inner join 表2 on 表1.column1 = 表2.column


SELECT s.num,s.name,s.gender,m.name FROM student AS s INNER JOIN major AS m ON s.majorid=m.id      

🐧左外连接

语法:select 结果 from 表1 left join 表2 on 表1.column1 = 表2.column2


SELECT s.num,s.name,s.gender,m.name FROM student AS s LEFT JOIN major AS m ON s.majorid=m.id

🐧右外连接

语法:select 结果 from 表1 right join 表2 on 表1.column1 = 表2.column2


SELECT s.num,s.name,s.gender,m.name FROM student AS s RIGHT JOIN major AS m ON s.
majorid=m.id
🐳多表关联

建立课程表、学生所选课程表、学生信息表

将三者进行关联


CREATE TABLE course(
    id INT,
    NAME CHAR(2)
)

CREATE TABLE student_course(    
    studentid INT,
    courseid INT

)

SELECT  s.num,s.name,GROUP_CONCAT(c.name) FROM student s 
        INNER JOIN student_course sc ON s.num =sc.studentid
        INNER JOIN course c ON sc.studentid = c.id
        GROUP BY s.num,s.name
🐳子查询

🐧标量子查询:一行一列

🐧列子查询:一列多行

🐧表子查询:多行多列

💀select 标量子查询

💀where 标量子查询、列子查询

💀from 表子查询


SELECT * FROM student WHERE (SELECT MAX(height) FROM student)

SELECT num,NAME,(SELECT NAME FROM major m WHERE m.id=majorid) FROM student

SELECT * FROM student WHERE height IN (SELECT height FROM student WHERE height>1.7 AND height <1.9)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小谭同学ha

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值