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)