方式一
CREATE TABLE grade(
gradeId INT(3) COMMENT ‘年级id’,
gradeName VARCHAR(6) COMMENT ‘年级名称’,
PRIMARY KEY (gradeId
)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS student(
id INT(4) NOT NULL AUTO_INCREMENT COMMENT ‘学号’,
NAME VARCHAR(30) NOT NULL DEFAULT ‘未知’ COMMENT ‘姓名’,
gradeId INT(3) COMMENT ‘年级’,
PRIMARY KEY(id
),
KEY FK_gradeId
(gradeId
),
CONSTRAINT FK_gradeId
FOREIGN KEY (gradeId
) REFERENCES grade
(gradeId
)
)ENGINE=INNODB DEFAULT CHARSET=UTF8;
方式二
CREATE TABLE grade(
gradeId INT(3) COMMENT ‘年级id’,
gradeName VARCHAR(6) COMMENT ‘年级名称’,
PRIMARY KEY (gradeId
)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS student(
id INT(4) NOT NULL AUTO_INCREMENT COMMENT ‘学号’,
NAME VARCHAR(30) NOT NULL DEFAULT ‘未知’ COMMENT ‘姓名’,
gradeId INT(3) COMMENT ‘年级’,
PRIMARY KEY(id
)
)ENGINE=INNODB DEFAULT CHARSET=UTF8;
ALTER TABLE student ADD CONSTRAINT FK_gradeId
FOREIGN KEY(gradeId) REFERENCES grade(gradeId)
alter table 表名 add constraint 约束名 foreign key(作为外键的字段) references 关联的表(关联的字段)
以上操作都是物理外键,数据库级别的外键,不建议使用(避免数据过多造成困扰)
最佳实践
数据库就是单纯的表,只用来保存数据,没有外键
想要使用多张表数据时,使用外键时,通过程序实现
数据库意义:数据存储,数据管理
DML语言:数据操作语言
insert 添加
update 修改
delete 删除
insert into 表名 ([字段1,字段2,字段3,…]) values(‘值1’,‘值2’,‘值3’,…)
insert into grade(gradeId,gradeName) values(‘1’,‘大一’)
插入多条数据
insert into 表名([字段1,字段2,字段3,…]) values(‘值1’,‘值2’,‘值3’,…),(‘值1’,‘值2’,‘值3’,…)
INSERT INTO grade(gradeId,gradeName) VALUES(‘2’,‘大二’),(‘3’,‘大三’)
字段和字段之间使用英文逗号隔开
字段可以省略不写,但是后面的值必须和字段一一对应
update 表名 set 字段名 = 具体值 where 条件
update grade set gradeName =‘一年级’ where gradeId=1
条件:where 子句(字段 运算符 匹配值)
运算符
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | 3=1 | false |
<>或!= | 不等于 | 3<>1 | true |
> | 大于 | ||
< | 小于 | ||
>= | |||
<= | |||
between … and … | 在某个范围内 | [1,3] | |
and | && | 3>1 and 4>5 | false |
or | 3>1 or 4>5 | true |
使用条件筛选数据,如果没有条件则将所有的数据进行修改
多个修改的字段之间使用英文逗号隔开
delete 命令
delete from 表名 [where 条件]
删除符合条件的数据
delete from grade where gradeId=1
删除表中所有的数据,尽量避免这样用
delete from grade
truncate命令
作用:完全清空一个数据库表,表的结构和索引约束不会改变
truncate grade
delete 和truncate的区别
相同点:都能删除数据,但不会删除表结构
不同点:truncate是将表删除再重新创建,delete则不是,因而truncate重新设置自增列,计数器会归零
truncate不会影响事务
所有的查询操作都使用select
简单查询与复杂查询都能实现
数据库中最核心最重要的语句
使用频率最高的语句
select 字段 from 表名
查询表中所有的数据
select * from grade
查询指定字段
SELECT gradeName FROM grade
使用as给查询的字段,或表起别名
SELECT gradeName AS 年级 FROM grade AS 年级表
函数,concat(a,b) 连接函数,改变查询结果的展示
SELECT CONCAT(‘年级:’,gradeName) FROM grade
去重 distinct
作用:去除select查询出来的结果中重复的数据,重复的数据只显示一条
SELECT DISTINCT gradeName FROM grade
数据库中的列,表达式
查询系统版本
select version()
用于计算
SELECT 3*4+1 AS 结果
查询自增步长
SELECT @@auto_increment_increment
展示数据+1显示
SELECT gradeId+1 FROM grade
作用:检索数据库中符合条件的值
逻辑运算符
运算符 | 语法 | 描述 |
---|---|---|
and 或&& | a&&b 或 a and b | 逻辑与,两个都为真则结果为真 |
or | a or b | 逻辑或,其中一个为真则结果为真 |
not 或! | not a 或 !a | 逻辑非,a为真则假,a为假则真 |
推荐使用英文单词的写法
select * from grade where gradeId>1 &&gradeId<3
select * from grade where not gradeId=2
select * from grade where gradeId!=2
模糊查询:比较运算符
运算符 | 语法 | 描述 |
---|---|---|
is null | a is null | 若a为空,则结果为真 |
is not null | a is not null | 若a不为空,则结果为真 |
between … and … | a between b and c | 若a在b和c之间,则结果为真 |
like | a like %b%_ | sql匹配,若a匹配b,则结果为真,%表示任意个字符,_表示一个字符 |
in | a in (a1,a2,a3,…) | 若a在a1,a2或a3的某一个值中,则结果为真 |
查询姓王的同学
select * from student where studentName like 王%
查询姓王的同学,且在姓后只有一个字
select * from student where studentName like 王_
查询名字中带佳的同学
select * from student where studentName like %佳%
数据查询思路
1.分析需求,分析需查询的字段来自哪些表(连接查询)
2.确定使用哪种连接查询
3.确定交叉点,判断条件
操作 | 描述 |
---|---|
inner join 或 join | 如果表中有匹配的数据则返回 |
left join | 会从左表返回所有数据,右表如果不匹配,则右表数据显示为null |
right join | 会从右表返回所有数据,左表如果不匹配,则左表数据显示为null |
SELECT business_username,audio_title,audio_src FROM audio a JOIN business b ON a.business_id=b.business_id
SELECT business_username,audio_title,audio_src FROM audio a LEFT JOIN business b ON a.business_id=b.business_id
SELECT business_username,audio_title,audio_src FROM audio a RIGHT JOIN business b ON a.business_id=b.business_id
自连接
表本身相连,将一张表视为两张表
select a.name as ‘父节点’,b.name as ‘子节点’ from info a,
info b where a.id=b.pid
排序: 升序 asc 降序 desc
select name,course,scoreNum from student s , score sc
where s.id=sc.id order by scoreNum desc
分页:设置显示5条数据
使用分页得目的:缓解数据库压力,给人更好得体验
语法:limit 起始数据位置,显示条数
select name,course,scoreNum from student s , score sc
where s.id=sc.id order by scoreNum desc
limit 0,5
子查询:在查询中嵌套查询
查询参加了考试的学生姓名
select distinct name from student
where id in (select id from score)
order by scoreNum desc
limit 0,5