MySQL学习笔记

这篇博客详细介绍了MySQL数据库的学习笔记,包括列属性如null、默认值、主键、唯一键和自动增长,以及运算符、三大范式、列类型如整型、小数类型和时间日期类型。此外,还讨论了函数、事务处理、回滚点、自定义函数的创建和调用,以及变量的使用。最后,涉及到了存储过程的概念和操作,如创建、调用和删除存储过程,并举例说明了存储过程参数的使用。
摘要由CSDN通过智能技术生成

基础sql操作(单表的增删改查)

查询语法:select (字段列表) from 表名;

插入语法:insert into 表名 (字段列表) values (值列表)

修改语法:update 表名 set 字段1=新值,字段2=新值…..where 条件过滤

删除行语法:delete from 表名 where 条件过滤

删除表语法:drop table 表名

字段的增删改:

增:alter table 表名 add 字段(类型)

改:alter table 表名 alter column 原字段 新字段(类型)

删:alter table 表名 drop column 字段

sql注入:select * from user where id = 2 or '1'='1';

一、列属性

列属性又称为字段属性,在MySQL中一共有6个属性:null、默认属性、列描述、主键、唯一建和自动增长

1、null

Null属性:代表字段为空,如果对应的值为yes,表示该字段可以为null

注意:设计表的时候,尽量不要让字段为空。

Mysql的记录长度为65535个字节,如果一个表中有字段允许为null,那么系统就会设计保留一个字节来存储null,最终有效存储长度为65534个字节。

2、默认值

Default:当字段被设计之后,如果允许默认条件下,用户不进行数据的插入,那么就可以使用事先准备好的数据来填充,通常填充的为null。

Default关键字的另外一层使用,显示告知字段使用默认值,在进行数据插入的时候,对字段直接使用default。

create table my_default(

name VARCHAR(10) not null,

age int DEFAULT 18 : 表示默认值

)

desc my_default;查询表的各属性,如类,主键,默认值.....

insert into my_default (name) VALUES ('jack');

select * from my_default;

insert into my_default VALUES ('rose',DEFAULT);

3、列描述

列描述:comment 是专门用于给开发人员维护的一个注释说明

基本语法: comment 字段描述;

查看comment:必须通过查看创建语句

Show create table 表名;

create table my_comment(

username VARCHAR(10) not null COMMENT '当前是用户名,不能为空',

password VARCHAR(10) not null comment '当前是密码,不能为空'

)

select * from my_comment;

show create table my_comment;

4、主键

顾名思义:主要的键。Primary key 在一张表中,有且仅有一个字段,里面的值具有唯一性与其他字段没有任何冲突,同时不允许为空,保证数据的唯一性。

创建主键

1. 随表创建

两种方式

1.1 直接在需要当作主键的字段之后,增加 primary key,增加primary key属性确定主键,在字段后增加主键属性。

create table my_pri1(

username VARCHAR(20) PRIMARY key

)

1.2 在所有字段之后增加primary key选项,primary key(字段信息)

create table my_pri2(

username VARCHAR(20),

PRIMARY key(username)

)

2. 表后增加

基本语法;alter table 表名 add primary key(字段)

create table my_pri3(

username VARCHAR(10)

)

alter TABLE my_pri3 add PRIMARY key(username);

查看主键

\1. 通过查看表结构desc 表名,pri主键,主键描述非空且唯一。

\2. 查看表的创建语句 show create table 表名;

删除主键

基本语法:alter table drop PRIMARY key;

保留了非空条件。

复合主键

将多个字段看成一个字段,作为主键,同时满足主键约束。

案例:有一张学生选修课表,一个学生可以选择多个课程,一个课程可以由多个学生来选择,但是一个学生在一个选修课程中只有一个成绩。

主键约束:主键一旦增加,那么对对应的字段有要求

\1. 当前字段对应的数据不能为空

\2. 当前字段对应的数据不能有重复

--复合主键

create table my_score(

student_no char(10),

course_no char(10),

score int not null,

PRIMARY key(student_no,course_no)

)

select * from my_score;

insert into my_score VALUES ('001','course001',100);

insert into my_score VALUES ('002','course001',90);

insert into my_score VALUES ('001','course002',95);

insert into my_score VALUES ('002','course001',98); --报错 主键冲突

主键分类

主键分类采用的是主键对应的字段的业务意义

业务主键:主键所在的字段,具有业务意义

逻辑主键:主键所在的字段,没有业务意义

5、唯一键

唯一键:unique key ,用来保证对应的字段中的数据唯一性的。

主键也可以用来保证数据的唯一性,但是一张表中只能有一个主键,多个字段都有需求,就要用到唯一键。

唯一键在一张表中可以存在多个

唯一键允许字段为null,null可以有多个,null不参与比较。

创建唯一键与创建主键非常类似:

\1. 直接在表字段之后使用unique key(字段)

\2. 在创建完表之后也可以增加唯一键

作业:自行创建唯一键,字段id,username,给username增加唯一键,测试效果。

删除唯一键,有多个唯一键,根据唯一键名字删除

删除基本语法: alter table 表名 drop index 唯一键名字;

Index关键字:索引,唯一键是索引的一种。

6、自动增长

自动增长:auto_increment,当给定某个字段该属性之后,该列的数据在没有提供确定数据的时候,系统会根据之前已经存在的数据进行自动增加后,填充数据。

