Web开发|12|MySQL 入门

认识 MySQL

MySQL是哪个公司的产品? 它有哪些主要特点?

MySQL数据库简称MySQL,是一款由瑞典MySQL AB公司开发并且应用广泛的数据管理系统,MySQL数据库因其体积小、速度快、总体拥有成本低受到很多的热捧。现在,MySQL 归属于Oracle公司。遵循GPL协议。

什么是关系型数据库管理系统(RDBMS)?什么是结构化查询语言(SQL)?
为什么大多数人都认为在不需要事务化处理的情况下,MySQL是管理系统最好的选择?
数据库有什么用?

数据库的五个基本单位分别是什么?

  1. 数据库服务器
    数据库服务器是指用来运行数据库服务的一台电脑。在中小型企业通常为一台。在数据存储量计算量很大的时候可以存在多台。多台数据库服务器共同来存储或计算。由于数据安全非常重要,我们经常会对数据库服务器里面的数据进行备份。
  2. 数据库
    一个数据库服务器里面有可以有多个数据库。主要用来分类使用。我们可以建立交通信息数据库、游戏数据库、酒店开房数据库,主要用来将各个不同用途的数据,按照业务进行大块的划分。
  3. 数据表
    例如在游戏数据库中。根据这一款游戏又分为了不同的数据表。专门用来区分游戏不同的数据。如用户数据(用户、密码);人物数据;所有装备和装备信息;用户的充值信息;药品、魔力药水信息等。
  4. 数据字段
    数据字段,也叫数据列。就是我们日常所见表格里面的列。在表格中,我们会将一张用户表分成多个列。
  5. 数据行
    真正的数据存在每一个表的行里面。字段(列)划分出来了一个表应该按照什么样的格式存数据。而数据行是真正的数据。每一行需要遵循数据字段(列)的规范和要求进行存入数据。


初识 SQL

什么是结构化查询语言(SQL)?

结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
SQL是最重要的关系数据库操作语言,并且它的影响已经超出数据库领域,得到其他领域的重视和采用,如人工智能领域的数据检索等。
SQL是关系模型的数据库应用语言,由IBM在20世纪70年代为其关系型数据库 System R 所开发。
SQL 是1986年10 月由美国国家标准局(ANSI)通过的数据库语言美国标准,接着,国际标准化组织(ISO)颁布了SQL正式国际标准。1989年4月,ISO提出了具有完整性特征的SQL89标准,1992年11月又公布了SQL92标准。
虽然各个数据库系统略有不同,但是他们基本均遵循SQL 92标准。或者在SQL 92上做了一些简单的扩展和变化。

SQL语句按功能划分为3个类别,分别是什么?

  1. 数据定义语言(DDL ,Data Defintion Language)语句:数据定义语句,用于定义不同的数据段、数据库、表、列、索引等。常用的语句关键字包括create、drop、alter等。
  2. 数据操作语言(DML , Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据的完整性。常用的语句关键字主要包括insert、delete、update和select等。
  3. 数据控制语言(DCL, Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括grant、revoke等。


安装 MySQL

Windows平台上如何安装MySQL?

Windows平台.msi安装包:https://dev.mysql.com/downloads/file/?id=476477

Linux平台上又如何安装MySQL?MySQL安装有哪些需要注意的?

连接MySQL数据库

mysql命令行工具怎么使用?使用它如何连接到MySQL服务?

mysql  -h  localhost  -u  root  -p
// -h  表示数据库服务的连接地址,连接本机可不填
// -u  表示要登录的用户
// -p  表示使用密码进行登录
// 每登录一次,MySQL Connection ID 会自动加1。


数据库操作

如何创建一个数据库?

语法:create  database  dbname;

create  database  php;

// “Query OK” 表示上面的命令执行成功,所有的 DDL 和 DML(不包 括 SELECT)操作执行成功后都显示“Query OK”,这里理解为执行成功就可以了;“1 row affected” 表示操作只影响了数据库中一行的记录,“0.00 sec”则记录了操作执行的时间。

如何查看所有的数据库?

show  databases;

如何选中、切换并进入一个数据库?

use  dbname;

如何删除一个数据库?

drop  dbname;

警告:数据库删除后,下面的所有数据将会全部被删除,所以删除数据库前一定要慎重并做好相应的备份。

如何查看某个数据库中所有表?

show  tables;


表操作

如何创建一张表?

语法:create  tablename( 字段1  字段类型1, 字段2  字段类型2, 字段3  字段类型3, ... );

use  php;   // 进入数据库

create table emp(ename varchar(10), hiredate date, sal float(10,2), deptno int(2));   // 创建表,表名为emp,共四个字段

// 为表指定表引擎和字符集
create table emp2(id int(10) default 0, name varchar(10) default null, psw date default null)engine=InnoDB default charset=utf8;    
// engine=InnoDB是表引擎
// default charset=utf8 指定表的默认字符集

如何查看表的字段结构及其信息?

desc tablename; // 查看表的字段结构

如何查看某张表创建时所用的SQL语句?

show  create  table  tablename  \G; // “\G”选项的含义是使得记录能够按照字段竖着排列,对内容比较长的记录更易于显示。
// 打印信息中除了表定义以外,还可以看到表的 engine(存储引擎) 和 charset(字符集)等信息。

如何删除一张表?

drop  table  tablename; // 删除一张表

警告:删除表后,表和数据均会丢失,请务必在删除重要表之前备份数据。

如何修改表名?

语法:alter table 旧表名 rename 新表名;

alter table user rename user2;   // rename 修改表名
show  tables;


字段操作

如何查看表的字段结构?

desc  tablename;

如何修改表中字段的字段类型?

语法:alter  table  表名  modify  字段名  字段类型新值;

// 把emp2表中的name字段修改成 varchar(20)类型
alter table emp2 modify name varchar(20); 

如何给表增加一个新字段?

语法:alter  table  表名  add  column  字段名  字段类型;

// 增加新字段 grade
alter table emp2 add column grade int(5);

增加表的字段时,如何控制字段顺序?

语法:alter  table  表名  add  字段名  字段类型  after  已存在的字段名;

// 在id字段后面增加一个email字段
alter table emp2 add email varchar(50) after id;
desc  emp2;

如何删除表的字段?

语法:alter  table  表名  drop  column  字段名;

alter  table  emp2  drop  column  email;
desc  emp2;

如何修改表的字段名?

语法:alter  table  表名  change  字段原名  字段新名  字段类型;

alter  table  emp2  change  name  username  varchar(30);

如何修改表字段的排列顺序?

语法:在字段增加和修改语句(add/change/modify)中,使用 first|after 来控制字段的排列顺序。

// 增加字段时控制顺序
alter table user add age int(5) after id;
// 修改字段类型时控制顺序
alter table user modify username varchar(15) first;
// 修改字段名时控制顺序
alter table user change username user varchar(50) after age;
// desc  user;


MySQL 数据类型

什么是MySQL数据类型?

MySQL中存的是数据。只要是数据,我们就会规定数据的类型。在表的字段中规定了使用的是某个数据类型。那么,在插入的数据中就要使用对应的数据类型。并且,遵守数据类型的长度要求。

MySQL中有哪些常用的数据类型?各占多少字节空间?取值范围是多少?
性别可以用 tinyint 类型?
人的年龄可以用 samllint 类型?
为什么 float 类型是不精确的?
为什么当对数据精度要求很高时需要使用 decimal 类型?decimal 类型为什么也被称为定点数?
字符类型中,char 类型有什么特点?为什么 varchar 类型可以大大地节约磁盘空间、提高存储效率?text 类型和 blob 类型有哪些本质性区别?
时间类型为什么用得不多?
复合类型有哪几种?set 类型和 enum 类型有什么区别?

// 创建 demo 表
create table if not exists demo( id int(11) not null, user varchar(50) not null, pswd char(32) not null, content longtext not null, createtime datetime not null, sex tinyint(4) not null)engine=InnoDB default charset=utf8;

// 在整型或浮点字段类型后面跟上 unsigned , 表示无符号,即没有负数。
// 在整型或浮点字段类型后面跟上 zerofill ,表示用 0 填充,而不是用空格填充。
// 在字段类型后面跟上 default 'value' , 为当前字段指定默认值。
// 在字段类型后面跟上 not null,表示该字段不允许被插入 null 值,在整型或浮点字段语句后不要声明not null。


MySQL 字符集

什么是字符集?

为了更好的识别中文、日文、英文、希腊语。对于常用的符号进行了编码,这个编码就是字符集。字符集确定了文字的存储方式。字符集相当于是计算机中人类的语言。

常用字符集有哪些?相应的存储长度是多少字节?

  1. ASCII 美国标准信息交换代码 单字节
  2. GBK 汉字内码扩展规范 双字节
  3. Unicode 万国码 4字节
  4. UTF-8 Unicode的可变长度字符编码 1到6个字节

什么是 UTF-8 字符集?什么是 UTF ?

UTF-8是一种针对Unicode的可变长度字符编码,它也是万国码。因为Unicode比ASCII占用大一倍的空间,而对ASCII来说高字节的0又毫无用处。为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF(Universal Transformation Format)。

MySQL中常用的字符集有哪些?

  1. gbk_chinese_ci 简体中文,不区分大小写。
  2. utf8_general_ci Unicode多语言,不区分大小写。

MySQL中字符集的命名格式:1字符集名称_2语言_3类型。类型除了ci外,还有bin等,ci表示“不区分大小写”,bin表示二进制类型。

// MySQL中字符集的命名格式,举例:

ascli_general_ci
ascli_bin
cp1250_polish_cs

注意:在MySQL中写utf-8的时候,要写成utf8。没有中间的横线。


MySQL 表引擎

什么是表引擎?

MySQL的强大之处在于它的插件式存储引擎,我们可以基于表的特点使用不同的存储引擎,从而达到最好的性能。
如果你足够熟悉,并且有一定工作经验后。你还可以使用阿里巴巴和网易开源出来的MySQL引擎在自己的服务器中使用。

如何查看当前MySQL服务器所支持的所有表引擎?

show  engines;  // 查看到当前MySQL服务器支持的所有表引擎

简单介绍几种常见的表引擎?

  1. InnoDB,常用,它支持数据写入、事务、外键等。
  2. MyISAM,常用,它的数据读取效率很高,但不支持事务。
  3. Archive,不常用。它支持归档引擎,压缩比高达1:10,多用于数据归档。
  4. NDB,不常用。它主要在MySQL集群服务器中使用。

什么是事务?什么是行锁?什么是表锁?

  1. 行锁:写入、更新操作的时候将这一行锁起来,不让其他人再操作了。
  2. 表锁:写入、更新操作时,将表给锁起来不让其他人再操作了。
  3. 事务:同时操作多个数据,若其中的一个数据操作失败。可回滚到操作之前。常用于银行、电商、金融等系统中。


MySQL 索引

什么是MySQL索引?

索引看着挺高大上的一个名字,说白了就是我们书最新面的目录,比如新华字典。

MySQL索引有什么用?

索引用于快速找出在某个列中有一特定值的行。

不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行。表越大,花费的时间越多。如果表中查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要看所有数据。
当然索引也不易过多,索引越多写入,修改的速度越慢。

MySQL索引有哪些类型?

  1. 普通索引
    最基本的索引,它没有任何限制。
  2. 唯一索引
    某一行启用了唯一索引后,则不允许这一列的行数据中有重复的值。针对这一列的每一行数据都要求是唯一的。
  3. 主键索引
    它是一种特殊的唯一索引,并且不允许有空值。一般是在建表的时候同时创建主键索引,常用于用户ID。类似于书中的页码。
  4. 全文索引
    对于需要全局搜索的数据,进行全文索引。

如何给已经存在的表添加上述四种类型的索引呢?

// 1-给表添加普通索引。语法:alter  table  表名  add  index( 字段名 );
alter  table  demo  add  index( name ); // 为name字段增加普通索引

// 2-给表添加唯一索引。语法:alter  table  表名  add  unique( 字段名 );
alter  table  demo  add  unique( name );    // 为name字段增加唯一索引

// 3-给表添加主键索引。语法:alter  table  表名  add  primary  key( 字段名 );
alter  table  demo  add  primary  key( id );   // 为id字段添加主键索引

// 4-给表添加全文索引。语法:alter  table  表名  add  fulltext( 字段名);
alter  table  demo  add  fulltext( name );

在创建表时,如何给表添加索引?

// 做法如下:
// primary  key( )  指定主键索引
// index( )   指定普通索引
// unique( )   指定唯一索引
// fulltext( )    指定全文索引

create table test( id int not null, username varchar(20) not null, password int not null, content longtext not null, primary key(id), index(password), unique(username), fulltext(content))engine=InnoDB default charset=utf8;


CRUD之“增”

先新建一张 user 表,SQL语句如下:

create table user ( id int(10) not null, name varchar(20) not null, pass varchar(10) default '123456', primary key(id), unique(name), index(pass) )engine=InnoDB default charset=utf8;
desc user;      // 查看 user 表结构

关于这个 user表的说明:user表共有三个字段。id字段,不能为空,是主键索引。name字段,不能为空,是唯一索引。pass字段,可以为空,默认值为123456。

如何向表中插入一行数据?

语法1:insert  into  表名  values (值1, 值2, ..., 值n);

// 一次插入一行或多行数据
insert into user values (4, 'lili', '025');
insert into user values (5, 'li22i', '025'), (6, 'kwkw', '025');

说明:该语法下,表中有多少个字段就必须要插入多少个值。一个不能多,一个也不能少。若有默认值,不想传,可以写上null。并且传值顺序必须表结构中的字段顺序完全一致。
语法2:insert  into  表名( 字段2, 字段1, 字段3)  values (值2, 值1, 值3);

// 一次插入一行或多行数据
insert into user (name, id) values ('xii', 8), ('wew', 9);
insert into user (pass, id, name) values (null, 10, 'ppp');

说明:该语法下,非必填字段可以省略,auto_increment自增长的字段也可以省略,字段顺序可以自定义。因此该语法更为常用。


CRUD之“查”

如何从表中查询数据?

查询1:select  *  from  表名;

select * from user; // 查询所有行。 *  是一种正则表达式的写法,表示匹配所有。
查询2:select  字段名1,  字段名2  from  表名;

select id, name from user;  // 查询所有行,只显示一个或多个字段的数据。
select name from user;  // 查询所有的name字段值
查询3:select  distinct  字段名  from  表名;

// distinct 关键字,用于指定该字段“记录不重复”
select distinct pass from user; // 查询单个字段且不重复的字段值
条件查询1:select  字段名  from  表名  where  条件;

// 查询pass='123456'的所有记录
select * from user where pass='123456';

where条件查询中,where后面可以接哪些条件?

  1. 接 比较运算符
    = / > / < / >= / <= / !=
  2. 接 逻辑运算符
    多个条件还可以使用 or 、 and 等逻辑运算符进行多条件联合查询。
条件查询2:select  字段名  from  表名  where  多个条件;

// 查询 id<20 并且 pass='123456' 的行记录
select * from user where id<20 and pass='123456';

// 查询 id>8 或者 pass=null 的 name字段的记录。
select name from user where id>8 or pass='null';

如何对查询结果进行排序?

排序查询:select  字段  from  表名  order  by  排序字段  desc/asc;

// desc降序排列,默认是升序排列asc
select * from user order by id desc;    // 根据id字段进行降序排列
select id,name from user order by id desc;
多字段排序查询:select  字段  from  表名  order  by  排序字段1  desc/asc,  排序字段2  desc/asc,  ... ,  排序字段n  desc/asc;

select * from user order by id desc, name asc, pass desc;

说明:order by 后面可以跟多个不同的字段进行排序。第1个排序字段的优先级最高,依次类推。如果第一个排序字段已经可以确定排序结果,那么第二个排序字段将不会生效。如果前一个字段无法确定排序结果,那么紧跟其后的排序字段才会生效。

如何对查询结果进行分页?
对于查询或者排序后的结果集,如果希望只显示一部分而不是全部,就要使用 limit 关键字对结果集进行数量限制。

分页查询1:select  字段  from  表名  limit  数量;

select * from user limit 3; // 限制3条
select id, name from user limit 5;  // 限制5条
分页+排序查询:select  字段  from  表名  order  by  多个排序字段  desc/asc  limit  数量;

select id,name from user order by id desc, name desc limit 2;

如何给查询结果集的分页同时设置pagesize和page?
需求:假设我从第0条开始取了3条记录。又想再从第3条开始取3条记录。再想从第6条开始取4条记录怎么办?

分页查询2:select  字段  from  表名  limit  偏移量  数量;    (偏移量 = page * pagesize;)

// 第1页,从结果集的 0 索引处开始,显示3条记录
select id,name from user where id>0 order by id desc limit 0,3;  

// 第2页,从结果集的 3 索引处开始,显示接下来的3条记录
select id,name from user where id>0 order by id desc limit 3,3;  

// 第3页,从结果集的 6 索引处开始,显示接下来的4条记录,依次类推。
select id,name from user where id>0 order by id desc limit 6,4;  

如何使用统计类函数?

如果我们想知道总用户数怎么办?查询谁是数据表里的首富怎么办?如果我们想知道用户的平均金额怎么办?如果我们想知道所有用户的总金额怎么办?查询谁的年龄最小怎么办?

五个常用的统计类函数:

  1. count() 统计求和,共多少条记录
  2. max() 最大值
  3. min() 最小值
  4. sum() 相加求和
  5. avg() 平均值

注:实际上还有很多mysql函数也可以使用。但是,因为mysql的计算量本身很大,为了减少压力通常我们会将实际的计算任务交给业务服务器或其他服务器来完成。

统计求和:select  count(字段) [as  别名]  from  表名;

// 查询id字段的总条数
select count(id) from user;

// 用as指定输出结果的别名
select count(id) as total from user;
相加求和:select  sum(字段)  [as  别名]  from  表名;

select sum(id) from user;
// 用as指定输出结果的别名
select sum(id) as sum from user;
求平均值:select  avg(字段)  [as  别名]  from  表名;

select avg(id) from user;
// 为输出结果指定一个别名
select avg(id) as avg from user;
最大值:select  max(字段)  [as  别名]  from  表名;

select max(id) from user;
// 为输出结果指定一个别名
select max(id) as max from user;
最小值:select  min(字段)  [as  别名]  from  表名;

select min(id) from user;
// 为输出结果指定一个别名
select min(id) as min from user;

如何对查询结果进行分组?
比如,根据省份进行分组,即相同省的分为一组。

分组查询:select  字段  from  表名  group  by  字段;

// 根据用户名进行分组,名字相同的分为一组。
select * from user group by name;
分组+统计查询:select  字段, 统计函数(字段) [as 别名] from  表名  group  by  字段;  

// 根据name字段进行分组,并统计出每个组中分别有多少条记录
select *, count(id) as total from user group by name;

// 根据name字段进行分组,并统计出每个组中有多少条含有name字段的记录
select count(name), name from user group by name;

如何在分组的基础上再次统计?

对分组结果进行再统计:select  字段  from  表名  group  by  字段  with  rollup;

// with  rollup,在分组的基础上再进行统计
select * from user group by pass with rollup;

如何对分组结果进行再筛选?

对分组结果进行再筛选:select  字段  from  表名  group  by  字段  having  筛选条件;
说明:having子句与where子句 有相似之处,它们都是设定筛选条件的语句。但也有不同之处,having 是对分组结果进行筛选,而where 是对查询结果进行筛选。

// 对分组结果进行筛选,使用having子句
select * from user group by pass having id>5;

关于单表“查询”的一点小结,综合使用:

综合语法:select   [ 字段1  [as 别名],  [ 统计函数( 字段 ) [as 别名]],  字段n ]  from  表名  [ where  一个或多个条件 ]  [ group  by  分组字段 ]  [ having  分组筛选条件 ]  [ order  by  字段1  desc/asc,  字段n  desc/asc ]  [ limit  偏移量  数量 ];

select id, sum(id) as total from user where id>5 group by pass order by id desc limit 0,2;


CRUD之“多表联合查询”

多表联合查询的本质是:表连接。

什么是表连接?

当需要查询多个表中的字段时,就可以使用表连接来实现。表联接分为内连接和外连接。

  1. 内联结:
    将两个表中存在联结关系的字段、符合联结关系的那些记录,形成记录集合的联结。
  2. 外连接:
    对两个表,选出联结不匹配的记录,分为外左联结和外右联结。

准备工作:创建两张表。一张用户表,存放用户信息;一张订单表,存放哪个用户购买过哪个商品。注:用户表中的uid,即等于订单表中的uid。

// 创建用户表
create table if not exists user(uid int not null, username varchar(20) not null, password char(32) not null)engine=InnoDB default charset=utf8;
insert into user values(1,'张三',123);    // 插入用户
insert into user values (2,'李四', 1234), (3, '王五',12345), (4, '赵六', 123456);

// 创建订单表
create table if not exists order_goods(oid int not null, uid int not null, name varchar(50) not null, buytime int(11) not null)engine=InnoDB default charset=utf8;
// 插入订单记录
insert into order_goods values(1, 1, '商品1', 20180614);
insert into order_goods values (2, 1, '商品2', 20150512),(3,1,'商品3', 20160910), (4, 1, '商品4', 20160228);
insert into order_goods values (5, 2, '商品5', 20150315),(6, 2, '商品6', 20160520);
insert into order_goods values (7, 3, '商品7', 20170825), (8, 4, '商品8', 20180420);

内连接(inner join on)实现多表联合查询:

内连接写法1:select  表1.字段1,  表1.字段n [as 别名],  表n.字段1 [as 别名],  表n.字段n  from  表1  [表1的别名],  表n  [表n的别名]  where  查询条件;

// 查询订单表中哪些用户购买过商品,并将用户信息显示出来
select user.uid, user.username, order_goods.name as goodname, order_goods.buytime from user, order_goods where user.uid = order_goods.uid;

// 用别名来简化表名
select u.uid, u.username, o.name as goodname, o.buytime from user u, order_goods o where u.uid = o.uid;
内连接写法2:select  表1.字段1,  表1.字段n [as 别名],  表n.字段1 [as 别名],  表n.字段n  from  表1  [表1的别名]  inner  join  表n  [表n的别名]  on  查询条件;

// 查询订单表中哪些用户购买过商品,并将用户信息显示出来
select user.uid, user.username, order_goods.name as goodname, order_goods.buytime from user inner join order_goods on user.uid = order_goods.uid;

// 用别名来简化表名
select u.uid, u.username, o.name as goodname, o.buytime from user u inner join order_goods o on u.uid = o.uid;

外左连接(left join on)实现多表联合查询:左连接用于查询 包含在左表中的所有记录、甚至在右表中没有和它匹配的记录。

左外连接写法:select  表1.字段1,  表1.字段n [as 别名],  表n.字段1 [as 别名],  表n.字段n  from  表1  [表1的别名]  left  join  表n  [表n的别名]  on  查询条件;

// 以左表为准,查询关联结果
select * from user left join order_goods on user.uid = order_goods.uid;
// 用别名简化表名
select * from user u left join order_goods o on u.uid = o.uid;

外右连接(right join on)实现多表联合查询:右连接用于查询 包含在右表中的所有记录甚至是左表中没有和它匹配的记录。

右外连接写法:select  表1.字段1,  表1.字段n [as 别名],  表n.字段1 [as 别名],  表n.字段n  from  表1  [表1的别名]  right  join  表n  [表n的别名]  on  查询条件;

// 以右表为准,查询关联结果
select * from user right join order_goods on user.uid = order_goods.uid;
// 用别名简化表名
select * from user u right join order_goods o on u.uid = o.uid;

什么是子查询?

有时候当我们查询的时候,需要的数据源是另外一个select语句的结果,这时就需要使用子查询。用于子查询的关键字包括 in、not in、=、!=、exists、not exists等。

子查询语法:select  字段  from  表名  where  字段  子查询关键字( 查询语句或条件范围 );

// in( 条件范围 )
select * from user where uid in (1,3,5);
// in( select 语句 )
select * from user where uid in (select uid from order_goods);

什么是记录联合?

使用 union 和 union all 关键字,将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示。这两者的主要区别是把结果直接合并在一起,而 union 是将 union all 后的结果进行一次distinct,以去除重复记录后的结果。

记录联合的语法:select语句1  union  [all]  select语句2;

// 对 id 字段进行联合
select uid from user union all select uid from order_goods;
// 去重 联合
select uid from user union select uid from order_goods;


CRUD之“改”

如何对单个表的行数据进行修改?

修改单个表 语法:update  表名  set  字段1=值1,  字段n=值n  where  条件;

// 修改uid=5的用户的用户名和密码
update user set username='李冰冰', password=000 where id=5;

如何同时对多个表的行数据进行修改?

修改多个表 语法:update  表1 [别名],  表n [别名]  set  表1.字段=值,  表n.字段=值  where  条件;

// 同时修改多张表的行记录
update user u, order_goods o set u.username='张三2', u.password=222, o.buytime=333 where u.uid=o.uid;


CRUD之“删”

如何删除单个表的一行或多行记录?

删除 语法:delete  from  表名  where  条件;

delete from user where id=1;    // 删除id=1的这一行
delete from user where id>20;    // 删除多行记录

如何一次性清空单个表中的所有行记录?

清空 方案1:delete  from  表名;

delete  from  user; // 清空所有行
清空 方案2:truncate  table  表名;

truncate  table  user;  // 清空所有行

delete 和 truncate 在清空所有行记录时,有什么区别?

DELETE可以返回被删除的记录数,而TRUNCATE TABLE返回的是0。另外,如果一个表中有自增字段时,使用truncate 清空行记录后,这个自增字段将会被重置为1,而 delete 却不会。

关于删除操作的特别警告:

删除行记录时,一定要记住加上where条件,否则会清空掉整个表的所有行记录。删除重要数据前一定要备份、备份、备份。


DCL语句

如何给数据库用户增加数据库权限?

添加权限 语法:grant  权限  on  库名.表名  to  '用户名'@'主机名'  identified  by  '密码';

// 对geek数据库中的所有表,给eva用户添加了查询权限和写入权限。
grant select, insert on geek.* to 'eva'@'localhost' identified by 'eva123';

如何删除用户对某个数据库的权限?

删除权限 语法:revoke  权限  on  库名.表名  from  '用户名'@'主机名';

// 对geek数据库中的所有表,删除eva用户的查询权限和写入权限。
revoke select, insert on geek.* from 'eva'@'localhost';

MySQL官网


完!!!

你可能感兴趣的:(Web开发|12|MySQL 入门)