未16.1MySQL 基础之数据操作(增删改查)

MySQL 数据操作 DML

DML(Data Manipulation Language 数据操纵语言)

DML是用来对数据库里的数据进行操作的语言。DML需要 commit
当使用 mysql 客户端操作数据库时,这些语句都会自动提交,不用执行 commit

插入数据(增加)

基础语法
/*插入一条数据*/
insert into 表 (列名,列名...) values (值,值,值...)

/*一次插入多条数据 */
insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...)

/*以下为扩展*/
/*方式三*/
insert into 表1 (列名,列名...) select  列名,列名... from 表2

注意
  • 按“行”插入
  • “字段”和“值”之间,一一对应
  • 值的形式:数字直接写,字符串和时间加单引号,但如果是函数值,则不能加引号
  • auto_increment, timestamp等字段无需插入
id name age phone
1 王麻子 32 13141098899
2 九筒 32 13721096541
3 六子 18 13139192657
4 马邦德 37 15855996688

Example

insert into student (name, age, phone) values('王麻子', 32, '13141098899');

insert into student (
    id,name, age, phone
) values(
    2,'九筒', 32, '13721096541'),
    (3,'六子', 18, '13139192657'),
    (4,'马邦德', 37, '15855996688');

修改数据

基本语法
修改
update 表名 set 字段名1=值表达式1,字段名2=值表达式2,....[where条件] [order排序] [limit限定];

注意
  • 以“行”为单位进行的,可以指定只更新其中的部分字段
  • 其他限定遵循insert语法

MySQL 数据库查询

结构化查询语言 SQL 介绍

SQL 是用于访问和处理数据库的标准的计算机语言。

什么是 SQL?
  • SQL 指结构化查询语言
  • SQL 使我们有能力访问数据库
  • SQL 是一种 ANSI 的标准计算机语言

注:ANSI,美国国家标准化组织

SQL 能做什么?
  • SQL 面向数据库执行查询
  • SQL 可从数据库取回数据
  • SQL 可在数据库中插入新的记录
  • SQL 可更新数据库中的数据
  • SQL 可从数据库删除记录
  • SQL 可创建新数据库
  • SQL 可在数据库中创建新表
  • SQL 可在数据库中创建存储过程
  • SQL 可在数据库中创建视图
  • SQL 可以设置表、存储过程和视图的权限
SQL 是一种标准 - 但是...

SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统。SQL 语句用于取回和更新数据库中的数据。SQL 可与数据库程序协同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他数据库系统。

不幸地是,存在着很多不同版本的 SQL 语言,但是为了与 ANSI 标准相兼容,它们必须以相似的方式共同地来支持一些主要的关键词(比如 SELECT、UPDATE、DELETE、INSERT、WHERE 等等)。

注释:除了 SQL 标准之外,大部分 SQL 数据库程序都拥有它们自己的私有扩展!

实例表创建

班级表

CREATE TABLE class (
  id int  NOT NULL AUTO_INCREMENT,
  name varchar(10) ,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 

老师表

CREATE TABLE teacher (
  id int  NOT NULL AUTO_INCREMENT,
  name varchar(10) ,
  age int ,
  phone char(11) ,
  PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

student学生表

create table  student( 
id int auto_increment primary key, 
name varchar(10), 
age  int, 
class_id int, 
foreign key(class_id) references class(id) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 

多对多关系表

create table class2teacher( 
id int auto_increment primary key, 
class_id int,
teacher_id int, 
foreign key(class_id) REFERENCES class(id),
foreign key(teacher_id) references teacher(id) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 

实例表数据添加

class(班级表)

insert into class(name) values
("云计算1810"),
("云计算1901"),
("云计算1902");

teacher(老师表)

insert into teacher(name, age, phone) values
("奇哥", 18, "13733878989"),
("强哥", 28, "15633878989"),
("磊哥", 30, "13933878989"),
("闫老师", 18, "13633878989");

student(学生表)

insert into student(name, age, class_id) values
("黛玉", 18, 3), ("钦文", 19, 3),("马邦德", 30, 1),
("九筒", 48, 1),("六子", 36, 2),("汤师爷", 18, 2),
("麻匪", 18,2),
("黛玉", 18,2);

class2teacher(班级到老师多对多关系表)

insert  into class2teacher(class_id,teacher_id) values
(1,1),(1,2),(2,1),(2,2),(2,3),(3,1),(3,3);

单表查询

基础查询
select * from 表
select * from 表 where id > 2
select id,name,age as gg from 表 where id > 2

高级查询
a、条件
    select * from 表 where id > 1 and name != '王麻子' and age = 18;

    select * from 表 where id between 5 and 16;

    select * from 表 where id in (11,22,33)
    select * from 表 where id not in (11,22,33)
    select * from 表 where id in (select id from 表)

b、通配符
    select * from 表 where name like 'sha%'  - sha开头的所有(多个字符串)
    select * from 表 where name like 'shar_'  - sha开头的所有(一个字符)

c、限制
    select * from 表 limit 5;            - 获取前 5 行
    select * from 表 limit 0,2;          - 从第 1 行开始, 取出 2 行, 包含第 1 行
    select * from 表 limit 2 offset 0    - 从第 1 行开始, 取出 2 行, 包含第 1 行

d、排序
    select * from 表 order by 列 asc              - 根据 “列” 从小到大排列
    select * from 表 order by 列 desc             - 根据 “列” 从大到小排列
    select * from 表 order by 列1 desc,列2 asc    - 根据 “列1” 从大到小排列,如果相同则按列2从小到大排序

e、分组
    select age from 表 group by age
    select age,id from 表 group by age,id
    select age,id from 表  where id > 10 group by age,id order by id desc
    select age,id,count(*),sum(age),max(age),min(age) from 表 group by age,id

    select age from 表 group by age having max(id) > 10

    特别的:group by 必须在where之后,order by之前

f、嵌套查询
select * from  (select name from t1 where age>18 and age < 25 order by id desc limit 2 ) as tt  order by id;

多表查询

连表

企业通用方法

-- 查询到 每个班级的所有学员的姓名

select class.name, student.name
from class, student
where 
student.class_id=class.id;

-- 查询到 云计算1901班级的所有学员的姓名
select class.name, student.name
from class, student
where 
class.name="云计算1901" 
and
student.class_id=class.id;

-- 查询到 马邦德 是哪个班级的

select student.name as 学员姓名,class.name as 班级姓名
    from student,class
    where student.name='马邦德'
    and
    student.class_id=class.id;

-- 查询老师 奇哥 都负责哪些班级
select t.name,c.name 
from teacher as t, class as c ,class2teacher c2t
where t.name='奇哥' 
and c2t.teacher_id=t.id  
and c2t.class_id=c.id;

Mysql JOIN 语法

/*无对应关系则不显示*/
select  A.class_name, B.name
from class as A, teacher as B
Where A.id = B.class_id

/* 内连接   无对应关系则不显示*/
select A.class_name, B.name
from class as A inner join teacher as B
on A.id = B.class_id

/* 左连接   左边的表(A)所有显示,如果右边的表(B)中无对应关系,则值为null*/
select A.class_name, B.name
from class as A left join teacher as B
on A.id = B.class_id

/* 右连接 右边的(B)表所有显示,如果左边的表(A)中无对应关系,则值为 NULL*/
select A.name, B.name
from class as A right join teacher as B
on A.id = B.class_id

Example

select class.name, student.name
    from class join student
    on student.class_id=class.id;

select class.name,student.name
    from class inner join student
    on student.class_id=class.id
    where class.name="云计算1901";

select teacher.name, class.name
    from class, teacher, class2teacher
    where teacher.name = "奇哥"
    and class2teacher.teacher_id=teacher.id
    and class2teacher.class_id = class.id;

select teacher.name, class.name
    from class join teacher join class2teacher
    on class2teacher.teacher_id=teacher.id and class2teacher.class_id = class.id
    where teacher.name = "奇哥";

删除数据

基础语法
delete from 表名 [where  条件] [order by 排序的字段 [desc 取反]] [limit  限定的行数];

注意
  • “以行为单位”删除
  • 删除语句中,where条件如果不写,则就删除了所有数据
  • order排序子句用于设定删除数据的先后顺序
  • limit限定子句用于限定在设定的顺序情况下删除指定的某些行

drop,delete与truncate的区别

drop      直接删掉表 

truncate  删除表中数据,再插入时自增长id又从1开始

delete    删除表中数据,可以加where字句, 增长 id 会继续增长。

(1)DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。TRUNCATE TABLE则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。

(2) 表和索引所占空间。当表被TRUNCATE后,这个表和索引所占用的空间会恢复到初始大小,而DELETE操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。

(3) 一般而言,drop > truncate > delete

(4) 应用范围。TRUNCATE只能对TABLE;DELETE可以是table和view(视图)

(5)TRUNCATE和DELETE只删除数据,而DROP则删除整个表(结构和数据)。

(6)truncate与不带where的delete:只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。

(7)delete语句为DML(data maintain Language),这个操作会被放到rollback segment中,事务提交后才生效。如果有相应的tigger,执行的时候将被触发。

(8)truncate、drop是DLL(data define language),操作立即生效,原数据不放到 rollback segment中,不能回滚

(9) 在没有备份情况下,谨慎使用drop与truncate。要删除部分数据行采用delete且注意结合where来约束影响范围。回滚段要足够大。要删除表用drop;若想保留表而将表中数据删除,如果于事务无关,用truncate即可实现。如果和事务有关,或老师想触发trigger,还是用delete。

(10)Truncate table表名 速度快,而且效率高,因为:
truncate table 在功能上与不带 WHERE 子句的DELETE语句相同:二者均删除表中的全部行。但TRUNCATE TABLE比DELETE速度快,且使用的系统和事务日志资源少。DELETE语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

(11)TRUNCATE TABLE删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用DELETE。如果要删除表定义及其数据,请使用DROP TABLE 语句。

(12) 对于由FOREIGN KEY约束引用的表,不能使用TRUNCATE TABLE,而应使用不带WHERE子句的DELETE语句。由于TRUNCATE TABLE不记录在日志中,所以它不能激活触发器。

更新(修改) update

update 表名 set 字段名1=值表达式1,字段名2=值表达式2,....[where条件] [order排序] [limit限定];

注意
以“行”为单位进行的,可以指定只更新其中的部分字段
其他限定遵循insert语法

删除 delete

清空表的内容,表本身还在。

delete from 表名    /*自增列的值继续递增,可以加 where 子句*/
truncate table 表名  /*自增列的值重新从 1 开始*/
/*删除表中的所有数据,自增列的值继续递增*/
delete from tb1;

/*删除表中的某些数据,被删除的数据的自增列的值将不会再次出现,自增列的值继续递增*/
delete  from  tb1   where id < 20;

删除表,表将消失

drop table  表名     /*整个表将不复存在*/

复制表结构

-- 清空表数据
    TRUNCATE [TABLE] 表名

-- 复制表结构
    CREATE TABLE 表名 LIKE 要复制的表名

-- 复制表结构和数据
    CREATE TABLE 表名 [AS] SELECT * FROM 要复制的表名

-- 检查表是否有错误
    CHECK TABLE tbl_name [, tbl_name] ... [option] ...

-- 优化表
   OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

-- 修复表
   REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM]

-- 分析表
   ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] 

心得

Mysql表操作

插入数据

基础语法

/*插入一条数据*/
insert into 表 (列名,列名...) values (值,值,值...)

/*一次插入多条数据 */
insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...)

/*以下为扩展*/
/*方式三*/
insert into 表1 (列名,列名...) select  列名,列名... from 表2

注意:

  • 插入
  • "字段"和"值"之间,一一对应
  • 值的形式:数字直接写,字符串和时间加单引号,但如果是函数值,则不能加引号
  • auto_increment, timestamp等字段无需插入

修改数据

基本语法

修改

update 表名 set 字段名1=值表达式1,字段名2=值表达式2,....[where条件] [order排序] [limit限定];

Mysql数据库查询

创建数据库

create database school;
use school;

创建表

班级表

create table class( id int not null auto_increment, name varchar(10), primary key (id) )engine=innodb default charset=utf8mb4;

老师表

create table teacher( id int not null auto_increment, name varchar(10), age int, phone char(11), primary key (id) )engine=innodb default charset=utf8mb4;

学生表

create table student( id int auto_increment primary key, name varchar(10), age int, class_id int, foreign key(class_id) references class(id) )engine=innodb default charset=utf8mb4;

多表关系

mysql> create table class2teacher( id int auto_increment primary key, class_id int, teacher_id int, foreign key(class_id) references class(id), foreign key(teacher_id) references teacher(id) )engine=innodb default charset=utf8mb4;

添加数据

class表

mysql> insert into class(name) values ("云计算1810"), ("云计算1901"), ("云计算1902");

teacher表

mysql> insert into teacher(name, age, phone) values ("奇哥", 18, "13733878989"), ("强哥", 28, "15633878989"), ("磊哥", 30, "13933878989"), ("闫老师", 18, "13633878989");

student表

mysql> insert into student(name, age, class_id) values ("黛玉", 18, 3), ("钦文", 19, 3),("马邦德", 30, 1), ("九筒", 48, 1),("六子", 36, 2),("汤师爷", 18, 2), ("麻匪", 18,2), ("黛玉", 18,2);

class2teacher

mysql> insert  into class2teacher(class_id,teacher_id) values (1,1),(1,2),(2,1),(2,2),(2,3),(3,1),(3,3);

单表查询

基础查询

select * from student;
select * from student where id > 2;
select id,name,age as gg from student where id > 2;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345