您的位置:首页 > 数据库 > MySQL

mysql 复习笔记 表操作

2018-01-11 20:00 387 查看
insert into t_user(id,name,email) values(1,'jack','jack@163.com')表 创建表

create table tableName(

    columnName dataType(length),

    ……

    columnName dataType(length),

);

set character_set_results='gbk';

约束后面再讲。

1.表格用来存储数据,表格是一种结构化文件

2.表格行被成为记录(表中的数据),表格列被成为字段。

3.表格的字段属性包括:字段名称、字段数据类型、字段长度、字段约束

4.创建表的语法:

create table tablename(

    columnName dataType(length),

    columnName dataType(length),

);

5.关于mysql数据库中的数据类型

varchar 可变长度字符串

char定长字符串

varchar和char都是字符串类型varchar(10)动态判断实际长度分配控件 jack 4个,char(10)jack的话补空格,varchar效率低省空间 char效率高固定空间导致控件浪费,若字段中的数据不具有伸缩性建议用char 如果具备很强伸缩性建议使用varchar类型 varchar(3)数据不超过3

int 整型 int(3)最大可以存999

bigint长整型 对应java中long类型

float 浮点单精 

double 浮点双精 double(7,2)7表示7个有效数字,2表示两个小数位

date日期类型  实际开发中为了通用,所以日期类型少用 用字符串代替

blob 二进制大对象 存储图片声音视频等数据 数据库表中存储一个图片常见 视频少。一般提供视频的link

clob 字符大对象 可以存储比较大的文本,4G+的字符串

6.创建表格 学生表

设计:建立学生信息表 字段包括

学号 int

姓名 varchar

性别 char

出生日期 date

邮箱地址 varchar

create table t_student(
no int(10),
name varchar(32),
sex char(1),
birth date,
email varchar(128)

);

注意:1表格的名字最好以t_或者tbl_开始,增强可读性

      2varchar最好是2的倍数,方便存储中文

删除表格 drop table t_student;这种删除方式若数据库中没有这个表则报错。

这时候用drop table if exists t_student; mysql的特色其他db没有。

查看表结构 desc table

7向t_student 表格中插入数据

7.1向数据插入表格必须使用insert语句,这属于DML语言

7.2DML语句包括:insert update delete 增改删数据 和表结构无关

7.3insert into tablename(columnname1,2,3……)values(value1,2,3……)

字段和值必须一一对应,个数必须相同 数据类型必须一致

7.4向t student表格中插入数据

insert into t_student(no,name,sex,birth,email)values(1,‘张三’,‘m’,‘1970-1-1’,‘zhangsan@xxx.com’);

7.5 可以这样执行insert语句吗

inster into t_student(name,email) values('wangwu','wangwu@163.com')

默认情况下:当一张表被创建以后,没有指定约束的话,可以为null,并且没有指定任何任何默认值的话,默认值就是null,这里的默认值null表示:若插入数据的时候没有给该字段指定任何数据,默认插入null值。

我们可以再向no,sex,birth字段中插入值吗,只能导致底层db table中新增一条记录,若希望null变成其他数据需要使用update语句进行更新操作

insert into t_student(no,sex,birth) values(3,'m','19xx-1-1')

7.6insert语句中字段的名字可以省略吗?

insert into t_student() values(4,'zhaoliu','m','1900-1-1','zhaoliu@163.com')

可以。默认不写的话相当于全写,插入的数据数量要匹配,但是如果不够的话会报错

建议不要将前面的字段省略,若省略就表示所有字段全部加上。可读性 健壮性

7.7插入中文试试 dos窗口中失败 dos gbk 数据库是utf8

insert into t_student(no,name) values(6,'王五') incorrect string value

show create table t_student;windows dos窗口默认gbk改成utf8或者改数据库表gbk。

navicat for mysql/ mysql front GUI的,学语句是为了编程语言开发需要语句操作

修改查询结果集的显示编码方式set character_set_results = 'GBK';当前会话有效。

