当前位置: 代码迷 >> 综合 >> CURD 记一下
  详细解决方案

CURD 记一下

热度:80   发布时间:2024-02-28 15:38:18.0

 

// 1.
mysql -uroot -p***
u:user
p:password

mysql -uroot -p
input:password

exit

//2
uninstall
setup->remove
C://program files(x86)/mySql
C://programData/mySql


//3 import data
show databases;
show tables; 查看当前库中的表
show tables from <database name>; 查看其他库中的表
show create table dept;  查看表的创建语句
desc dept; 显示表结构

create database node; 创建数据库
drop database node;删除数据库
use node; 
source *.sql    执行sql 脚本

//7 
select database();
select version();

//8  结束一条语句 :\c

//9
count(*)和count(具体的某个字段),区别:
count(*):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)
count(comm): 表示统计comm字段中不为NULL的数据总数量。
分组函数自动忽略空值,不需要手动的加where条件排除空值

分组函数一般都会和group by联合使用,这也是为什么它被称为分组函数的原因
并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的。
当一条sql语句没有group by的话,整张表的数据会自成一组

group by 在where 执行后 才执行
记住一个规则:当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段

//10总结一个完整的DQL语句怎么写
select        5
from        1    
where        2
group by        3
having        4
order by        6


//11根据表的连接方式来划分,包括:
内连接:等值连接 非等值连接 自连接
外连接:左外连接(左连接)右外连接(右连接)
全连接:(很少用)

内连接:假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。
AB两张表没有主副之分,两张表是平等的。
外连接:假设A和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中
的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。
外连接的分类
左外连接(左连接):表示左边的这张表是主表。
右外连接(右连接):表示右边的这张表是主表。
左连接有右连接的写法,右连接也会有对应的左连接的写法

内连接之等值连接:最大特点是:条件是等量关系
内连接之非等值连接:最大的特点是:连接条件中的关系是非等量关系
自连接:最大的特点是:一张表看做两张表。自己连接自己

实际开发中外连接用的多
SQL99语法结构更清晰一些:表的连接条件和后来的where条件分离了。
SQL92:(太老,不用了)
    select e.ename,d.dname
    from emp e, dept d
    where e.deptno = d.deptno;

SQL99:(常用的)
    select e.ename,d.dname
    from emp e
    join  dept d  //(inner join, inner可以省略的,带着inner目的是可读性好一些)
    on e.deptno = d.deptno; 
            // e.sal between s.losal and s.hisal; 非等值

内连接:
select a.ename '员工', b.ename '领导'
from emp a
join emp b
on a.mgr = b.empno;

外连接:(左外连接/左连接)
select a.ename '员工', b.ename '领导'
from emp a
left join emp b  //left outer(可以省略) join
on a.mgr = b.empno;

外连接:(右外连接/右连接)
select a.ename '员工', b.ename '领导'
from emp b
right join emp a  //right  outer(可以省略) join
on a.mgr = b.empno;

//12 子查询
select语句当中嵌套select语句,被嵌套的select语句是子查询。
子查询可以出现在哪里
select  ..(select)
from   ..(select).
where ..(select).

select * from emp where sal > (select avg(sal) from emp);

select t.*,s.grade
from (select deptno,avg(sal) as avgsal from emp group by deptno) t
join salgrade s
on t.avgsal between s.losal and s.hisal;

select 
e.ename,(select d.dname from dept d where e.deptno = d.deptno) as dname 
from emp e;

//13 union (可以将查询结果集相加)
select ename,job from emp where job = 'MANAGER'
union
select ename,job from emp where job = 'SALESMAN';

两张不相干的表中的数据拼接在一起显示
select ename from emp
union
select dname from dept;

//14 limit 
limit (重点,以后分页查询全靠它了。)

limit是mysql特有的,其他数据库中没有,不通用。(Oracle中有一个相同的机制,叫做rownum)
limit取结果集中的部分数据,这时它的作用。
语法机制:
limit startIndex, length
startIndex表示起始位置,从0开始,0表示第一条数据。
length表示取几个
    
eg:取出工资前5名的员工(思路:降序取前5个)
select ename,sal from emp order by sal desc;
取前5个:
select ename,sal from emp order by sal desc limit 0, 5;
select ename,sal from emp order by sal desc limit 5;

limit是sql语句最后执行的一个环节:
select        5
from        1        
where        2    
group by        3
having        4
order by        6
limit        7
        ...;

// 15
表的复制
create table 表名 as select语句:
create table emp2 as select empno,ename from emp;

将查询结果插入到一张表中:
insert into dept1 select * from dept;

删除所有记录
delete from dept1;

删除大表中的数据
truncate table 表名; // 表被截断,不可回滚。永久丢失

drop table 表名
drop table if exists 表名; // oracle不支持这种写法。

//16约束
在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性。
非空约束(not null):约束的字段不能为NULL
唯一约束(unique):约束的字段不能重复,但可以为NULL。
主键约束(primary key):约束的字段既不能为NULL,也不能重复(简称PK)
外键约束(foreign key):外键可以为NULL,...(简称FK)
检查约束(check):注意Oracle数据库有check约束,但是mysql没有,目前mysql不支持该约束。

//16.1主键
表的设计三范式中有要求,第一范式就要求任何一张表都应该有主键。
主键的作用:主键值是这行记录在这张表当中的唯一标识
根据主键字段的字段数量来划分:
单一主键(推荐的,常用的)
复合主键(多个字段联合起来添加一个主键约束)(复合主键不建议使用,因为复合主键违背三范式。)
根据主键性质来划分:
自然主键:主键值最好就是一个和业务没有任何关系的自然数。(这种方式是推荐的)
业务主键:主键值和系统的业务挂钩,例如:拿着银行卡的卡号做主键,拿着身份证号码作为主键。(不推荐用)
 最好不要拿着和业务挂钩的字段作为主键。因为以后的业务一旦发生改变的时候,主键值可能也需要
随着发生变化,但有的时候没有办法变化,因为变化可能会导致主键值重复

drop table if exists t_user;
create table t_user(
        id int,  
        // or id int primary key,   列级约束
                    // id int primary key auto_increment, id字段自动维护一个自增的数字,从1开始,以1递增
        // Oracle当中也提供了一个自增机制,叫做:序列(sequence)对象
        username varchar(255),
        primary key(id)
        );
insert into t_user(id,username) values(1,'zs');

//16.2外键约束
顺序要求:
删除数据的时候,先删除子表,再删除父表。
删除表的时候,先删除子表,在删除父表。
添加数据的时候,先添加父表,在添加子表。
创建表的时候,先创建父表,再创建子表。
drop table if exists t_student;
drop table if exists t_class;
create table t_class(
        cno int,
        cname varchar(255),
        primary key(cno)
        );
create table t_student(
        sno int,
        sname varchar(255),
        classno int,
        primary key(sno),
        foreign key(classno) references t_class(cno)
        );
insert into t_class values(101,'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
insert into t_class values(102,'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy');
insert into t_student values(1,'zs1',101);


//17 存储引擎
存储引擎这个名字只有在mysql中存在。(Oracle中有对应的机制,但是不叫做存储引擎。Oracle中没有特殊的名字,
就是“表的存储方式”)
mysql支持很多存储引擎,每一个存储引擎都对应了一种不同的存储方式。
每一个存储引擎都有自己的优缺点,需要在合适的时机选择合适的存储引擎

查看当前mysql支持的存储引擎:show engines \G

完整的建表语句
CREATE TABLE `t_x` (
 `id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
注意:在MySQL当中,凡是标识符是可以使用飘号括起来的。最好别用,不通用。
建表的时候可以指定存储引擎,也可以指定字符集。
mysql默认使用的存储引擎是InnoDB方式。
默认采用的字符集是UTF8

常见的存储引擎:
Engine: MyISAM
 Support: YES
 Comment: MyISAM storage engine
Transactions: NO
 XA: NO
 Savepoints: NO

MyISAM这种存储引擎不支持事务。
MyISAM是mysql最常用的存储引擎,但是这种引擎不是默认的。
MyISAM采用三个文件组织一张表:
xxx.frm(存储格式的文件)
xxx.MYD(存储表中数据的文件)
xxx.MYI(存储表中索引的文件)
优点:可被压缩,节省存储空间。并且可以转换为只读表,提高检索效率。
缺点:不支持事务

InnoDB:
支持事务、行级锁、外键等。这种存储引擎数据的安全得到保障
表的结构存储在xxx.frm文件中
数据存储在tablespace这样的表空间中(逻辑概念),无法被压缩,无法转换成只读。
这种InnoDB存储引擎在MySQL数据库崩溃之后提供自动恢复机制。
InnoDB支持级联删除和级联更新

Engine: MEMORY
缺点:不支持事务。数据容易丢失。因为所有数据和索引都是存储在内存当中的。
优点:查询速度最快。
以前叫做HEPA引擎

//18事务包括四大特性:ACID
A: 原子性:事务是最小的工作单元,不可再分。
C: 一致性:事务必须保证多条DML语句同时成功或者同时失败。
I:隔离性:事务A与事务B之间具有隔离。
D:持久性:持久性说的是最终数据必须持久化到硬盘文件中,事务才算成功的结束。

关于事务之间的隔离性
事务隔离性存在隔离级别,理论上隔离级别包括4个:
第一级别:读未提交(read uncommitted)
 对方事务还没有提交,我们当前事务可以读取到对方未提交的数据。
 读未提交存在脏读(Dirty Read)现象:表示读到了脏的数据。

第二级别:读已提交(read committed)
 对方事务提交之后的数据我方可以读取到。
 这种隔离级别解决了: 脏读现象没有了。
 读已提交存在的问题是:不可重复读。

第三级别:可重复读(repeatable read)
 这种隔离级别解决了:不可重复读问题。
 这种隔离级别存在的问题是:读取到的数据是幻象。

第四级别:序列化读/串行化读(serializable) 
  解决了所有问题。效率低。需要事务排队。
            
oracle数据库默认的隔离级别是:读已提交。
mysql数据库默认的隔离级别是:可重复读。

//18.1使用start transaction;关闭自动提交机制
mysql> start transaction;
mysql> rollback;
...
mysql> commit;

mysql> savepint (name)
mysql> rollback(name)

//18.2演示两个事务,假如隔离级别
演示第1级别:读未提交
set global transaction isolation level read uncommitted;
演示第2级别:读已提交
set global transaction isolation level read committed;
演示第3级别:可重复读
set global transaction isolation level repeatable read;

//19
什么时候考虑给字段添加索引?(满足什么条件)
* 数据量庞大。(根据客户的需求,根据线上的环境)
* 该字段很少的DML操作。(因为字段进行修改操作,索引也需要维护)
* 该字段经常出现在where子句中。(经常根据哪个字段查询)

//19.1 索引
创建索引对象:create index 索引名称 on 表名(字段名);
删除索引对象:drop index 索引名称 on 表名;
索引底层采用的数据结构是:B + Tree

注意:
主键和具有unique约束的字段自动会添加索引。
根据主键查询效率较高。尽量根据主键检索。

查看sql语句的执行计划:
mysql> explain select ename,sal from emp where sal = 5000;
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | emp   | ALL  | NULL          | NULL | NULL    | NULL |   14 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+

给薪资sal字段添加索引:
create index emp_sal_index on emp(sal);        
mysql> explain select ename,sal from emp where sal = 5000;
+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key           | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+
|  1 | SIMPLE      | emp   | ref  | emp_sal_index | emp_sal_index | 9       | const |    1 | Using where |
+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------------+

//19.2索引的分类
单一索引:给单个字段添加索引
复合索引: 给多个字段联合起来添加1个索引
主键索引:主键上会自动添加索引
唯一索引:有unique约束的字段上会自动添加索引

//19.3索引什么时候失效
select ename from emp where ename like '%A%';
模糊查询的时候,第一个通配符使用的是%,这个时候索引是失效的

//20 视图 很少用
站在不同的角度去看到数据(同一张表的数据,通过不同的角度去看待)

//20.1创建视图
create view myview as select empno,ename from emp;
drop view myview;
注意:只有DQL语句才能以视图对象的方式创建出来。

//20.2
对视图进行增删改查,会影响到原表数据。(通过视图影响原表数据的,不是直接操作的原表)
可以对视图进行CRUD操作
面向视图操作: select * from myview;

//20.3
视图的作用:
视图可以隐藏表的实现细节。
保密级别较高的系统,数据库只对外提供相关的视图,java程序员只对视图对象进行CRUD。


//21 DBA命令
将数据库当中的数据导出,在windows的dos命令窗口中执行:
导出整个库:mysqldump node>D:\node.sql -uroot -p111

在windows的dos命令窗口中执行:
导出指定数据库当中的指定表: mysqldump node emp>D:\node.sql -uroot –p111

导入数据
create database node;
use node;
source D:\node.sql

//22 数据库设计三范式
设计表的依据。按照这个三范式设计的表不会出现数据冗余
提醒:在实际的开发中,以满足客户的需求为主,有的时候会拿冗余换执行速度。

第一范式:任何一张表都应该有主键,并且每一个字段原子性不可再分

第二范式:建立在第一范式的基础之上,所有非主键字段完全依赖主键,不能产生部分依赖。
多对多,三张表,关系表两个外键

第三范式:建立在第二范式的基础之上,所有非主键字段直接依赖主键,不能产生传递依赖。
一对多,两张表,多的表加外键

一对一设计:
一对一设计有两种方案:主键共享
t_user_login  用户登录表
id(pk)        username        password
--------------------------------------
1        zs        123
2        ls        456

t_user_detail 用户详细信息表
id(pk+fk)    realname            tel    ....
------------------------------------------------
1    张三            1111111111
2    李四            1111415621

一对一设计有两种方案:外键唯一。
t_user_login  用户登录表
id(pk)        username        password
--------------------------------------
1        zs        123
2        ls        456

t_user_detail 用户详细信息表
id(pk)       realname    tel    userid(fk+unique)....
-----------------------------------------------------------
1    张三        1111111111    2
2    李四        1111415621    1


// 23 CURD:Create增, Retrieve检索,Update修改,Delete删除
 select
         e.ename,t.*
     from
         (select deptno,max(sal) as maxsal from emp group by deptno) t
     join
        emp e
     on
         t.deptno = e.deptno and t.maxsal = e.sal;