通常应用于逻辑主键。

原理:

\1. 在系统中有维护一组数据,用来保存当前使用了自动增长属性的字段,记录当前对应数据值,再给定一个指定的步长。

\2. 当用户进行数据插入的时候,如果没有给定值,系统在原始值上加上步长变成新的数据进行插入

\3. 自动增长的触发:给定的属性字段没有提供值

\4. 自动增长只适用于数值。

基本语法:在字段之后增加一个属性:auto_increment

create table my_auto(

id int PRIMARY key auto_increment,

name VARCHAR(10) not null comment '用户名',

pass VARCHAR(10) not null comment '密码'

)

insert into my_auto VALUES (null,'jack','123');

insert into my_auto VALUES (null,'rose','123');

insert into my_auto VALUES (null,'liuneng','123');

select * from my_auto;

delete from my_auto where id=2;

二、运算符

1、算术运算符

+,-,*,/,%

基本算术运算,通常不在条件中使用,而是用于结果(select字段)

除法的运算用浮点表示,除数为0,系统返回null

拿null进行任何算术运算,结果都为null

create table ysf(

i1 int,

i2 int,

i3 int,

i4 int

)

insert into ysf VALUES (10,100,0,null);

select i1+i2,i1-i2,i1*i2,i1/i3,i2/i1,i1+i4 from ysf;

2、比较运算符

>,<,>=,<=,<>

通常用来在条件中限定结果

查询不同班级20岁以上的学生

Select class_id,count(*) from my_student where age>=20 group by class_id;

<=>比较

特殊应用:在字段结果中进行比较 select没有规定必须要有数据源

Select ‘1’ <=>1,0.02<=>0;

Mysql中数据会先转换成相同类型,再进行比较。

在mysql中没有boolean,用0,1代替,0代表false,1代表true

select class_id,count(*) from my_student where age BETWEEN 20 and 30 GROUP BY class_id;

between and 是闭区间

条件1必须小于条件2,反过来不可以。

3、逻辑运算符

And Or not

select class_id,count(*) from my_student where age>20 and age<30 GROUP BY class_id;

select class_id,count(*) from my_student where age<20 or age>30 GROUP BY class_id;

select * from my_student where not age =18;

4、in运算符

in:在sql中用来代替=,当结果不是一个值,而是一个结果集的时候。

基本语法:in (结果1,结果2……)

只要当前条件在结果集中出现,那么就成立

select * from my_student where class_id in (1,2);

5、like运算符

用来进行模糊查找

两个占位符

% ---- 代表多个字符

_ ------代表一个字符

select * from my_student where stu_name LIKE 'q%';

select * from my_student where stu_name LIKE 'q__';

三、三大范式

  1. 字段是原子性的,不可再分

  2. 有主键,非主键字段依赖主键,确保一个表只能说明一个事务

  3. 非主键,字段不能互相依赖,每列都与主键有直接关系,不存在传递的依赖

第一范式:不符合的例子

表:字段1,字段2(字段2.1,字段2.2),字段3.。。。。

第二范式:不符合的例子

表:学号、课程号、姓名、学分

这个表说明了两个事物,学生信息、课程信息,由于非主键字段必须依赖主键,这里学分依赖课程号,姓名依赖学号,所以不符合二范式。

解决:课程号变内容,或者增加课程表。或者增加逻辑主键。

第三范式:不符合第三范式的例子

表:学号、姓名、年龄、所在学院、学院地点、学院联系电话

存在依赖传递 学号==》所在学院=》学院地点、学院电话

解决方案:新增学院表

四、列类型

1、整型

Tinyint

迷你整型,系统采用一个字节来保存的整型,最大的表示范围是0-255

smallint

小整型,系统采用2个字节来保存的整型,能表示0-65535之间

Mediumint

中整型,系统采用3个字节来保存的整型。

Int

标准整型,采用4个字节来保存的数据

Bigint

大整型,采用8个字节来报从的数据。

无符号设定

无符号:表示存储的数据在当前字段中,没有负数,只有正数。

基本语法:在类型之后加上一个unsigned

显示长度

显示长度:指数据(整型)在数据显示的时候到底可以显示多少位

Tinyint(3):表示最长可以显示3位,unsigned说明只是正数,0-255永远不会超过3位。

Tinyint(4): 表示最长可以显示4位 -127---128

显示长度只是代表了数据是否可以达到指定长度,但是不会自动满足到指定长度,如果想要显示数据的时候,保持最高位显示长度,那么还需要给字段增加一个zerofill属性才行。

Zerofill:从左侧开始填充0,从左侧不会改变数值大小,所以负数的时候就不能使用zerofill,一旦使用了zerofill就相当于确定该字段位unsigned。

如果不足3位,那么填充到3位,如果本身已经够了或者超出,那么就不再填充。

显示长度可以自己设定,超出长度(但是没有超出范围)不会影响,只会对不够长度的进行补充。

create table my_int(

int_1 TINYINT,

int_2 smallint,

int_3 MEDIUMINT,

int_4 int,

int_5 BIGINT

)

--插入数据

insert into my_int VALUES (10,1000,100000,1000000,1000000000);

select * from my_int;

--插入超出范围的值

insert into my_int VALUES (255,255,255,255,255);

错误原因:并不是说tinyint没有那么大的空间,而是因为mys

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值