查看mysql的相关字符编码方式show variables like '%char%';

8关于创建表格的语句

drop table if exists t_student;

create table t_student(
no int(10),
name varchar(32),
sex char(1) default 'm'

);

insert into t_student(no,name) values(1,'jack');

insert into t_student(no,name) values(2,'lucy');

select * from t_student;

source c:\*.sql

关于sql脚本:

你是怎么看sql脚本的?

-该文件是一个普通的文本文件后缀名.sql被称为sql脚本

-在sql脚本中有大量的sql语句,想批量的执行sql语句可以将这些sql语句写入sql脚本文件中

直接使用source执行这个脚本,可以执行大量的sql语句。

-若项目中期就职,可能数据库表以及表中的记录都已经准备好了,可能直接给一个sql脚本直接执行这个脚本将底层数据库中的数据完成初始化就可以开发了。

9.获取系统当前时间 select now();

创建表:机构表

create table t_organization(
code char(10),
name varchar(32),
createTime date

);

insert into t_organization(code,name,createTime) values('1','国家外汇局',now())

insert into t_organization(code,name,createTime) values('2','四川省',now())

now()默认只有年月日

10.表的复制【快速创建表】

create table emp1 as select * from emp;

select * from emp1;

create table emp2 as select empno,ename,sal from emp;

select * from emp2;

语法结构:

create table tableName as select columname,…… from tablename

将查询结果当作一张表创建

11.将查询结果插入到某张表中

insert into emp2 select * from emp2 where sal=3000;

12.增删改表结构DDL 一般很少用 对表不满意了

drop table if exists t_student;

create table t_student(
no int(10),
name varchar(32),

);

desc t_student;

增:给t_student表增加字段联系人

alter table t_student ADD tel varchar(10);

改:将表中的tel字段长度扩展到20个长度

alter table t_student modify tel varchar(20)

desc t_student;

删:将表中tel删除

alter table t_student drop tel;<
4000
br />

13增删改表中的数据 insert update delete属于DML

13.1 update

语法结构update tablename set 字段名=字段值,字段名=字段值 where条件;

注意 update语句没有条件会将一张表中所有的数据全部更新

t_student

no name email

1  null null

2  null null

3  null null

将no=3记录name修改为张三 email修改为zhangsan@163.com

update t_student set name='zhanggsan',email='zhangsan@163.com' where no=3;

如果没有where会修改所有字段 要小心

比如update t_student set name='lisi';则三条记录的name都会被修改为lisi

员工名里含有O的修改为zhangsan

update emp_bak set ename='zhangsan' where ename like '%o%';

将emp_bak表中所有工作岗位是manager和salesman的员工工资上调10%

set emp_bak sal=sal*1.1 where job in('manager','salesman');

13.2 delete

delete语句的与语法格式

delete from tablename where 条件

注意若没有限制where则会将表中所有记录删除

删除学号是3的学生

delete from t_student where no =3;

delete from t_student 

select count(*) from t_student     //0

将20部门的manager删除

delete from emp_bak where deptno=20 and job='manager'

约束

1.什么是约束 为什么要使用约束

约束对应的英语单词 constraint 约束实际上就是表中数据的限制条件

表在设计的时候加入约束的目的就是为了保证表中的记录完整和有效

2.约束包括哪些呢?

非空约束 (not null)

唯一性约束 (unique)

主键约束 (primary key) 简称PK

外键约束 (foreign key) 简称FK

检查约束[mysql不支持 oracle支持]

3.非空约束

not null约束的字段,不能为null值,必须给定具体的数据

创建表,给字段添加非空约束  创建用户表,用户的邮件地址不能为空

drop table if exists t_user

create table t_user(
id int(10),
name varchar(32) not null,
email varchar(128)

);

insert into t_user(id,name,email) values(1,'jack','jack@163.com')

insert into t_user(id,email) values(2,'jack@163.com') // error doesnt have a default value

