7.6数据库

数据库

连接数据库

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 nulla is null
is not nulla is not null
betweena between b and c

like

a like bsql匹配,如果a匹配b,结果为真
ina 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值