MySQL数据库的基本操作
1.数据库的创建
1.1创建数据库
创建数据库
create database <数据库名> -- 在sql语句中不区分大小写
使用数据库
use <数据库名>
删除数据库
drop database <数据库名>
查看数据库
show databases <数据库名>
1.2数据表的创建
数据表的基本操作
关键字 | 用法 |
---|---|
create | 创建一张表 |
drop | 删除一张表 |
show | 查看表的结构 |
alter | 修改表 |
drop关键字用法
drop table <表名> [restrict|cascade]
-- 使用restrict约束删除表时,如果该表存在依赖对象时,则该表将不会被删除,不加约束默认为restrict
-- 使用cascade约束删除表示,如果该表存在依赖对象,则会将该表及其依赖对象都删除
show关键字用法
show tables <表名>
-- 会显示表中的字段,数据类型
alter关键字
alter table <表名>
[add <新列名> <数据类型> <列级约束条件>]
[add <表级约束条件>]
[drop <列名> [restrict|cascade]]
[alter <列名> <数据类型>]
-- []表示可选项
create关键字
数据类型(常用)
数据类型 | 含义 |
---|---|
int(n) | 长度为n的整形数据 |
char(n) | 长度为n的定长字符串 |
varchar(n) | 长度为n的变长字符串 |
decimal(a,b) | 定点数,a位数字组成,小数部分b位 |
float(n) | 精度至少为n的浮点数 |
double | 双精度浮点数 |
boolean | 布尔值(true|false) |
date | 日期 : yyyy-mm-dd |
time | 时间: hh:mm:ss |
timestamp | 时间戳 |
create table <表名>(
<列名> <数据类型> [约束],
<列名> <数据类型> [约束],
<列名> <数据类型> [约束],
。。。。。。。。。。。。。
[表级约束]
)enging=innodb charset=utf-8
-- 设置引擎为innodb,字符集为utf8
-- 注意()内的最后一行不用逗号
例如:
-- 创建一个学生表student(id,stuNo,name,sex,birthday,email)
create table student(
id int(4) not null auto_increment,
stuNo int(8) not null,
name varchar(20) not null,
sex varchar(2) not null,
birthday date not null,
email varchar(20) not null,
primary key(id)
)enging=innodb default charset=utf8
-- 创建一个成绩表sc(id,stuNo,courseNo,score)
create table sc(
id int(4) not null auto_increment,
stuNo int(5) not null,
courseNo int(6) not null,
score varchar(8) not null,
primary key(id)
)enging=innodb default charset=utf8
2.数据操作
关键字
关键字 | 用法 |
---|---|
insert | 插入数据 |
update | 修改数据 |
delete | 删除数据 |
select | 查询数据 |
2.1插入数据
insert关键字
insert into <表名> [列名1,列名2,列名3...] values (常量1,常量2,常量3...)
-- 常量个数必须与每列相对应
-- 在学生表中插入李华(id=1,stuNO=20220429,name='李华',sex='男',birthday=2022-04-29,email='123456@qq.com')
insert into student (id,stuNo,name,sex,birthday,email)
value(1,20220429,'李华','男',2022-04-29,'123456@qq.com')
2.2修改数据
update关键字
update <表名>
set <列名>=<表达式>[,<列名>=<表达式>.....]
[where <条件>]
-- 如果没带条件该列所有值都将被修改
-- 修改李华的email为‘666666@qq.com’
update student set email='666666@qq.com' where name='李华'
2.3删除数据
delete关键字
delete from <表名>
[where <条件>]
-- 注意:使用delete一定要记得带条件,否则会将表中数据全部删除
-- 删除李华这条记录
delete from student where name='李华'
2.4查询数据
2.4.1单表查询
select [distinct] <列名1> [,<列名2>...]
from <表名> as <新表名>
where <条件>
-- as用来给表或者列取别名
-- distinct用来去除重复的字段
-- 查询student表中李华的信息
select * from student where name='李华'
-- *表示查询表中所有字段
2.4.2模糊查询
-
%(百分号):代表任意长度的字符串(长度可以为0)
-
_(下划线):代表任意单个字符
select <列名1> [,<列名2>...]
from <表名> as <新表名>
-- where name like '%刘'
-- 查询某表中name列中最后一个字为刘的信息
-- where name like '刘_'
-- 查询name只有两个字符,且第一个字符为刘的信息
-- 假如你要查李华的信息但你只记得他姓李
select * from student where name like '李%'
2.4.3 order by 子句
order by <列名> desc
-- 该列按照降序排列
order by <列名> desc
-- 该列按照升序排列
2.4.4聚集函数
SQL 常用聚集函数
函数 | 含义 |
---|---|
count(*) | 统计元祖个数 |
count(<列名>) | 统计该列中值的个数 |
sum(<列名>) | 计算该列的总和 |
avg(<列名>) | 计算该列的平均值 |
max(<列名>) | 求该列的最大值 |
min(<列名>) | 求该列的最小值 |
2.4.5连接查询
七类连接查询
语句 | 描述 |
---|---|
inner join | 只要表中至少有一个匹配,就返回匹配的行 |
right join | 会从右表中返回所有的值,即使左表没有与其匹配的值 |
left join | 会从左表中返回所有的值,即使右表没有与其匹配的值 |
注意:A inner join B A为左表,B为右表
-- 查询student表中没参加考试的同学的stuNo,sex,email,
-- 由于没参加考试的同学在sc表中不会有数据,
-- 我们只需要连接sc,student两张表并查出student表中存在而sc表中无数据的同学
select st.stuNo,sex,email
from student as st
right join sc as s
on st.stuNo=s.stuNo
2.4.6自连接
本质:将一张表拆分成多张表
将表A进行自连接
select a.<列名> as '父栏目',b.<列名> as '子栏目'
from A as a, A as b
where b.<父ID>=a.<ID>
2.4.7嵌套查询
本质:where条件为select查询
select <列名1>[,<列名1>...] from <表名> where <列属性> in(
select <列名1>[,<列名1>...] from <表名> where <条件>
)
-- 查询参加考试成绩不及格的同学的stuNo,sex,email
select stuNo,sex,email
from student
where stuNo in (select stuNo from sc where score<60
)
2.4.7查询总结
3.实务操作
事务的4个特性:
-
原子性(Atomicity):事务中的操作要么都执行,要么都不执行
-
一致性(Consistency):事务执行前后总数不变
-
隔离性(Isolation):多个事务并发执行互补影响
-
持续性(Durability):事务一旦提交将会不可改变
在一张表中操作事务步骤
-
关闭事务自动提交
-
开启事务
-
书写具体的事务逻辑
-
事务成功执行则提交事务
-
事务执行出错则回滚事务
-
开启事务自动提交
-- 关闭事务自耦东提交
set autocommit=0
-- 开启事务
start transaction
-- 书写事务逻辑(模拟转账A给B转账100)
update <表名> set money=money-100 where name='A'
update <表名> set money=money+100 where name='B'
-- 提交事务
commit
-- 回滚
rollback
-- 开启事务自动提交
set autocommit=1
-- 注意事务一旦提交之后将无法回滚,这是事务持续性的表现