4.唯一性约束

unique约束的字段具有唯一性,不可重复

创建用户,保证邮箱地址唯一

create table t_user(
id int(10),
name varchar(32) not null,
email varchar(128) unique   //加到后面叫 列级约束

);

insert into t_user(id,name,email) values(1,'jack','jack@163.com');

insert into t_user(id,name,email) values(2,'jack','jack@163.com'); //error duplicate 

insert into t_user(id,name) values(3,'def');可以成功 email是null

unique约束 约束的字段不能重复,但是可以为null

表级约束,使用表级约束给多个字段联合添加约束,单个可以重复联合不能重复

create table t_user(
id int(10),
name varchar(32) 
email varchar(128)
unique(name,email) 

);

insert into t_user(id,name,email) values(1,'abc','abc@163.com')

insert into t_user(id,name,email) values(1,'xxx','xxx@163.com')

insert into t_user(id,name,email) values(1,'abc','def@163.com')

insert into t_user(id,name,email) values(4,'abc','def@163.com') //duplicate entry

表级约束还可以给约束起名字 //为什么要起名 因为以后要通过这个名字来操作这个约束

create table t_user(
id int(10),
name varchar(32) 
email varchar(128)
constraint t_user_email_unique unique(email) 

);

查询约束的名字

show datebases->use informantion_schema ->show tables->desc table_constraints存储约束信息的

select constraint_name from table_constraints where table_name='t_user'

5.not null和unique可以联合使用吗

---可以联合使用

---被not null unique约束的字段,即不能为空 也不能重复

drop table if exists t_user;

create table t_user(
id int(10),
name varchar(32) not null unique

);

insert into t_user(id,name) values(1,'jack');成功

