数据库
连接数据库
mysql -uroot -p123456
show databases;
use school;
show tables;
describe student;显示数据库表的信息
creat database westos;创建一个数据库
exit;退出连接
数据库xxx语言:
DDL 定义
DML 操作
DQL 查询
DCL 控制
操作数据库
create database if not exists westos;创建数据库
drop database if exist hello;删除数据库
数据库的列类型
数值
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
时间日期
date YYYY-MM-DD,日期格式
time HH:mm:ss 时间格式(24小时)
datetime YYYY-MM-DD HH:mm:ss 最常用的时间格式
timestamp 时间戳,1970.1.1到现在的毫秒数
year 年份表示
数据库的字段属性
Unsigned:无符号的整数,声明了该列不能为负数
zerofill: 0填充的,不足的位数,使用0来填充,int(3),005
自增:自动在上一条记录的基础上+1(默认)
通常用来设计唯一的主键 index,必须是整数类型
可以自定义设计主键自增的起始值和步长
非空 not null:如果不填写值,默认就是null
默认:设置默认的值
CREATE TABLE `student` (
`id` int 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 AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
数据表的类型
myisam 节约空间,速度较快
innodb 安全性高,支持事务的处理,支持外键,多表多用户操作
所有数据库文件都存在data目录下
本质还是文件的存储
修改表名 alter table 旧表名 rename as 新表名
alter table teacher rename as teacher1
增加表的字段 alter table 表名 add 字段名 int(11)
alter table teacher1 add int(11)
修改表的字段(重命名,修改字段)
alter table teacher1 modify age varchar(11)
alter table teacher change age age1 int(11)
表名rename
字段名change用来字段重命名,不能修改字段类型和约束
modify不能用来字段重命名,只能修改字段类型和约束
删除表的字段
alter table teacher1 drop age1
删除表
drop table if exists teacher1
CREATE TABLE `student` (
`id` INT 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`student` COMMENT '出生日期',
`gradeid` INT(10) NOT NULL COMMENT '学生的年级',
`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭地址',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`),
KEY `FK_gradeid`(`gradeid`),
CONSTRAINT `FK_gradedid` FOREIGN KEY (`gradeid`) REFERENCES `grade`(`gradeid`)
) ENGINE=INNODB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
创建表的时候没有外键关系
alter table student
add constraint FK_gradeid foreign key(gradeid) references grade(gradeid)
最佳实践:
数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)
想使用多张表的数据,想使用外键(程序去实现)
插入语句
insert into 表名 ([字段名1,字段2,字段3])values(‘值1’),(‘值2’),(‘值3’...)
insert into grade(gradename)values(大四)
由于主键自增我们可以省略(如果不写表的字段,他就会一一匹配)
插入多个字段
insert into grade(gradename)
values(‘大一’),(‘大二’)
修改
修改学员名字,带了条件
update student set name=‘狂神’where id=1;
不指定条件的情况下,会改动所有的表
update student set name=‘长江七号’
设置多个属性,逗号隔开
update student set column_name=‘狂神’,email=‘123456789’ where id=1;
条件:where 子句 运算符 id等于某个值,大于某个值
操作符 | 含义 | ||
= | |||
<>或!= | 不等于 | ||
>,>= | |||
<,<= | |||
between...and... | 区间[2,5] | ||
and | 与 | ||
or | 或 | ||
value 是一个具体的值也可以是一个变量
删除数据
delete from student where id=1
truncate:完全清空一个数据库表,表的结构和索引约束不会变
truncate student;
delete和truncate区别:
delete from test //不会影响自增
truncate table test;//自增会归零
delete重启数据库后,引擎区别:
InnoDB:自增列会从一开始(存在内存当中的,断电即失)
MyISAM 继续从上一个自增量开始(存在文件中的,不会丢失)
//查询全部的学生
select * from student;
查询指定字段
select StudentNo,StudentName from student;
AS给查询的列名起别名,也可以给表起别名
select StudentNo as 学号,StudentName as 学生姓名 from student;
函数 concat(a,b)给列名起别名
select concat(‘姓名:’,StudentName)as 新名字 from student
去重:查询有哪些同学参加了考试
select StudentNo from result;发现有重复的学号
select distinct StudentNo from result;
查询系统的版本
select version();
用来计算
select 100*3-1 as 计算结果
查询自增的步长(变量)
select @@auto_increment_increment
学员考试成绩全部+1分
select StudentNo,Student+1 as提分后 from result;
数据库中的表达式:文本值,列,Null,函数,计算表达式,系统变量...
select 表达式 from 表
where条件子句
搜索的条件由一个或多个表达式组成,结果为布尔值
查询考试成绩在95-100分之间
1、select studentNo,studentResult from result
whereStudentResult>=95 and StudentResult<=100
2、select studentNo,studentResult from result
whereStudentResult between 95 and 100
除了1000号学生之外的同学的成绩
1、select studentNo,studentResult from result
where StudentNo !=1000
2、select studentNo,studentResult from result
where not StudentNo =1000
模糊查询:比较运算符
运算符 | 语法 | 描述 |
is null | a is null | |
is not null | a is not null | |
between | a between b and c | |
like | a like b | sql匹配,如果a匹配b,结果为真 |
in | a in(a1,a2,a3) | 假设a在其中某一个值中为真 |
查询姓刘的同学,名字后面只有一个字的
like结合 %(代表0到任意个字符) _(一个字符)
select StudentNo,StudentName from student
where studentName like '刘%';
查询姓刘的同学,后面只有一个字的
select StudentNo,StudentName from student
where studentName like '刘_';
查询姓刘的同学,后面只有2个字的
select StudentNo,StudentName from student
where studentName like '刘__';
查询名字中有嘉字的同学 %嘉%
select StudentNo,StudentName from student
where studentName like %嘉%;
IN(具体的一个或多个值)
查询1001,1002,1003号学员
select StudentNo,StudentName from student
where studentNo in(1001,1002,1003);
查询在北京的学生
select StudentNo,StudentName from student
where Address in (‘北京’)
null not null
查询地址为空的学生 null ‘’
select StudentNo,StudentName from student
where address=‘’ or address is null
查询有出生日期的同学 不为空
select StudentNo,StudentName from student
where borndate is not null
查询没有出生日期的同学
select StudentNo,StudentName from student
where borndate is null
联表查询 join
思路:
分析需求,分析查询的字段来自哪些表,(连接查询)
确定使用哪种连接查询
确定交叉点(这两个表中哪个数据是相同的)
判断条件:学生表中 studentNo=成绩表 studentNo
join on 连接查询
where 等值查询
inner join
select s.studentNo,studentName,SubjectNo,StudentResult
from student as a
inner join result as r
on s.studentNo=r.studentNo
right join
select s.studentNo,studentName,SubjectNo,StudentResult
from student as a
right join result as r
on s.studentNo=r.studentNo
left join
select s.studentNo,studentName,SubjectNo,StudentResult
from student as a
left join result as r
on s.studentNo=r.studentNo
查询缺考的同学
左外连接:左表的所有数据-左右表共有的数据
select s.studentNo,studentName,SubjectNo,StudentResult
from student as a
left join result as r
on s.studentNo=r.studentNo
where StudentResult is null
联三张表查询
SELECT s.studentNo,studentName,subjectname,studentresult
FROM student AS s
RIGHT JOIN result AS r
ON r.studentNo = s.studentNo
INNER JOIN `subject` AS sub
ON r.subjectNo=sub.subjectNo
自连接
自己的表和自己的表连接,核心:一张表拆为两张一样的表即可
查询父子信息:把一张表看为两个一模一样的表
select categoryname as‘父栏目’,categoryname as ‘子栏目’
from category as a,category as b
where a.categoryid=b.pid
查询学院所属的年级(学号,学生的姓名,年级名称)
select studentNo,studentname,gardename
from student s
inner join grade g
on s.gradeid=g.gradeid
查询科目所属的年级
select subjectname,gradename
from subject sub
inner join grade g
on sub.gradeid=g.gradeid