MySQL随堂笔记| 深度结合个人理解


这是之前的MySQL笔记,  现在已经开始了android的学习课程。


笔记中有很多标注和理解,都是从学习者的角度出发的,当然了,跟我个人的认识和逻辑有很多关联。


希望对MySQL的初学者或识别的有兴趣的朋友有所帮助。


PS:    笔记为课堂随笔,在手机上使用触摸键盘一个一个的敲出来的;

因为听课的同时需要大量的笔记,还得将知识点和自己的逻辑、语言结合,事件匆忙;

本人为java初学者, 目前学习android,没什么大道理或好经验。

综上: 不足之处、错误之处在所难免

然而任何一点都是笔者辛苦学习和劳动所得,内容也至少大都准确、详实。

只希望对别人有所益处,望大神莫喷。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


数据库


MySQL  一种关系型数据库管理系统

常用命令

1,显示所有的数据库

show databases

2,选择使用的库

use 数据库名

3,显示所有的表

show tables

4,查看表结构

desc 表名



SQL  结构化查询语言

      DEL 数据库定义语言

       create 创建    alter 修改       drop  删除


创建一个数据库

create database 数据库名

删除一个数据库

drop database 数据库名


MySQL  中数据类型

整型       int

浮点型  float

字符串   varchar  长度可变的字符串

               char   长度不可变的字节

【varchar(10)   a  如果一个空间被a占用,则剩下9个可储存其他数据

char(10)  a   如果一个空间被a占用,则剩下空间被霸占,不能分配给其他数据。

所以一般长度固定的就选择char】


日期     date    datetime

使用中当字符串用,所以必须有' '号


创建一个表

create table 表名(变量名,数据类型);

   跟Java相反,Java中 数据类型,变量名

create table student(id char(10),name varchar(10),age int(3),score float,rq datatime);

删除一个表

drop table 表名

修改表名

alter table 旧表名 rename 新表名;


为表新增单列

alter table 表名 add 新增列名 类型[(参数)]

如:alter table stu add bz varchar(20);

为表新增多列

alter table 表名 add(新增列名1  类型[(参数)],新增列名2  类型[(参数)]);

如:alter table stu add(bz1 varchar(20),bz2 varchar(20));


修改表的列名

alter table 表名 change 旧列名 新列名[数据类型];

如:alter table stu change bz1 address varchar(25);

修改表的列的数据类型

alter table 表名 modify 列名 数据类型;

如:alter table stu modify id int(10);

一次只能修改一个

删除表的列

alter table 表名 drop column 列名;


↠↠

设置一个列为自动增长

表和列都存在

alter table 表名 modify 列名 数据类型 unique auto_increment;

注意:这里的unique是确定唯一性

   设置自动增长的列以后不用添加数据,会随着数据的录取而自动增长。所以其数据类型需要是int类型。

另外:

1【只要使用后就不重复,例如当设置了3,然后删除它,再重新添加一条数据,则新数据里相应为4,因为3已经被占用。但是,可以通过修改来操作因为自动增加和修改的操作是独立的,而受相同唯一性之约束】

2【设置自动增长的列仍然可以手动添加,只要不重复】

3【识别只能自动往后跳,不能往前跳】

4【设置了自动增长的列在使用默认添加时不可忽略,必须写全以匹配列和值,可以写null,到最后列对应值不会是null】


表存在,列不存在

alter table 表名 add 新列名 数据类型 unique auto_increment;


表和列都不存在

create table 表名(列名 数据类型 unique auto_increment,列名2 数据类型);


如果是复制表且设置某列为自动增长:

create table 表名(列名1 数据类型 unique auto_increment,列名 数据类型......) select 列名i,列名j from 表名;



    DML  数据库操纵语言

        insert     为表增加数据

        delete(另一个truncate) 删除数据

        update   修改数据

        select     查询数据


为表新增一条数据

insert into 表名 values(这里一一对应);

注意:在表名后面没有指定字段,则为所有字段添加数据,字段的顺序和建表时的顺序一致。一一对应。

insert into 表名(姓名 列a,学号 列b) values(a值,b值);

这里也可以指定修改的字段

数据库里只有单引号


如:

insert into stu values(1, 'fj', 23, 90.5, '2014-11-11', '值班');

从所有中查询

select * from stu;


insert into stu(name, id) values('xlg', 2);

select * from stu;


删除表中数据

truncate table 表名;

注意:这个语句表示清空这个表里的所有数据。表本身还在,只是清空数据。不能按条件删除数据。

     这个语句删除的数据不可恢复。

delete from 表名 where 删除条件;

如果没有条件则清空表,此法数据可恢复。

    delete from 表名 where id=5;

    可以有多个条件。


复制表:

为了保护数据,一般对复制表进行删除。只复制数据是不可能的哈,~~

 1,既要复制结构,也要复制数据

         复制表不存在

          create table 复制表名 [as] select * from 被复制表名;

          复制的表存在

           insert into 复制表名 select * from 被复制表名;

 2,只复制表结构,不复制表的数据

        create table 复制表名 [as] select * from 被复制表名 where 假条件(比如1=2);

如:create table s1 as select * from stu where 1=2;


↠↠

从下面根据需要的列复制表的例子中体会使用语句、符号等建立的表、列之间的关系,及其在数据库中的理解和应用

create table agent(name varchar(10),principal varchar(10),adds varchar(50)) select name, principal, adds from supplier where 1=2;

等价于先按列表创建表,然后从被复制表按对应需要的列复制表,使用假条件则完成只复制结构而不复制数据的目的。

【理解:  可以借助面向对象思想理解表。数据库是对象,表也是对象,而列就是表对象的属性,具体的数据的值就是表对象的属性的值】【在MySQL中表名()[即相似于Java的方法/构造方法],通过其中的列[相似于方法/构造方法中的参数列表],完成对表的指定内容的相应操作。


↠↠

另外,结合上下所学的内容,理解MySQL语言的逻辑和实用技巧。不难发现大致都是这样几个过程:

【要操作谁—它存在吗—怎么操作—与别人有什么关联—怎么关联—有什么特殊条件】

比如: 同样使用上面只需要结构的复制表的例子:

create table agent(name varchar(10),principal varchar(10),adds varchar(50)) select name, principal, adds from supplier where 1=2;

操作表—不存在—需要创建/需要复制别人—跟被复制者有关—按照列表/一些参数或规则—需要结构?数据



设置编码集

set names utf-8;   dos 不支持

set names gbk;  国标码,提供中文支持

应该在添加之前就设置编码

用null做条件是  不能用等号=  只能用is

如:delete from stu where age is null;

删除了表中所有年龄为空的数据

同理,非空时使用is not null;

      

↠  

复制表,例:

create table sss(bh,int);

insert into sss(bh) select id from stu;

创建表sss ,并从stu中拷贝id列数据到本表bh列中。

alter table sss add xm varchar(10);

为sss添加xm列

truncate table sss;

清空表sss


以多列复制表   如下:

insert into list(id, name, adds) select id, name, adds from supplier;】


修改表的数据

update 表名 set 字段1=值,字段2=值 where 字段=值;

如:

修改单个

update sss set xm='王麻子' where bh=1;

修改多个

update sss set xm='王麻小子', bh=10000 where bh=1;



查询:

母本  select *from 表名;


条件查询

select 字段a,字段b,... from 表名 [where 字段1=值1 or [and] 字段2=值2...];

【如果用的是同一个字段作为条件,且用or连接,则可以使用in来替换。

select * from 表名 where 字段 in(值1,值2...);】

      数据库中,可以用!=表示不等于,但是一般使用数据库中专用<>  来表示不等于。

注意:MySQL中,从where后往前执行,也就是从右往左执行。所以在使用and多条件查询时,则应注意查询范围大小的条件的书写顺序,一般遵循从右往左:大范围往小范围。


模糊查询:  

只知道条件的一部分

匹配模式      %    代表任意字符  

                      _   代表任一字符

select * from stu where name like'%小红%';

select * from stu where name like'%小红';

select * from stu where name like'红%';