insert into t_user(id,name) values(2,‘jack'); 失败

insert into t_user(id) values(3);失败

insert into t_user(id,name) values(3,'jackson');

6.主键约束-primary key 简称PK

6.1主键涉及到的术语:

主键约束 

主键字段

主键值

6.2以上的主键约束、主键字段、主键值的关系?

表中的某个字段添加主键约束之后,该字段被称为主键字段,主键字段中出现的每一个数据都被称为主键值

6.3给某个字段添加主键约束primary之后,该字段不能重复,而且也不能为空 效果和not null unique相同但是本质不同,主键字段除了可以做到not null unique之外,关键字段还会默认添加索引 index

6.4一张表应该有主键字段,若没有,表示这张表是无效的。第一范式

主键值是当前行数据的唯一标识。主键值是当前行数据的身份证号

即使表中的两行记录相关的数据是相同的,但是由于主键值不同,我们认为这是两行完全不同数据

6.5给一个字段添加主键约束,被称为单一主键

//单一主键 列级约束  这种用的比较多

create table t_user(
id int(10) primary key,
name varchar(32)

);

//单一主键 表级约束

create table t_user(
id int(10),
name varchar(32),
primary key(id)

);

//单一主键 表级约束 起名

create table t_user(
id int(10),
name varchar(32),
constraint t_user_id_pk primary key(id)

);

6.5给多个字段联合添加一个主键约束,被称为复合主键 只能用表级约束

create table t_user(
id int(10),
name varchar(32),
email varchar(128)
constraint t_user_id_name_pk primary key(id,name)

);

insert into t_user(id,name,email) values (1,'jack','jack@')

6.7无论是单一主键还是复合主键,一张表主键约束只能有一个

6.8主键根据性质分类:

自然主键 主键值若是一个自然数,和当前表的业务没有任何关系就叫自然 

业务主键 主键值若和当前表中业务紧密相关的,那么这种主键值被称为业务,业务数据变被影响所以用的少,大部分都是用自然主键。

6.9在mysql中提供了一个自增的数字,专门用来自动生成主键值

主键值不需要用户维护,也不需要用户提供了 自动生成。这个默认的1开始1递增

create table t_user(
id int(10) primary key auto_increment,
name varchar(32)

);

7.外键约束-foreign key 简称FK 只有表级约束没有列级约束

7.1外键涉及到的属于

外键约束

外键字段

外键值

7.2外键约束,外键字段,外键值之间的关系

某个字段添加外键约束之后,该字段成为外键字段

外键字段中的每一个数据都是外键值

7.3外键也分为:单一外键 给一个字段添加外键约束和复合外键给多个字段联合添加一个外键约束

7.4一张表中可以有多个外键字段

7.5分析场景:

请设计数据库表用来存储学生和班级信息,给出两种解决方案:

学生信息和班级信息之间的关系,一个班级对应多个学生,是典型的一对多关系

第一种设计方案:将学生信息和班级信息存储到一张表中

学生信息表 t_student

sno(PK)sname   classno    cname

1      jack    100        北京海淀区……高三1班

2      lucy    100        北京海淀区……高三1班

3      zhangsan 100       北京              1

4      ford    200                          2

5      king    200                          2

6      allen   300                          3

7      lisi    300        北京              3

以上设计的缺点:数据冗余

第二种方案:将学生信息和班级信息分开两张表存储 学生表+班级表

t_student

sno(pk)           sname        classno(fk)

1 jack
100

2 lucy
100

3 zhangsan
100

t_class(pk)

cno(pk)           sname

100 北京海淀区…… 1班

200               2

300       3

结论 为了保证t_student表中的classno字段中的数据必须来自于t_class表中cno字段中的数据,给classno添加外键约束,classno字段被称为外键字段 100 200 300被称为外键值

classno这里是一个单一外键

注:外键值可以为null

注:外键字段取引用一张表的某个字段的时候,被引用的字段必须具有unique约束

插入的时候先出class父表后插入子表student

删除的似乎后先删子后删父

注:有个外键引用之后,表分为附表和子表,以上父表是 班级表 子表是 学生表

创建表先创建父表 再创建子表,删除数据的时候先删除子表中的数据,再删父,插入先父后子

——————sql文——————

drop table if exists t_student;

drop table if exists t_class;

create table t_class(
cno int(3) primary key,
cname varchar(128) not null unique

);

create table t_student(
sno int(3) primary key,
sname varchar(32) not null,
classno int(3),
constraint t_student_classno_fk foreign key(classno)references t_class(cno)

);

insert into t_class(cno,cname) values(100,'高三1班')

insert into t_class(cno,cname) values(200,'高三2班')

insert into t_class(cno,cname) values(300,'高三3班')

insert into t_student(sno,sname,classno) values(1,'jack',100)

insert into t_student(sno,sname,classno) values(2,'lucy',100)

insert into t_student(sno,sname,classno) values(3,'zhangsan',100)

insert into t_student(sno,sname,classno) values(4,'ford',200)

insert into t_student(sno,sname,classno) values(5,'king',200)

insert into t_student(sno,sname,classno) values(6,'allen',300)

insert into t_student(sno,sname,classno) values(7,'lisi',300)

select * from t_student;

select * from t_class;

insert into t_student(sno,sname,classno) values(8,'wangwu',500);

error 外键约束失败

——————sql文——————

找出每个学生的班级名称

select s.*,c.* from t_student s join t_class c on s.classno=c.cno;

重点:典型的一对多设计是 多的一方加外键

8.级联更新与级联删除

在删除父表中数据的时候,级联删除子表中的数据

在更新    更新

以上的两种谨慎使用,因为级联操作会将数据改变或者删除,数据无价

on update cascade;指定外键的时候加这句话

on delete cascade;

删除外键约束

alter table t_student drop foreign key t_student t_student_classno_fk

添加外键约束

alter table t_student add constraint t_student_classno_fk foreign key(classno) references t_class(cno) on delete cascade

删除cno 100  则t student中 100的被删除/修改cno 200->400 则student中的200也变400 

修改约束  用的少,可以先删后加

alter table t_student modify student_name varchar(30)unique
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: