首页 未分类

1 Mysql数据库

1.1 数据类型[1]

mysql1.png

1.1.1 整数

mysql2.png

1.1.2 浮点数&定点数

mysql3.png
注:定点数以字符串形式存储,对精度要求高时使用decimal较好;尽量避免对浮点数进行减法和比较运算

1.1.3 时间/日期类型

mysql4.png

1.1.4 字符串类型

mysql6.png

1.2 创建数据库

#创建名为hsm的数据库
create database hsm

1.3 创建数据表

分别创建Student,Course,SC三张表
table.jpeg

如图所示:

#创建Student表
create table Student(
Sno varchar(10) primary key,
Sname varchar(10),
Ssex varchar(5),
Sage int(3),
Sdept varchar(15)
);
#创建Course表
create table Course(
Cno varchar(10) primary key,
Cname varchar(15),
Cpqo varchar(15),
Ccredit int(3)
);
#创建SC表
create table SC(
Sno varchar(10),
Cno varchar(10),
Grade int(3),
foreign key(Sno) references Student(Sno),
foreign key(Cno) references Course(Cno)
);

1.4 查看数据库中的表

使用show tables查看当前数据库中的表

show tables

1.5 插入数据到表中

插入数据可以是

#添加数据到Student表中
insert into Student values ("95001","李勇","男",20,"CS"),("95002","刘晨","女",19,"IS"),("95003","王敏","女",18,"MA"),("95004","张立","男",19,"IS");
#添加数据到Course表中
insert into Course values
("1","数据库","5",4),
("2","数学","",2),
("3","信息系统","1",4),
("4","操作系统","6",3),
("5","数据结构","7",4),
("6","数据处理","",2),
("7","Pascal语言","6",4);
#添加数据到SC表中
insert into SC values
("95001","1",92),
("95001","2",85),
("95001","3",88),
("95002","2",90),
("95002","3",80);

此时三个表都创建完成

sql完整性约束

完整性约束有三种:

  • 1.实体完整性
  • 2.参照完整性
  • 3.用户定义完整性。

实体完整性

实体完整性即主码,用primary key定义。
可用两种方式:
列级约束:create table test (id int primary key);  只能选取一列作为主码;
表级约束:create table test (id int,name char(10),primary key(id,name));  可选多列作为主码;
sql

参照完整性

参照完整性即外码,用foreign key(<列名>[,<列名>...]) references <表名>(<列名>[,<列名>..]);而且只能使用表级约束。
现在以上面那个截图中的表为参照,建立另一个表
sql
注意:外码一定参照主码(可以是其他表的主码,也可以时自己的),而且外码的列数一定要等于被参照表的主码列数。

 参照完整性中比较麻烦的是违约处理,即当对被参照表进行update/delete/insert操作会破坏参照完整性时,参照表赢告诉被参照表应该怎么做。

 所以参照表可以在定义外码时添加上on delete/update [<no action> / <cascade>]。

 看例子比较直观:
sql
其中no action 表示拒绝执行(为默认值),cascade表示级联操作。

用户定义完整性

书中的用户定义完整性有三种:列值非空(not null),列值唯一(unique),列值需满足条件表达式(check);
not null都是列级完整性约束,很好理解。
check和unique可以是列级,也可以是表级约束。
看例子很方便理解:sql
除了这三种,现在的sql产品中很多都支持一个设置默认值的操作(default);

sql
如果不设置,默认为NULL(not null,primary key除外)。

完整性约束命名子句

完整性约束命名子句是用来给完整性约束命名,这样我们就可以通过该名称对完整性约束进行删除、增加操作。
通过对mysql和sqlite的测试发现两款产品对命名子句的支持很奇怪,所以这部分只供参考。
格式为:
constraint <完整性约束名> <完整性约束>
注意:通过测试发现mysql中只支持表级完整性约束命名子句,而sqlite都支持,但sqlite中对基本表的修改操作很有限(可见前面的帖子数据定义之基本表定义),所以基本没什么用。
看例子很容易理解:
sql
sql
测试过程中发现,mysql中这样定义没有报错,但constraint C1 check(id<100)并没有起作用(消失了..),而且primary key也没有被命名为Pkey。

数据库角色

将一个角色授权给其他角色或用户
grant <角色1>[<角色2>]...

1.6 修改root用户的密码

1.6.1 mysql 5.6

#mysql5.6
mysql> set password for 用户名@localhost = password('新密码');

1.6.2 mysql 8.0

#mysql8.0
ALTER USER "root"@"localhost" IDENTIFIED  BY "你的新密码";

注意:重点啊,如果你没有设置认证方式,默认的密码加密方式是:caching_sha2_password,而现在很多客户端工具还不支持这种加密认证方式,连接测试的时候就会报错:client does not support authentication protocol requested by server; consider upgrading MySQL client,这里的错误信息就是不支持身份认证方式,没关系,去my.ini里面在[mysqld]下面加上这句话即可:

default_authentication_plugin=mysql_native_password

1.7 打开远程访问

1.7.1 mysql 8.0

对于允许远程访问,有两种角色,一种是我们的root用户,还有一种是非root用户,从安全的角度(我也不知道什么角度,听别人说的,暂且相信着吧),远程访问最后不要用root用户

#用root用户访问:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '密码' WITH GRANT OPTION;

非root用户,这里就要先去创建一个用户

#切换数据库
mysql>use mysql;

#创建用户(user1:用户名;%:任意ip,也可以指定,root默认就是localhost;123456:登录密码)
mysql>CREATE USER 'user1'@'%' IDENTIFIED BY '123456';



#授权,默认创建的用户权限是usage,就是无权限,只能登录而已,(all:所有权限,这里有select,update等等权限,可以去搜一下;后面的*.*:指定数据库.指定表,这里是所有;to后面就是你刚才创建的用户)

mysql>grant all on *.* to 'user1'@'%';

#注意:用以上命令授权的用户不能给其它用户授权,如果想让该用户可以授权,用以下命令: 
GRANT all ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION; 

参考文献

MySql 数据类型
sql完整性约束




文章评论