写在前面:
对于数据库而言,增删查改将会是程序员之后工作中得重中之重,因此必须熟悉数据库基的本操作,牢记并加以练习!!!
在讲解数据库之前,简略提及一下cmd窗口登录MySQL
打开控制命令后(前提为以下载好MySQL并配置好相应环境)输入mysql -u root -p+密码;
数据类型 | 说明 | 占用存储空间 |
---|---|---|
TINYINT | 1字节 | |
SMALLINT | 2字节 | |
INT | 4字节 | |
BIGINT | 字节 | |
FLOAT(M,D) | 单精度浮点数,M指定长度,D指定小数点 位数,会发生精度丢失 | 4字节 |
DOUBLE(M,D) | 双精度浮点数,M,D含义如上 | 8字节 |
DECIMAL(M,D) | M范围是1到65,D范围是0到30,M默认为10,D默认为0,D不大于M,小数位不足自动补0,首位数字为0自动忽略(精度高) | 取决于M和D的值 |
数据类型 | 格式 | 所占存储空间 | 用途 |
---|---|---|---|
DATE | YYYY-MM-DD | 3 | 年月日说明 |
TIME | HH:MM:SS | 3 | 小时间说明 |
YEAR | YYYY | 1 | 年份说明 |
DATETIME | YYYY-MM-DD HH-MM–SS | 8 | 具体年月日以及时间 |
TIMESTAMP | 同DATETIME(不建议使用,至2038年后用尽) | 4 | 具体年月日以及时间 |
数据类型 | 说明 | 大小 |
---|---|---|
VARCHAR(SIZE) | 可变长度字符串,需要指定字符集(默认为 Latin1 字符集) | 0~65535字节 |
TEXT | 长文本数据 | 0-65535字节 |
MEDIUMTEXT | 中等长度文本数据 | 0-1677215字节 |
BLOB | 二进制形式的长文本数据 | 0-65535字节 |
语法:create database 库名
例如:创建一个库名为 test1117 的数据库: create database test117;
在控制命令窗口中输入如下sql控制命令:
出现Query OK即为创建成功,后面的 1 row affected 即为一行受到影响(详情见后文),最后的(0.00 sec) 表示执行该sql语句的大致反应时间.
查看目前MySQL中一共有多少个数据库
语法: show databases;
需要注意的是:红色圈中的数据库,均为MySQL自带数据库,蓝绿色圈中的为我们自建的数据库.系统自带的数据库禁止随意操作,操作不当容易让MySQL挂了
语法: use 库名
当你有多个库时,想对某个库进行操作时,必须先使用该库(可以理解为操作对象),使用该数据库后,后续的操作在不进行更换数据库的使用时,均在当前数据库下进行操作.
删除MySQL中不需要的数据库
语法: drop database 库名
删表需要十分谨慎!!!
系统自带的表禁止随意删除,会让MySQL挂掉,而我们自带的数据库也要谨慎删除,尤其是在未来工作中
当前操作的数据库为上文中的test1117数据库
语法: create table 表名 (field1 datatype, 字段2 数据类型, filed3 datatype…)
例如:创建一张学生表,表中包含学生姓名,学号;
查看当前学生表的表结构
语法: desc student
解释说明:
Field: 字段 -- 对表中的内容说明,例如学生表中的 name, id
Type: 类型 -- 表中内容的类型,例如 name的类型为varchar(20)
NuLL: 是否允许为空
Key: 索引类型 -- primary key() 即主键 和 foreign key() 即外键
Default: 默认值 -- 表中内容的类型进行申明时可以选择加上默认值,当该内容不进行赋值时为默认值
Extra: 扩充
查看当前库下所有表
语法: show tables;
一定是在某个具体的库下查看某个库中所有表的数量
删除库中不需要的表
语法: drop table 表名
由于当前我们java1117这个库下只有student一张表,因此删除完后在去查看Java11117库下所有表则为空!
1.新增一条记录-单行全列添加(所添加列必须与建表时一致)
语法: insert into 表名 values (), (), … () ;
建表后,可以一次添加多组数据,由于时全列添加所添加的记录必须要同建表时字段一致,同时在表结构处的Null哪儿显示YES 即可此列添加null值
2.新增一条记录-多行指定列数(所添加的列必须与指定的列一致)
语法: insert into student(指定field) values(field);
此处,name字段即为指定字段,在添加数据时,只需要添加name字段内容即可
对于上面我们新增一条记录后,虽然显示添加成功了,那我们去哪里查看呢? 在MySQL中同样有着对应的查找功能!
语法: select * from 表名;
其中 select * from 里这个 * 为通配符的意思.
对于全列查询需要慎用,在没有查找限制条件且数据量巨大的情况下,全列查询容易让硬盘IO吃满,从而让后面的人进行访问服务器时无法访问!
指定需要查那一列,有一个筛选的过程!
语法: select 列字段,列字段… from 表名;
上述操作中
1)先创建了一张班级表,包含年级,班级,该班学生总数
2)添加了三组数据
3)进行指定列查询, 其中 grade, id 为我们指定需要查询的列,结果为红色圈中所示,查询指定列则会筛选处符合条件的记录,并且以指定的字段为列名
语法: select … 表达式 from 表名
这是一个表达式包含一个字段(也可为多个字段)并且指定列查询
在上述表达式包含字段的查询中,最后的结果以该整体字段为该列列名,显得有点突兀,因此我们可以通过起别名的形式来将这个表达式包含字段取一个新的名字来命名该列
语法:select … 表达式 as 别名 from 表名;
通过执行该sql语句后可以看到,total+10该结果集中后新的列名为total_people, total + 10 为表达式
5.去重
去重操作,对某一列中的数据进行去重(去除该列中相同的其余几行)
语法: select distinct 列名 from 表名;
上述的班级表中,存在grade和id相同的班,对其按照grade去重,最终筛选处去重后grade的一列(保留需要去重的唯一 一列)
除了单列去重,也可以多列去重,例如:
需要注意的是:
1)进行多列去重时,需要某行中的两列同时相同才可以去重
在进行条件查询之前,需要来认识一下MySQL中一些基本条件
运算符 | 解释说明 |
---|---|
>, >=, <, <= | 大于, 大于等于, 小于, 小于等于 |
= | 等于,在判断NULL = NULL 时是不安全的, 返回的是 NULL 为false |
<=> | 等于,用于安全判断NULL, 当 NULL <=> NULL时,结果为true |
!=, <> | 不等于 |
between A and B | 在范围[A,B] 之间, 为左右闭区间,在该范围内返回true |
IN(A,B,C…) | 属于括号中A,B,C… .其中一个则返回true |
IS | 是…, 如果为真返回true |
IS NOT | 不是…, 如果为真 返回ture |
LIKE | 模糊匹配, 像… , 常同通配符%共同使用 |
AND | 并且之意, 多个条件同时满足时返回true |
OR | 或者之意, 满足其中一个条件则返回true |
NOT | 取反之意,条件为真时, 取反返回false |
在进行筛选记录时,加入一定的条件进行限制筛选出所需要的记录
语法: select * from 表名 where 条件;
上述操作为查询班级表中,班级总人数小于60得记录
语法: select filed(指定字段), filed from 表名 where 条件;
上述操作为查询班级表中 grade 和 id 符合总人数小于 60 得所有记录
创建一张表如下:
先来观察 AND 和 OR 同时存在时得两组示例
1).
从第一组示例不难看出,当AND 和 OR 同时存在时, 先执行了 math > 70 and English > 70 在执行 or Chinese > 80 得到如上记录
2).
从第二组示例中可以看到,在AND 和 OR 同时存在时, 为了避免 AND 和 OR 优先级带来得问题导致条件并非我们想要的, 通常采取括号得形式让其单独处理
1).查看当前MySQL所使用得字符集
语法: show variables like ‘%character%’;
MySQL中, 画圈部分默认为Latin字符集,此处由于我更改了配置文件, 因此为utf8
2). 全模糊查询
语法: select …from 表名 where 列名(字段) like ‘%…’;
上述模糊查询意为 查询成绩表中所有名字以老开头得所有记录, % 为通配符,可以匹配一个或多个字符
2). 指定某个位置模糊
语法: select … from 表名 where 列名(字段) like ‘_x’ ;
上述指定位置模糊查询意为 查询成绩表中所有名字中以老开头得两个字得记录
综上所述, 模糊得位置可以用 ’ _ ’ (下划线) 来指定, 也可以用 ’ % ’ 通配符来代表多个字符
当数据过多时, 有时候只需要一页只需要展示固定条记录, 此时我们便可以采取分页查询, 来规定一次几条记录
语法: select…from 表名 limit N offset M;
第二页
第三页
通过上述操作, 我们就可以将一组记录分成X页
其中 N 代表了 一页有多少条记录, M 代表了 从第几页开始
语法: select … from 表名 order by 字段(所需排序得) …
例如:将成绩表中 语数英得总分取别名为 total 并将所有人按照总分升序排序
若需要降序,则需在order by 字段后面加上 desc 即可
上述排序中可以发现,无论时在升序(降序)时, NULL总时在第一(倒数第一), 由此可以看出 NULL 是一个非常特别得值, 升序是它是最大值(可以近似理解为无穷大), 降序是它是最小值, 升值比负数还小(可以近似理解为无穷小), 当存在多组值为NULL 进行排序时, 顺序为插入数据时得顺序!
语法: select … from 表名 order by filed1 desc, filed 2 , filed3 desc…;
排序优先级按照sql语句顺序执行
例如:将成绩表中查询同学的成绩并依次按照数学降序, 英语降序;
先进行数学排序时, 得到如上结果,下面在数学降序得基础上在进行英语降序
可以看出, 先进行数学降序后, 王五和张三得数学成绩相同, 只有在数学成绩相同时, 此时在进行英语降序排序, 王五和张三得排序收到英语成绩影响, 重新排序得到如上结果
综上所述, 当多字段排序时, 按照sql语句书写顺序执行, 只有当前一个排序结果相同时, 下一个排序字段才会按照此重新排序
语法: update 表名 set 字段(所需的修改) where/order by…
update 得使用非常灵活, 可以搭配where / order by / limit / 基本条件 同时使用, 因此在上述语法中, 可以按照要求进行自行组合
下面举例一些常见常用得:
1). 将成绩表中张三同学得数学成绩更改为 98.5
2).将成绩表中张三同学得 语文成绩改为80, 英语成绩改为90
3).将总分倒数前三得同学数学成绩扣10分
先将总分倒数前三得同学得成绩筛选出来
在将总分倒数前三得同学数学成绩减10分
对于MySQL得修改功能, 在使用时一定需要谨慎, 防止条件错误带来得错误修改导致后续数据错误
删除表中不需要的数据
语法: delete from 表名 where / order by / limit …
delete 得使用同update修改功能一样, 使用非常灵活, 同样可以根据自己的需求给定不同得条件进行限制删除表中某些数据
例如: 删除成绩表中总分最小得那个同学
未删除前:
删除后:
对于删除功能, 更是需要谨慎, 并且delete同drop不同, delete 删除得时表中某个数据, 当表中数据均 delete为空时, 表依然还存在, 此时为空表!