mysql是一个客户端-服务器结构的程序.
mysql的服务器,是真正的本体,负责保存和管理数据.数据都是存储在硬盘上的.
内存:速度快,空间小,成本高,数据易失
硬盘:速度慢,空间大,成本低,数据持久保存
数据库的命令行客户端操作
进入命令行客户端输入密码
如果输入密码正确会如上图
数据库
"数据库"指的是一个逻辑上的数据集合.
一个mysql 服务器程序,可以在硬盘上组织保存很多数据
其是通过表来组织的
一个mysql服务器上,有很多存储不同信息的表
将有关联关系的一些表放到一起,就构成了一个数据集合,此时就称为"数据库",而且一个mysql服务器上可以有多个这样的数据库的
操作数据库
1.创建数据库
create database 数据库名;
数据库创建的时候,要求不能重复.
如果重复会出现
此时就可以在创建的时候,加上一个修饰,来应对上述问题.
create database if not exists 数据库名;
这样就没有报错,也没有创建出一个java数据库.
为了是避免 sql报错
实际工作中,很多时候,是把一系列sql 写到一个文件中,批量执行的.而很少会这样一条一条的执行~~
在批量执行的情况下,如果一条sql报错了,后面的sql就无法继续执行了.
创建数据库的时候,可以手动指定一下字符集的character set字符集名字/ charset 字符集名字
因为需要在数据库中保存中文, mysql默认的字符集是拉丁文.不支持中文.必须要在创建数据库的时候,手动指定编码方式为支持中文的编码.(GBK, UTF8)才能进行保存中文。
注:
字符集(Character Set)是一组字符的集合,它定义了字符与数字之间的映射关系。
通常用于编码和解码文本数据,使计算机能够理解和处理文本信息。通俗一些字符集就是一张字符表,它把各种文字、符号、数字等转换成计算机可以理解的数字编码,这样计算机就能够处理文本信息了。就好像字母表一样,每个字母都对应着一个特定的数字编码,这样计算机就能够识别并处理文本中的各种符号和文字了。常见的字符集有ASClII、Unicode等。字符集的选择对于文本处理和数据交换非常重要,不同的字符集可能包含不同的字符,编码方案也不同。导致不同的字符集,不同的编码方式下,一个汉字占几个字节,是不同的。
gbk现在已经用的越来越少了.主要是使用utf8作为编码方式.变长编码.
utf8不仅可以表示中文.
也可以表示世界上的任何一种语言文字
如果使用utf8编码,一个汉字通常是3个字节,jbk编码一般通常是2个字节,少数生僻汉字使用4个字节。
2.查看数据库
show databases;
列出当前的mysql服务器上一共都有哪些数据库
3.选中数据库
use 数据库名称;
数据库中最关键的操作,就是针对表进行增删改查.表是从属于数据库的.
要针对表操作,就需要先指定清楚针对哪个数据库来进行操作
4.删除数据库
drop database 数据库名;
删除操作,删掉的不仅仅是database,而且也删除了database 中所有的表,和表里所有的数据!
删除数据库操作,是一个非常危险的操作。
操作数据库中的表
1.创建表
create table表名(列名 类型,列名 类型);
创建表之前先选中数据库如上面的选中数据库。
注:
是create不是creat。
2.查看所有表
show table;
数据库中的内容,都是持久化存储的.后续重启电脑啥的,数据都是仍然存在的
3.查看表结构
desc 表名;
field:字段列
int是四个字节,
这里的(11)表示的是显示的宽度.
显示这个int类型的时候,最多是占据11个字符的宽度
(和存储时候的容量是无关的)
Null空值.
表格中的这个格子是没填.
4.删除表
drop table 表名;
删除表之后进行查询表发现其确实被删除了
查询,添加,更改,删除表中的数据
1.添加数据
insert into 表名 values(值,值);
值与类型必需匹配。
如果插入的值是中文呢?
这就是没有指定字符集的utf8.
也可以进行一次的插入多条数据
将一个表中的数据全部赋值过去
2.查询表中全部的数据
select * from 表名;
查询这个表中的所有数据。
3.查询表中指定列的查询
按需进行查询
select 列名,列名 from 表名;
4.查询表中数据时带上数据计算
—边查询,一边进行计算
可以看出这里的操作不会修改数据库服务器上的原始数据只是在最终响应里的"临时结果"中做了计算
5.表别名的创建
查询的时候给列/表达式指定别名.(给表也能指定别名)
select 表达式 as 别名 from 表名;
as可以省略,但是不要省略这样可读性。
查询结果的临时表中,列名就是刚才的别名了.
6.去重
distinct 修饰某个列/多个列值相同的行,只会保留一个行
7.查询时进行排序
将行进行排序
首先确定好排序的规则
a)针对哪个列作为比较规则
b)排序的时候是升序还是降序
select (列名 )from 表名 order by 列名 asc/desc;
asc升序加果省略,就是升序排序.desc降序
order by 后面的列就是以这个列的数据为准进行排序比较
如果一个sql不加order by 此时查询的结果数据的顺序,是"不确定的"/"无序”的.
order by指定的列,如果你select查询的时候没有把这一列显示出来,也不影响排序。
order by还可以针对表达式进行排序
旨定多个列来排序. order by后面可以写多个列使用,先按照第一个来进行排序,如果第一个列的值相等,在根据第二个列的值进行排序。
8.条件查询:WHERE
会指定具体的条件,按照条件针对数据进行筛选.
select 列名 from 表名 where 条件;
遍历这个表的每一行记录,把每一行的数据分别带入到条件中如果条件成立,这个记录就会被放入结果集合中.如果条件不成立,这个记录就pass
如果查询的值没有就什么都不返回
9.模糊查询
使用通配符(就是一些特殊的字符),表示一些特定的含义来进行查询。
%:代指任意个任意字符.
_:代指一一个任意字符.
李%∶查询以李开头的内容
%李:查询以李结尾的内容
%李%:查询包含李的.
10.分页查询:LIMIT
select * from 表名 limit x offset y;
x表示这次查询查询出几个结果
y表示这次是从几开始查询的
使用select *这种方式查询,是比较危险的.需要保证一次查询,不要查出来的东西太多.
limit可以限制这次查询最多能查出来多少个结果.
有的时候,数据非常多,一次全都显示出来,会影响到效率,也会不方便用户去看
如下图
.
分页查询之后的结果
11.修改表中的数据
update 表名 set 列名 = 值 where 条件;
这只修改了一列
也可以同时修改多个列
不支持math+=30这个写法,必须写成math = math + 30;
update后面不写任何条件,就是针对所有行都进行修改,非常危险!!!!!。
show warnings:可以查看警告的具体内容
12.删除表
delete from表名where条件/ order by / limit;
和drop table 还不太一样.
drop table是删除了表,也删除了表里的记录.
如果不指定任何条件,就是删除整个表。
delete是只删除了表里的记录,表还在(空表)
数据表中的约束
数据库自动的对数据的合法性进行校验检查的一系列机制目的就是为了保证数据库中能够避免被插入/修改一些非法的数据
MySQL中提供了以下约束.
1. NOT NULL
指示某列不能存储NULL值
create table 表名(列名 列类型 not null);
2.UNIQUE
表中不能有重复的行
create table 表名(列名,列类型 unique);
3.DEFAULT
create table 表名(列名,列类型 default 默认值);
当没有给某个列赋值时,会将设置的默认值赋值给列
可以这样给有默认值的表中插入数据。
注
一个表的一个列可以实现多个约束
4.PRIMARY KEY
create table 表名(列名 列类型 primary key);
一张表中只能有一个primary key,
一个表中,只能有一个作为身份标识的数据.
相当于我们可以通过身份证号来作为我们身份的区别。
虽然只能有一个主键,但是主键不一定只是一个列,也可以用多个列共同构成一个主键.(联合主键)
注:
mysql会把带有unique和primary key的列自动生成索引,从而加快查询速度.
如何保证主键唯一呢?
mysql提供了一种"自增主键"这样机制
create table 表名(列名,列类型 auto_increment);
因为主键经常会使用int / bigint
程序猿插入数据的时候,不必手动指定主键值,由数据库服务器自己给你分配一个主键会从1开始,依次递增的分配主键的值.
从刚才最大的数值开始,继续往后分配的
相当于使用了一个变量,来保存了当前表的id的最大值.后续分配自增主键都是根据这个最大值来分配的.
如果手动指定id,也会更新最大值.
如果我们没有挨个进行自增,中间剩余一些空余,我们可以手动插入
5.FOREIGN KEY
外键:描述了两个表的关联关系,指定外键约束的时候,要求父表中被关联的这一列,必须是主键或者unique
create table 表名(列名 列类型,foreign key (字段名) references 主表(列));
比如class表中有class_id,class_name两个列,
student表中有student_id,student_name,studentClass_id三个列
如果将这个两个表进行外键约束,用class表约束student表,
class表中的数据,可以约束了student表中的数据studentClass_id只能是class表中的class_id这个范围.把class表,称为“父表,也就是约束别人的表
把student表,称为"子表,就是被别人约束的表,被约束了班级的id只能在一个范围内
class表中的数据
执行这个插入操作,就会触发针对class表的查询.就会查4是否是在class中存在
针对父表进行修改/删除操作,如果当前被修改/删除的值,已经被子表引用了,这样的操作也会失败
因为外键约束始终要保持,子表中的数据在对应的父表的列中,要存在,此时万一把父表的这条数据删除了,也就打破了刚才的约束了
外键准确来说,是两个表的列产生关联关系,其他的列是不受影响的(可以修改)
如果想删除表,就得先删除记录
此处的直接删除父表,是不可以的.
父表没了,子表后续添加新元素,就没的参考了
所以只能先删除子表,在删除父表