查看表的主键
show fields from product;
关系型数据库
MYSQL就是关系型数据库。非关系型数据库就是key_value模型的数据库,通常会用到哈希表。
关系型数据库的缺点:
如果一个数据库有大量数据的写入处理,那么怎么设计比较好?
可以考虑把数据库分割开来,分别放在不同的数据库服务器上,比如将不同的表放在不同的数据库服务器上,数据库分割可以减少每台数据库服务器上的数据量。不同服务器上的表之间无法进行Join处理,数据库分割的时候就需要预先考虑这些问题。MYSQL如何备份和导入
exit退出mysql。然后mysqldump -h;就可以开始备份
mysqldump -u 用户名 -p 数据库名 > 导出的文件名
文件名随便定,要给路径,.\表示导出在桌面上
mysqldump -u root -p view > .\root.sql;(存在桌面上)
mysqldump -u root -p view > d:\git\tang.sql; (存在d盘的git文件夹中)
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
mysqldump -uroot -p --all-databases;
mysqldump -uroot -p --all-databases --all-tablespaces;
source 文件名; (文件名中的路径必须得是绝对路径)
数据库的表与表之间有几种关系
一对一、一对多、多对多
有两个表,在第一个表中的某一行只与第二个表中的一行相关,同时第二个表中的某一行,也只与第一个表中的一行相关,我们称这两个表为一对一关系。
有多张表,第一个表中的行可以与第二个表中的一到多个行相关联,但是第二个表中的一行只能与第一个表中的一行相关联。
有两个表,第一个表的一行可以与第二个表中的一到多个行相关联,同时,第二个表中的一行可以与第一个表中的一到多个行相关联。
设计数据库表所要遵循的三大范式
第一范式:强调列的原子性,字段不可分。
第二范式:非主键的字段必须完全依赖于主键,而不能只依赖于主键的一部分。
比如:比如有一个订单表,主键是(OrderID,ProductID)。显而易见折扣字段,数量字段完全依赖(取决)于主键,而单价字段,产品名字段只依赖于 ProductID。所以这个订单表不符合第二范式。不符合 2NF 的设计容易产生冗余数据,有些数据会多次重复。
可以把订单表拆分为表A(OrderID,ProductID,折扣,数量)和B(ProductID,单价,产品名)来消除原订单表中UnitPrice,ProductName多次重复的情况。这样两个表都满足第二范式。
第三范式:非主键的列必须直接依赖主键,不能传递依赖。比如不能存在:非主键列A依赖非主键列B,非主键列B依赖主键C。
事务的四大特性和四大隔离级别、脏读、幻读、锁
找出表中成绩最好的学生
select name from mathclass order by grade desc limit 1;
//从表中将grade降序,取第一个的名字,前三名就是limit 3
找出表中数学成绩最好的学生
select name from class where project='数学' order by grade desc limit 1;
找出每个科目成绩最好的学生
select * from class a where grade=(select max(grade) from class where project=a.project);
查询结果是:
找出每个学生三科中成绩最高的那一门和分数
select * from class a where grade=(select max(grade) from class where name=a.name);
找出表中三科平均成绩最好的学生
select name,avg(grade) from class group by name order by avg(grade) desc limit 1;
//先由name来分组,再由平均成绩的降序,输出第一个的名字和平均成绩。注意,group by 和order by同时使用时,group by 在前面,order by在后面。
有一个表1,里面包括用户名和所在城市,有一个表二,里面包括订单号和用户名。我们查询所有成都用户的订单号。
select customer,id from table2 where customer in (select customer from table1 where city=’成都’);
有empoyee雇员表、department部门表如下:
输出属于科技部的员工姓名:
Selete name from employee where d_id = (selete d_id from department where d_name=’科技部’);
输出科技部的员工个数:
select count(d_id) from employee where d_id = (selete d_id from department where d_name=’科技部’);
输出科技部的女生个数:
select count(d_id) from employee where sex = ‘女生’ and d_id = (selete d_id from department where d_name=’科技部’);
输出科技部的平均年龄、最大年龄:
select avg(age),max(age) from employee where d_id = (selete d_id from department where d_name=’科技部’);
一个表A有6个字段,另一个表B有8个字段,那么左外连接、右外连接、外连接、内连接、全外连接的字段范围或大小是?
左外连接中字段数是6~14
右外连接中字段数是8~14
外连接中字段数是6~14
内连接中字段数是0~6
全外连接是14
drop、deete、truncate的区别
drop和truncate都是dll,操作立即生效,不能回滚,操作不触发trigger。delete是dml,事务提交之后才会生效,如果有相应的trigger,执行的时候也会触发。
这三个分别在哪些场合使用
不再需要表时,用drop;
删除部分数据,用带where的delete;
保留表而删除所有数据时用truncate;
DML、DCL、DLL的区别
DML:数据操作语言。 INSTERT /UPDATE /DELETE /SELECT
DCL:数据控制语言。GRANT /REVOKE /COMMIT /ROLLBACK /LOCK
DLL:数据定义语言。CREATE TABLE /ALTER TABLE /DROP TABLE /CREATE INDEX /DROP INDEX
游标的作用是什么?如何知道游标已经到了最后
游标用于定位结果集的行。通过全局变量fetchstatus可以判断是否到了最后,通常此变量不等于0表示出错,或者已经到了最后。