1 Mysql数据库
1.1 数据类型[1]
1.1.1 整数
1.1.2 浮点数&定点数
注:定点数以字符串形式存储,对精度要求高时使用decimal较好;尽量避免对浮点数进行减法和比较运算
1.1.3 时间/日期类型
1.1.4 字符串类型
1.2 创建数据库
#创建名为hsm的数据库
create database hsm
1.3 创建数据表
如图所示:
#创建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)); 可选多列作为主码;
参照完整性
参照完整性即外码,用foreign key(<列名>[,<列名>...]) references <表名>(<列名>[,<列名>..]);而且只能使用表级约束。
现在以上面那个截图中的表为参照,建立另一个表
注意:外码一定参照主码(可以是其他表的主码,也可以时自己的),而且外码的列数一定要等于被参照表的主码列数。
参照完整性中比较麻烦的是违约处理,即当对被参照表进行update/delete/insert操作会破坏参照完整性时,参照表赢告诉被参照表应该怎么做。
所以参照表可以在定义外码时添加上on delete/update [<no action> / <cascade>]。
看例子比较直观:
其中no action 表示拒绝执行(为默认值),cascade表示级联操作。
用户定义完整性
书中的用户定义完整性有三种:列值非空(not null),列值唯一(unique),列值需满足条件表达式(check);
not null都是列级完整性约束,很好理解。
check和unique可以是列级,也可以是表级约束。
看例子很方便理解:
除了这三种,现在的sql产品中很多都支持一个设置默认值的操作(default);
如果不设置,默认为NULL(not null,primary key除外)。
完整性约束命名子句
完整性约束命名子句是用来给完整性约束命名,这样我们就可以通过该名称对完整性约束进行删除、增加操作。
通过对mysql和sqlite的测试发现两款产品对命名子句的支持很奇怪,所以这部分只供参考。
格式为:
constraint <完整性约束名> <完整性约束>
注意:通过测试发现mysql中只支持表级完整性约束命名子句,而sqlite都支持,但sqlite中对基本表的修改操作很有限(可见前面的帖子数据定义之基本表定义),所以基本没什么用。
看例子很容易理解:
测试过程中发现,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;