1(部分命令)
名称 | 解释 | 命令 |
---|---|---|
DDL(数据定义语言) | 定义和管理数据对象,如数据库,数据表等 | create、drop、alter |
DML(数据操作语言) | 用于操作数据库对象中所包含的数据 | insert、update、delete |
DQL(数据查询语言) | 用于查询数据库数据 | select |
DCL(数据控制语言) | 用于管理数据库的语言,包括管理权限及数据更改 | grant、commit、rollback |
1.命令行链接数据库:进入cmd命令行:
mysql -uroot -p(密码)
2.更改密码:首先进入mysql 注释 —
update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';
3.查看所有的数据库:
show database;
4.使用某个数据库:
— use 数据库名
5.查看某个数据库的表:
–show tables;
6.显示上表的具体信息
–describe 表名;
7.创建数据库
create database 数据库名;
8:exit;退出链接;
9 — 单行注释 /**/多行注释
2 操作数据库
操作数据库>操作数据库中的表>操作数据库中表的数据
mysql不区分大小写
2.1、操作数据库
1、创建数据库
create database i
f not exists
数据库名
2、 删除数据库
drop database if exists 数据库名
3、使用数据库
如果你的表名或者字段名是一个特殊字符需要用 ` `符号
4.查看所有的数据库:
show databases
2.2数据库的列类型
数值
tinyint 1
smallint 2
mediumint 3
int 4
bigint 8
float 4
double 8
decimal 字符串形式浮点数 金融计算的时候
字符串
char 固定大写0~255
varchar 可变字符串 0~65535 常用string
tinytext 微型文本 2^8-1
text 文本串2^16-1
时间日期
data YYY-MM-DD 日期
time HH: mm: ss时间格式
datetime YYY-MM-DD HH:mm:ss
timestamp 时间戳
year年份表示
null
没有值,未知
==注意,不要用null进行计算
2.3、数据库的字段属性
Unsigned:
无符号的整数;声明了该列不能声明为负数
zerofill;
0填充;不足额位数,使用0来填充;
自增:
通常理解为自增,自动在上一条记录的基础上自增1
通常用来设计唯一的主键 index 必须是整数类型
非空:null not null
假设设置为not null 如果不给值,就会报错
2.4创建数据库表
1.1、创建数据库列子
CREATE TABLE IF NOT EXISTS `student`(
`id` INT(4)NOT NULL AUTO_INCREMENT COMMENT '学号',
`name`VARCHAR(30) NOT NULL DEFAULT'匿名'COMMENT'姓名',
`pwd`VARCHAR(20)NOT NULL DEFAULT'123456'COMMENT'密码',
`sex`VARCHAR(2)NOT NULL DEFAULT'女'COMMENT'性别',
`birthday`DATETIME DEFAULT NULL COMMENT'家庭住址',
`address`VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
`email`VARCHAR(50) DEFAULT NULL COMMENT'邮箱',
PRIMARY KEY(`id`)#主键一个表只有一个主键 在最后设置
)ENGINE = INNODB DEFAULT CHARSET=utf8
格式;
create table [if not exists] `表名`(
`字段名` 列类型 [属性] [索引] [注释],
`字段名` 列类型 [属性] [索引] [注释],
`字段名` 列类型 [属性] [索引] [注释],
primary key(`字段名`),
)engine = innodb default charset = utf8
1.2、反向查看数据库的创建过程
SHOW CREATE DATABASE school#查看创建数据库的语句
SHOW CREATE TABLE student#查看创建表的语句
DESC student#查看表的结构
1.3 数据表的类型
MYISAM | INNODB | |
事务支持 | no | yes |
数据行锁定 | no | yes |
外键约束 | no | yes |
全文索引 | yes | no |
表空间的大小 | 较小 | 较小,约为2倍 |
常规使用操作:
MYISAM:节约空间,速度较快;
INNODB:安全性高,事物的处理,多表多用户操作;
1.4、修改删除表
#表的操作:用alert
#修改表名 ALTER TABLE 表名 RENAME AS 新表名
ALTER TABLE student RENAME AS stuent1
#增加字段 ALTER TABLE 表名 ADD 字段 字段属性
ALTER TABLE stuent1 ADD age INT(11)
#修改表的字段(重命名字段名,修改约束!)
ALTER TABLE stuent1 MODIFY age VARCHAR(11) #修改约束
ALTER TABLE stuent1 CHANGE age age1 INT(1)#修改表中字段名字
# modify修改字段的约束条件 change 更改字段的名字
#删除表中的某一字段:
ALTER TABLE stuent1 DROP age1
CREATE TABLE IF NOT EXISTS `teacher`(
`id` INT(4)NOT NULL AUTO_INCREMENT COMMENT '学号',
PRIMARY KEY(`id`)
)ENGINE = INNODB DEFAULT CHARSET=utf8
#删除表:
DROP TABLE IF EXISTS teacher
2.5 MySq数据管理
1.1 外键的设置
方式一:创建子表,同时创建外键
-- 年级表
create table `grade`(
`gradeid` int(10) not null auto_increment comment '年纪id',
`gradename` varchar(50) noy null comment '年级名称',
primary key(`gradeid`)
)engine=innodb default charset = utf8;
-- 学生表
-- 学生表的gradeid字段,要去引用年级表的 gradeid
-- 1. 定义外键key
-- 2. 给这个外键添加约束(执行引用)
create table if not exists `student` (
`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` varchar(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` varchar(20) NOT NULL DEFAULT '123456' COMMENT '密码',
`sex` varchar(2) NOT NULL DEFAULT '女' COMMENT '性别',
`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
`address` varchar(100) DEFAULT NULL COMMENT '家庭住址',
`gradeid` int(10) noy null comment '学生的年级',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY(`id`),
-- 1. 定义外键 FK_gradeid
KEY `FK_gradeid`(`gradeid`),
-- 2. 给这个外键添加约束
CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) references `grade`(`gradeid`)
)ENGINE = INNODB DEFAULT CHARSET = utf8;
方式二:直接添加外键约束
-- 创建表的时候没有外键关系
alter table `studnet` add constraint `FK_gradeid` foreign key(`gradeid`) references `grade`(`gradeid`),
1.2 DML语言
数据存储,数据管理
DML语言:数据操作语言
insert 插入
update 修改
delete 删除
添加 insert
-- 插入语句(添加)
-- insert into 表名([字段名1,字段名2,字段名3]) values('值1','值2','值3'grade)
-- 一个字段名,插入多行数据
INSERT INTO `grade`(`gradename`)VALUES('大三'),('大四'),('研一')
-- 字段名和插入值一一对应
INSERT INTO `student`(`name`,`pwd`,`sex`)VALUES ('李亚杭','123456789','男')
-- 多个字段插入多行数值,每一个组合都得和表中的字段一一对应
INSERT INTO `student`(`name`,`pwd`,`sex`)
VALUES ('李亚杭','123456789','男'),('李亚杭','123456789','男'),('李亚杭','123456789','男')
注意:字段和字段之间是有英文逗号隔开
字段名也可以省略,但是后面的值必须一一对应;
可以同事插入多条数据,values后面的值需要使用英文逗号隔开
修改 update
update 修改谁(条件) set 原来的值 = 新值
--修改一条数据
update 表名 set column_name = value where[条件]
UPDATE `student` SET `name` = '狂胜' WHERE id = 3
--修改多条数据 column_name之间用逗号隔开
UPDATE `student` SET `name` = '哈哈',`email` = '26099185@qq.com' WHERE id BETWEEN 7 AND 10
--通过多个条件定位数据
UPDATE `student` SET `name` = '木子亚航' WHERE `name` = '哈哈' AND `email` = '26099185@qq.com'
where 条件
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | 5=6 | false |
<>或 != | 不等于 | 5<>6 | true |
> | 大于 | ||
< | 小于 | ||
<= | 小于等于 | ||
>= | 大于等于 | ||
between…and… | 在某个范围内 | [2,5] | |
and | && | 5>1 and 1>2 | false |
or | || | 5>1or 1>2 | true |
注意:
colnum_name是数据库的列,尽量带上“;
条件,筛选的条件,如果没有指定,则会修改所有的列;
value,是一个具体的值,也可以是一个变量;
多个设置的属性之间,使用英文逗号隔开;
删除 delete
delete from 表名 where【条件】
truncate table 表名
相同点:都可以删除数据库中表的数据
不同点:truncate 重新设置自增列 计数器会归零
truncate不会影响事务
INSERT INTO `test`(`cool`) VALUES('0'),('1'),('2')
DELETE FROM `test`
INSERT INTO `test`(`cool`) VALUES('0'),('1'),('2')
TRUNCATE TABLE `test`
DQL(数据库查询语言)
data query language:数据库查询语言;
所有的查询操作都用它 Select
简单的查询,复杂的查询它都能做
数据库中最核心的语言
2.1、指定查询字段
–查询一个字段名
select `字段名` from 表名
–查询多个字段名
select `字段名`,`字段名`….from 表名
select
【left | right | inner join]–联合查询
【where】–指定结果需要满足的条件
[group by …] –指定结果按照哪几个字段来分组
【having】 –过滤分组的记录必须满足的次要条件
【order by …】–指定查询记录按一个或多个条件排序
【limit{[offset,]row_count | row_countOFFSET offset}】;
select 查询顺序;
–查询多个字段并且更改列的名字
select `字段名`as 更改的列名字,`字段名`as更改的列的名字 …..from 表名
— 函数
Concat(a,b)
字符串的拼接
SELECT CONCAT(‘姓名:’,studentname) AS 新名字 FROM student
—
去重操作 distinct
SELECT `studentno`FROM result
—
distinct 去除select查询出来的结果的重复的数据,重复的数据是现实一条
SELECT DISTINCT `studentno` FROM result
where条件子句
作用: 检索数据中符合条件的值
搜索的条件由一个或者多个表达式组成,结果为布尔值!
逻辑运算符
运算符 语法 描述
and && a and b a&&b 逻辑与,两个都为真,结果为真
or || a or b a || b 逻辑或,其中一个为真,则结果为真
Not ! not a !a 逻辑非,真为假,假为真
模糊查询:比较运算符
运算符 | 语法 | 描述 |
is null | a is null | 如果操作符为null,结果为真 |
is not null | a is not null | 如果操作符不为null,结果为真 |
between | a between b and c | a若在 b c 直接为真 |
like |
a like b | sql匹配,如果a匹配b,则结果为真 |
In |
a in(a1,a2,a3…..) | 假设a在其中一个里面为真 |
like
模糊匹配: %(0到任意一个字符) _(一个字符)
例如:查询名字带“刘”的名字
--LIKE 结合 %(代表0到任意一个字符) _(一个字符)
SELECT `studentname` FROM student WHERE studentname LIKE '赵%'
查询中间带有’无’字 的名字
--查询名字中带有’芷‘字的名字
SELECT `studentname` FROM student WHERE studentname LIKE '%无%'
与
in
相关的语句
-- 与in 相关的语句
-- 查询指定的学生
SELECT * FROM student WHERE `address` IN ('北京朝阳')
jion 链表查询
— 链表查询
— 参加了考试的同学(学号,姓名,科目编号,分数)
/*
思路
1.确定需求,分析查询的字段来自哪些表
2.确定使用哪种链接查询?7种
确定交叉点(这两个表中哪个数据是相同的)
判断的条件:学生表中的 studentno = 结果表中的 studentno
*/
SELECT s.studentno,studentname,subjectno,studentresult — 要明确 studentno 从那个表中得到 所以要加起新的名字并且明确是哪个表
FROM student AS s
INNER JOIN result AS r
WHERE s.studentno = r.studentno
-- inner join
SELECT CONCAT ('学号:',s.studentno),CONCAT('姓名:',studentname),gradeid,studentresult
FROM student AS s
INNER JOIN result AS r
WHERE s.studentno=r.studentno
-- right join
SELECT CONCAT ('学号:',s.studentno),CONCAT('姓名:',studentname),gradeid,studentresult
FROM student AS s
RIGHT JOIN result AS r
ON s.studentno=r.studentno
-- left join
SELECT CONCAT ('学号:',s.studentno),CONCAT('姓名:',studentname),gradeid,studentresult
FROM student AS s
LEFT JOIN result AS r
ON s.studentno=r.studentno
student表
result表:中没有1006这位同学的考试成绩
左连接两个表查询数据
:虽然result中没有1006这位同学的成绩 但是也会查询出来该同学的信息
-- left join
SELECT CONCAT ('学号:',s.studentno),CONCAT('姓名:',studentname),gradeid,studentresult
FROM student AS s
LEFT JOIN result AS r
ON s.studentno=r.studentno
inner join | 如果表中至少有一个匹配,就返回行 |
left join | 会从左表中返回所有的值,即使右表没有匹配 |
right join | 会从右表中返回所有的值,即使左边中没有匹配 |
join (连接的表)on (判断的条件:两个表之间的共同字段) 连接语法
where等值查询
多表连接的原理和二表连接是一样的
1.确定需求,分析查询的字段来自哪些表
2.确定使用哪种链接查询?7种
确定交叉点(这两个表中哪个数据是相同的)
SELECT CONCAT ('学号:',s.studentno),CONCAT('姓名:',studentname),s.gradeid,studentresult,subjectname
FROM student AS s
RIGHT JOIN result AS r
ON s.studentno=r.studentno
RIGHT JOIN `subject` AS sub
ON r.subjectno = sub.subjectno
2.2自连接和联表查询
== 自连接:自己的表和自己的表连接,核心:
一张表拆为两张一样的表即可
父类表:
pid |
categoryid |
categoryname |
1 |
2 |
信息技术 |
1 |
3 |
软件开发 |
1 |
5 |
美术设计 |
子类表:
pid |
categoryid | categoryname |
3 |
4 | 数据库 |
3 |
6 | web开发 |
5 |
7 | ps技术 |
2 |
8 | 办公信息 |
怎样连起两张表:子类的pid和父类的categoryid
父类 | 子类 |
信息技术 | 办公信息 |
软件技术 | 数据库 |
软件开发 | web技术 |
美术设计 | ps技术 |
-- 查询父子信息把一张表看成一模一样的表
SELECT a.`categoryname`AS '父栏目',b.`categoryname`AS '子栏目'
FROM `category` AS a,`category`AS b
WHERE a.`categoryid` = b.`pid`
-- 查询学员所在的年级
SELECT a.`studentname` AS '姓名',b.`gradeid` AS '班级'
FROM `student` AS a,`student`AS b
WHERE a.studentno = b.studentno
2.3分页和排序
3.MySQL函数
1.数学运算
-- 数学运算
select ABS(-8) --绝对值
select ceiling(9.4) --向上取整
select floor(9.4) -- 向下取整
select rand() --返回0~1之间的随机数
select sign() --判断一个数的字符 负数返回-1,正数返回1
2.字符串运算
--字符串函数
select char_length() --字符串长度
select concat('我','爱','你们') --字符串的合并
select insert('我爱编程helloword',1,2,'超级热爱')--查询,从某个位置开始替换某个长度
select lower('SAFAdfs') --转换小写
select upper('DASsd') --转换大写
select instr('kuangshen','h') --返回第一次出现的子串的的索引
select replace('坚持就能成功','坚持','努力') -- 指定字符串的替换
select substr('狂神说坚持就能成功',4,6)-- 从索引位置4开始,截取6个数据
select reverse()--反转字符串
3. 时间和日期函数
-- 时间和日期函数
select current_date() -- 获取当前日期时间
select curdate() -- 获取当前时间
select now() --获取当前时间
select localtime() --本地时间
select sysdate() --系统时间
select year(now())
select day(now())
select month(now())
select hour(now())
select minute(now())
select (now())
3.1聚合函数
函数名 | 描述 |
count() | 计数 |
sum() | 求和 |
avg() | 平均数 |
max() | 最大值 |
min() | 最小值 |
-- 会忽略所有的null值
SELECT COUNT(studentname) FROM student;-- count(指定列)
-- 不会忽略null值
SELECT COUNT(*)FROM student
-- 不会忽略所有的null值 本质 计算行
SELECT COUNT(1)FROM result
SELECT SUM(`studentresult`) AS 总和 FROM result
WHERE studentno='1000'
SELECT AVG(`studentresult`)AS 平均数 FROM result
WHERE studentno='1000'
SELECT MAX(`studentresult`)AS 平均数 FROM result
WHERE studentno='1000'
SELECT MIN(`studentresult`)AS 平均数 FROM result
WHERE studentno='1000'
-- 查询不同课程的平均分 最高分 最低分
SELECT s.subjectname,AVG(studentresult),MAX(`studentresult`),MIN(`studentresult`)
FROM result r
INNER JOIN `subject` s
ON r.subjectno = s.subjectno
GROUP BY r.subjectno
HAVING AVG(studentresult) > 80
SELECT subjectno,AVG(studentresult),MAX(`studentresult`),MIN(`studentresult`)
FROM result r
GROUP BY r.subjectno