大一下数据库学习小记
问题1:安装Wampsever后mysql打不开
Wampserver安装完成后无法启动MySQL这有可能是你之前安装过MysqL,因为wampserver内置MySQL。解决的方法就是配置环境变量。
解决:
首先新建变量MYSQL_HOME,变量值为D:\wamp\bin\mysql\mysql5.6.17(也就是mysql的解压路径),接下来找到 Path 这个变量,编辑,在后面添加 %MYSQL_HOME%/bin;(注意:环境变量之间是用分号隔开的)到这里环境变量配置完毕。
问题2:同列属性值大小写区分问题
当三个记录b_author属性值分别设置为 ab,AB,Ab,使用
delet from book where b_author='AB'
表中的三个记录都被删了。
原因:
mysql查询是不区分大小写的!这可真的是惊呆我了,虽然知道一般情况下,关键字是不区分大小写的,但是没想到连要查询的参数都是不区分大小写的!!再尝试下面的sql语句,果然还是一样的结果。
Mysql默认的字符检索策略:utf8_general_ci,表示不区分大小写;utf8_general_cs表示区分大小写,utf8_bin表示二进制比较,同样也区分大小写 。(注意:在Mysql5.6.10版本中,不支持utf8_genral_cs!!!!)
创建表时,直接设置表的collate属性为utf8_general_cs或者utf8_bin;如果已经创建表,则直接修改字段的Collation属性为utf8_general_cs或者utf8_bin。
问题3:update更新数据的时候where后条件不用主键不能更新
一般的习惯用主键,但用了一个属性b_price确不行,语句成功但没修改,
update book set b_author='XIAO' where b_price=88.88;
Query OK, 0 rows affected (0.00 sec)
原因:尚不明确
问题4:查找浮点数据类型最大值使用max()函数
输入为200.06,查出来为
select max(b_price) from book;
+--------------------+
| max(b_price) |
+--------------------+
| 200.05999755859375 |
+--------------------+
问题5:设置主键auto_increament之后deleat记录,新纪录在原基础上增加
新插入的元组在原来删除的元组之上增加如删除id=2 的元组,之后就不会再出现2,而是从3开始
问题6:(mysql)使用group by 的属性是否限制select必须包含此属性
方式1.
select * from book where 1=1 group by b_price;
+----+-------------------------+----------+---------+
| id | b_name | b_author | b_price |
+----+-------------------------+----------+---------+
| 1 | Java从入门到放弃 | xiao | 66.66 |
| 2 | mysql从删库到跑路 | XIAO | 88.88 |
| 5 | c++ | si | 100 |
| 6 | Python | xiaosi | 200.06 |
+----+-------------------------+----------+---------+
4 rows in set (0.00 sec)
方式2.
mysql> select * from book group by b_price;
+----+-------------------------+----------+---------+
| id | b_name | b_author | b_price |
+----+-------------------------+----------+---------+
| 1 | Java从入门到放弃 | xiao | 66.66 |
| 2 | mysql从删库到跑路 | XIAO | 88.88 |
| 5 | c++ | si | 100 |
| 6 | Python | xiaosi | 200.06 |
+----+-------------------------+----------+---------+
4 rows in set (0.00 sec)
方式3.
mysql> select b_name from book group by b_price;
+-------------------------+
| b_name |
+-------------------------+
| Java从入门到放弃 |
| mysql从删库到跑路 |
| c++ |
| Python |
+-------------------------+
方式4.
select b_name,sum(b_price) from book where b_price<250 group by b_name having sum(b_price)>300;
+--------+-------------------+
| b_name | sum(b_price) |
+--------+-------------------+
| Python | 402.1199951171875 |
+--------+-------------------+
答案:在mysql5.7 并不需要,学习的T-SQL要求这样,具体数据库要具体验证
问题7:有关具有约束的条件下修改列
在T-SQL中,修改列要先把约束删除,MySQL中不需要,可直接删除、修改列。
但MySQL外键约束影响删除表,想要删除被参照表(主表)需要先删除参照表(次表)的外键约束Foreign key,方法:
alter table 表名 drop foreign key 约束名;
(从show create tbale 表名;查看约束名)
问题8:添加外键约束的字段数据类型属性必须相同添加多个主键必须用表级添加primary key()
问题9:小写字母表示字段,lower(字段)
问题10:使用换码字符将通配符转义为普通字符:不能用等号,只能用 like,后面也不用加escape \;而且可以转‘_';
问题11:MySQL 的“utf8mb4”是真正的“UTF-8”。MySQL 的“utf8”是一种“专属的编码”,它能够编码的 Unicode 字符并不多。
注意 ,utf8mb4与utf8的一个区别是前者可以存储墨迹表情。
问题12:between and 是包含两个边界的。
问题13:Mysql中不支持select into 复制表的语法,支持insert into 表 select 表
INSERT INTO table2
SELECT * FROM table1;
问题13:插入多组数据是,values前括号里的字段可以省略。
问题14:视图后with check opention语句
视图后面加with check option:WITH CHECK OPTION 的意思是,修改视图时,检查插入的数据是否符合 WHERE 设置的条件。保证更新、插入或删除的行满足视图定义中的谓词条件(即where后的条件)
注意:
Mysql中不支持check约束,(不报错但没用)某些问题需要使用枚举、触发器来实现。(见前面博客有介绍)
问题15:外键的添加
创建表的时候添加外键:在后面 (constraint 外键名)foreign key(字段名) references 表名(字段名).
在建好的表中添加外键:alter table 表名 add (constraint 外键名)foreign key(字段名) references 表名(字段名).
问题16:数据完整性约束实例
Mysql定义性别只能取“男”或“女”
不能用--alter table student add constraint ssex_Between_F_W check(ssex in('男','女'));
注意,mysql使用check不报错,但是没效果,要使用(枚举):
alter table student modify ssex enum('男','女') default '男';
或者使用触发器:
DELIMITER $$
CREATE TRIGGER sex__check BEFORE INSERT ON tb_student FOR EACH ROW
BEGIN
DECLARE ssex CHAR(5);
SET ssex=new.stusex;
IF(ssex='男' OR ssex='女')THEN
SET@choice=1;
ELSE
SET@choice=0;
INSERT INTO tb_student VALUES(1);
END IF;
END;
$$
Mysql规定年龄在10-40之间
同理不能用:
alter table student add constraint Sage_10_40 check(sage>10 and sage<40);
问题17:外键约束下更新、删除设置
. cascade方式
在父表上update/delete记录时,同步update/delete掉子表的匹配记录
. set null方式
在父表上update/delete记录时,将子表上匹配记录的列设为null
要注意子表的外键列不能为not null
. No action方式
如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作
. Restrict方式
同no action, 都是立即检查外键约束
. Set default方式
父表有变更时,子表将外键列设置成一个默认的值 但Innodb不能识别
alter table student add foreign key(spec) references speciality(specno) on delete set null on update cascade;
问题18:关于不同版本数据库修改密码语法不同
5.6: ...password = password('...')...
5.7 : ....authentication_string = password('...')...
8.0: alter user 'root'@'localhost' identified with mysql_native_password by '123456';