快速上手MySQL
mysql基础语法
### 字段操作
字段操作 | 概念 | 语法 |
---|---|---|
新增字段 | 对已经存在的表,插入新的字段 | alter table 【表名】 add 字段名 数据类型 属性 |
修改字段 | 在我们需要改进某个字段时 | alter table 【表名】change 原版字段名,新版字段名 属性 |
删除字段 | 删除无用字段 | alter table 【表名】 drop 字段名 |
主外键设置
我们使用主外键的方式来保证我们的数据完整性
概念及语法见如下表格
概念 | 语法 | |
---|---|---|
添加主键 | 保证数据完整性 | ALTER TABLE 表名 ADD CONSTRAINT 主键名PRIMARY KEY 表名(字段名); |
添加外键 | 保证数据完整性 | ALTER TABLE 表名ADD CONSTRAINT 设置外键名称 FOREIGN KEY(关联字段名) REFERENCES 关联表名字(字段名); |
注意事项:mysql的引擎支持问题,innoDB储存类型支持外键,MYISAMD的储存类型不支持外键
复合主键创建方式:
alter table result aDD constraint PK_RESULT primary key (studentNo,subjectNo,examDate);
DMl语句操作数据
插入数据记录
概念 | 语法 | |
---|---|---|
插入单行数据 | 插入一条需要存储在数据库的数据记录 | INSERT INTO 表名 (字段1,字段2)value(插入数据) |
插入多行数据 | 插入多行需要存储在数据库的数据记录 | INSERT INTO 表名 (字段1,字段2)value(插入数据1),(插入数据2) |
将查询结果插入新表第一种 | 将查询结果备份到新创建的数据库 | INSERT INTO 新表名 (字段1,字段2) select 字段1,字段2,… from 数据源表 |
将查询结果插入新表第二种 | 将查询结果备份到新创建的数据库 | select 字段1,字段2 into 新表 from 原表 |
修改数据记录
概念 | 语法 | |
---|---|---|
修改数据记录 | 当我们要对某一条数据修改或者更新时我们要用到 | UPDATE 表名 SET 字段1= '修改内容 WHERE 条件 |
删除表
概念 | 语法 | |
---|---|---|
删除数据方法一 | 删除与条件相符的数据 | Delete from 表名 where 判断条件 |
删除数据方法二 | 删除整个表的所有记录 | truncate table 表名 |
DQL查询
概念 | 语法 | |
---|---|---|
查询语句方法 | 在数据库中查询符合条件的数据 | SELECT 字段列表 FROM 查询表名 WHERE 条件 GROUP BY 分组字段 HAVING 条件 ORDER BY 排序字段名 ASC |
LIMIT子句
LINIT子句的使用
概念 | 语法 | |
---|---|---|
limit子句 | 设置查询显示的数据条数 | SELECT * FROM grade LIMIT 位置偏移量; |
常用函数集合
聚合函数
函数名 | 作用 |
---|---|
avg() | 返回某一字段的平均值 |
count() | 返回某个字段的函数 |
max() | 返回某字段的最大值 |
min() | 返回某字段的最小值 |
sum() | 返回某字段的总和 |
常勇字符串函数
函数名 | 作用 | 举例 |
---|---|---|
concat(STR1,STR2) | 连接字符串str1,str2为一个完整的字符串 | select concat(‘my’,‘s’,‘ql’)返回:mysql |
insert (str,pos,len,newstr) | 将str从怕pos的位置开始len个字符长度替换为newstr | insert (‘这是sql数据库’,‘3’,‘10’,‘mysql’);返回:这是mysql数据库 |
lower(STR) | 将str所有字符改为小写 | SQL LOWER(SQL)返回:sql |
upper(str) | 将str所有的字符串改为大写 | sql upper(sql)返回:SQL |
SUBSTRING(STR,NUM,LEN) | 返回字符串str的第num个位置开始长度为len的子字符串 | substring(‘javaMysqlOracle’,5,5)返回结果:Mysql |
时间日期函数
作用 | 举例 | |
---|---|---|
curdate() | 获取当前日期 | curdate()返回:2021-3-5 |
curtime() | 获取当前时间 | curtime()返回:15-39-45 |
now() | 获取当前的日期与时间 | 返回:2021-3-5-15-39-45 |
week(date) | 返回日期date为一年中的第几周 | SELECT WEEK(NOW());返回9 |
year(date) | 返回日期date的年份 | SELECT YEAR(NOW());返回时间为2021 |
HOUR(TIME) | 返回time的小时值 | SELECT HOUR(CURTIME());返回为 15 |
minute(time) | 返回time的分钟值 | SELECT MINUTE(CURTIME()); 返回值为44 |
datediff(date1,date2) | 返回d1和d2之间的相隔天数 | SELECT DATEDIFF(NOW(),‘2008-8-8’);返回值:4592 |
adddate(date,n) | 计算日期参数date加上n天之后的时间 | SELECT ADDDATE(NOW(),5);返回值:20213-10-15-48-05 |
数学函数
函数名字 | 作用 | 举例 |
---|---|---|
ceil(x) | 返回大于或等于数值x的最小整数 | SELECT CEIL(5);返回:5 |
floor(x) | 返回小于或者等于数值x的最大整数 | SELECT FLOOR(5);返回:5 |
rand() | 返回0~1的随机数 | SELECT RAND();返回0.86 |
in和not in 子查询
IN 子查询
问题: 在mysql中档当子查询跟随在=,!=,<,<=,>,>=之后,它不允许子查询返回多条记录,如果有多条满足条件的记录返回,会出现执行代码错误。
解决方法 :
把等号替换成 in关键字
in子查询的语法:
select 字段 from 表名
where 条件1 in(select 字段 from 表名 where 条件)————————> //在小括号中,再来一次查询,作为一个条件,来与条件1判断
NOT IN 子查询
问题:如果我们想要获得与in子查询相反的结果,
解决方案:不需要去进行过多的代码操作,只需要在代码中的 in 前加一个not 就可以获取到查询相反的结。
语法没有太大的变化
语法总结
启动与关闭
net stop MySQL;
net stop MySQL;
mysql -u root -p
创建数据库
create database 数据库名;
查看数据库列表,可查看已存在的数据库
show databases;
选择数据库
use 数据库名;
删除数据库
drop database 数据库名;
创建表
create table 表名(
字段1 数据类型 [字段属性|约束] [索引] [注释],
字段1 数据类型 [字段属性|约束] [索引] [注释]
);
查看表
show tables;
查看表定义
describe 表名; desc 表名;
删除表
drop table [if exists] 表名;
在删除表之前,先使用IF EXISTS语句验证表是否存在
设置数据表的存储引擎
creata table 表名(
)engine=存储引擎;
修改表名
alter table<旧表名> rename [to] <新表明>;
alter table `demo01` rename `demo02`;
添加字段
alter table 表名 add 字段名 数据类型 [属性];
alter table demo02 add `password` varchar(20) not null;
修改字段
alter table 表名 change 原字段名 新字段名 数据类型 [属性];
alter table demo02 change `name` `username` char(10) not null;
删除字段
alter table 表名 drop 字段名;
alter table demo02 drop `password`;
约束
添加主键约束
alter table 表名 add constraint 主键名 primary key 表名 (字段名);
alter tablestudent
add constraintpk_studen
primary keygrade
(gradeId);
添加外键约束
alter table 表名 add constraint 外键名 foreign key (外键字段) references 关联表名 (关联字段)
alter tablestudent
add constraint fk_student_grade foreign key(gradeId
) referencesgrade
(gradeId
);
插入单行数据
insert into 表名 [(字段名列表)] values (值列表);
insert intosyudent
(loginPwd
,studentName
,gradeId
,phone
,bornDate
)
values(‘123’,‘黄小平’,1,‘13956799999’,‘1996-5-8’);
插入多行数据
insert into 新表 (字段名列表)
values(值列表1),(值列表2),……,(值列表n);
insert intosubject
(subjectName
,classHour
,gradeID
)
values(‘Logic Java’,220,1),(‘HTML’,160,1),(‘Java OOP’,230,2);
将查询结果插入的新表
insert into 新表 (字段1,字段2,字段3)
select 字段1,字段2……
from 原表;
句式1需要先按照所插入字段的类型,顺序,个数创建新表,才能插入数据
create table 新表 (
select 字段1,字段2
from 原表 );
句式2: 岁插入语句的执行而创建新表,无须先创建表;
更新数据记录
update 表名 set 字段1=值1,字段2=值2,…,字段n=值n [where 条件];
删除数据记录
delate from 表名 [where条件];
删除表中所有记录
truncate table 表名;
DQL语句
select <字段名列表>
from <表名或视图>
[where <查询条件>]
[group by <分组的字段名>]
[having<条件>]
[order by <排序的字段名>[asc或deac]]
limit字句
select <字段名列表>
from <表名或视图>
[where <查询条件>]
[group by <分组的字段名>]
[order by <排序的列名>[asc或deac]]
[limit [位置偏移量,]行数]
简单子查询
SELECT … FROM 表1 WHERE 字段1 比较运算符(子查询)
select `studentNo`,`studentName`,`sex`,`bormDate`,`address`
from `student`
where `bornDate`>
(select `bornDate`from`student`where`studentName`=`李斯文`);
select 'studentName` from `student` where `studentNo` = (
swelect `studentNo` from `result`
inner join `Subject` on result.subjectNo= subject.subjectNo
where `studentResult` =60 AND `subjectName` ='Logic Java'
);
SELECT `studentName` FROM `student`
WHERE `studentNo` IN(
SELECT `studentNo` FROM `result`
WHERE `subjectNo` = (
SELECT `subjectNo` FROM `subject`
WHERE `subjectName`='Logic Java'
)AND `studentResult` = 60
);
转载:https://blog.csdn.net/doomwatcher/article/details/127807867