select * from stu where name like'小__';

select * from stu where name like'小_';


select * from stu where beizhu like'%50/%%' escape '/';

使用转义字符,将斜杠转义。表示要跳过它后面的那个。


排序查询    

对数据无影响,只是改变查询输出的顺序

select * from 表名 order by 字段名[asc    表示按升序,为默认];

如果有null,则null为最小。

desc  表示降序


多条件排序:

select * from 表名 where 字段=值 order by 字段名1 排序方式,字段名2 排序方式;

          

注意:where 总是紧跟在表名后

      使用字符串排序,则为其首字母在字典中顺序排序。


排除相同:

只显现一次

select distinct 字段1,字段2... from 表名;


分组

这里需要先了解聚合函数

sum()      求和    

select sum(字段) from 表名;

count()    计量

select count(score) total from stu;

max()       最大

select max(score) as max from stu;

min()        最小

select min(score) min from stu;

avg()        平均

select avg(age) as avg from stu;

上面有涉及起别名:

as可以省略


分组查询

select age,count(id) from stu group by age;

查询各个年龄阶段的人数

select score,count(*) 人数 from stu group by scor;

查询各个分数的人数


做条件的不一定是字段,也可能是聚合函数

select deptno from emp group by deptno having avg(sal)>5000;

查询平均工资高于五千的部门编号

[聚合函数做条件需要用having关键字连接,同时在having之前必须分组]


其实,最重要的是结合实际生活中操作表格数据的逻辑。


顺序:

先where …group… having …order后


select 字段1,字段2...,聚合函数1(字段) 新起名,聚合函数2(字段) 新起名 from 表名 where 条件 group by 字段;

如:

select gender,avg(age)平均年龄,avg(score)平均分 from stu group by gender;


分页查询

limit函数    从起始位置下一条开始

select *from 表名 limit 起始位置,显现条数;

如:   select *from stu limit 0,4;   

           显示从1开始四条数据


联合查询

union 类似于数学的并集

比or的效率更高,但语句更复杂


select *from emp where deptno=2 or sal >5000;

查询部门2或工资在5000以上的信息


->select*from emp where deptno=2

->union

->select*from emp where sal>5000;

这里已经自动消除重复

->select*from emp where deptno=2

->union all

->select*from emp where sal>5000;

这里就没有消除重复


补充:

【跨库操作

在一个数据库中操作其他数据库数据

select * from 数据库名.表名;

    类似Java中的导入包】


多表查询


数据的完整性约束↠限制性的条件

↷保证数据的正确性

↷确保数据的有效性

↷确保数据的一致性


↘非空约束

create table s(id int not null, name varchar(10));

对于字段和类型:

      字段名 数据类型 not null;

create table *(id char(10) not null, name varchar(10))type=innodb;


↘默认约束

default

alter table s modify id char(10) not null default '0001';

修改id默认为0001   


↘唯一约束

unique

alter table s add tel char(11) unique ;

唯一后就不能重复加 。但是可以重复空。


↘check 约束

MySQL不支持


↬主键约束

primary key

一张表只能有一个主键,类似unique,后者一张表中可以有多个。

主键不能为空,且不能重复,unique不能重复但可以为空。

alter table s modify id char(10) not null primary key;


外键

foreign key

主键表给外键表

在次表的外来字段上建立外键


alter table 次表 add constraint 外键名 foreign key(设置外键的字段) references 主表(关键外键的字段);

如:

create table score(xh char(10),fs float);

前面已经有一个学生表s,这里建一个分数表

alter table score add constraint fk foreign key(xh) references s(id);

创建外键


可以理解为主次二表设置共有字段,通过这个字段来实现对数据完整性的控制。

表后应加type=innodb


添加外键以后的数据不能在单表中删除,因为这会造成在关键表中数据无效。

应该先删除次表数据,才能在主表中删除。


alter table 表名 drop foreign key 外键名;

删除外键


on delete cascade   删除级联

删除主表时删除主表

on update cascade  修改级联

修改主表时修改次表


select *from s,score where s.id=score. xh;

同时查看两个表





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值