MySQL数据库增删改查常用语句详解

一 MySQL数据库表结构

数据以表格的形式出现,每行为单独的一条记录,每列为一个单独的字段,许多的记录和字段组成一张表单(table)若干的表单组成(database)。

1.1 常见数据类型

字符串类型(CHAR(O-255固定长度)
VARCHAR(O-255可变长度))
数值类型(INT(整数型)、FLOAT(浮点型))
日期和时间类型(DATE(年月日)、TIME(时分秒))

1.2 常用约束类型

约束是一种限制,它通过对表的行或到的数据做出限制,来确保表的数据的完整性、唯一性。

主键约束 primary key:
主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也
不允许出现空值。每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别创建。当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。

外键约束foreign key:
外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的
两个字段或是两个表的两个字段之间的参照关系。

唯一约束unique:
唯一约束是指定table的列或列组合不能重复,保证数据的唯一性。唯一约束不允许出现重复的值,但是可以为多个null。同一个表可以有多个唯一约束,多个列组合的约束。在创建唯一约束时,如果不给唯一约束名称,就默认和列名相同。唯一约束不仅可以在一个表内创建,而且可以同时多表创建组合唯一约束。

非空约束not null与默认值default:
非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。Null类型特征:所有的类型的值都可以是null,包括int、float等数据类型。

1.3 MySQL存储引擎

存储引擎就是存储数据,建立索引,更新查询数据等等技术的实现方式。存储引擎是基于表的,而不是基于库的。所以存储引擎也可被称为表类型。Oracle,SqlServer等数据库只有一种存储引擎。MySQL提供了插件式的存储引擎架构。所以MySQL存在多种存储引擎,可以根据需要使用相应引擎,或者编写存储引擎。

MYISAM: 默认引擎、插入和查询速度较快,支持全文索引,不支持事务、行级锁和外键约束等功能。
INNODB: 支持事务、行级锁和外键约束等功能。
MEMORY: 工作在内存中,通过散列字段保存数据,速度快、不能永久保存数据。

二 DDL语句:数据定义语句

2.1 修改数据库密码

MySQL登录及退出命令:
设置密码: mysqladmin -uroot password’123’

登录:mysql -u用户名 -p密码 -P端口 -S套接字文件
-p 用户密码.
-h 登陆位置(主机名或ip地址)
-P 端口号(3306改了就不是了)
-S 套接字文件(/var/lib/mysql/mysql.sock)
退出命令:exit或ctrl+d

2.1.1 创建登录用户

mysql>create user zhangsan@'%'identified by'123';
%:指任意的远程终端

2.1.2 给用户授权登录

GRANT all ON *.* TO 'zhangsan'@'192.168.1.149' IDENTIFIED BY '123';

2.1.3 测试用户登录

mysql -uzhangsan -p123 -h 192.168.1.149

2.1.4 修改用户自身密码

mysql>set password=password ('123456') ;

2.1.5 root用户更改其他用户密码

mysql>set password for zhangsan'%'=password('123123');

2.1.6 root找回密码及修改

关闭数据库,修改主配置文件(/etc/my.cnf)添加: skip-grant-tables
systemctl stop mysqld 
#vim /etc/my.cnf
skip-grant-tables

启动数据库,空密码登录并修改密码
systemctl start mysqld
update mysql.user set password=password(‘新密码’) where user='root';
或者 update mysql.user set authentication_string=password('123') where user='root';  ###centos7
删除skip-grant-tables,重启数据库验证新密码

2.2 查看数据库结构

show databases;

2.3 创建和删除数据库

create database auth;
drop database auth;

2.4 使用数据库

use auth;

2.5 查看表

mysql> show tables;
+----------------+
| Tables_in_auth |
+----------------+
| users          |
+----------------+

2.6 查看数据表的结构

mysql> describe users;
+-------------+----------+------+-----+---------+-------+
| Field       | Type     | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+-------+
| user_name   | char(16) | NO   | PRI | NULL    |       |
| user_passwd | char(48) | YES  |     |         |       |
+-------------+----------+------+-----+---------+-------+

2.7 修改数据表的名称

Mysql>alter table a2 rename a1; 

2.8 修改数据表的字段类型

Mysql>describe a1; 
Mysql>alter table a1 modify name char(50); 
Mysql>describe a1;

2.9 修改数据表的字段属性

例:把info表的score字段改为score,5位有效数字,非空

alter table info change score score decimal(5,2) not null;

2.10 添加和删除字段

Mysql>describe a1;
Mysql>alter table a1 add time datetime; 
Mysql>alter table a1 drop birthday; 

三 DML语句:数据管理语句

对表中数据进行管理

3.1 INSERT插入新数据

insert into users(user_name,user_passwd) values('peiqi',password('250'));
insert into users(user_name,user_passwd) values('qiaozhi','250');
insert into users values('hapi',password('360'));

3.2 UPDATE更新表中原有数据

update users set user_passwd=password('250') where user_name='qiaozhi';
update users set user_name='peihua' where user_name='qiaozhi';

直接修改数据库来实现数据库管理员密码的修改

update mysql.user set authentication_string=password('123') where user_name='root';

3.3 DELETE删除不需要的数据

DELETE删除不需要的数据
delete from users where user_name='hapi';
删除系统用户
delete from mysql.user where user='yiqi';
删除表中所有记录
delete from auth.users;

四 DQL语句:数据查询语句

4.1 基础查询语句

select * from auth.users where user_name='peiqi';		#查询用户名为佩奇的所有记录信息
select user_passwd from auth.users where user_name='peiqi';	#查询用户名为佩奇的密码信息

4.2 进阶查询语句

4.2.1准备工作:创建数据库player,表player

create database player;
use player;
create table player (id int(4) not null,name varchar(10) not null,level int(3) not null,primary key (`id`));
insert into player (id,name,level) values ('30','抢宝真多呀',47);
insert into player (id,name,level) values ('15','新五皇·白胡子',46);
insert into player (id,name,level) values ('63','新五皇–敬神',46);
insert into player (id,name,level) values ('199','D 丶狙击王',46);
insert into player (id,name,level) values ('298','唐三',46);
insert into player (id,name,level) values ('51','新五皇·暴雪',45);
insert into player (id,name,level) values ('272','D 丶抢人头辅助',45);

4.2.2 按等级降序查询level大于45的记录

mysql> select id,name,level from player where level>=45 order by level desc;
+-----+----------------------+-------+
| id  | name                 | level |
+-----+----------------------+-------+
|  30 | 抢宝真多呀             |    47 |
|  15 | 新五皇·白胡子          |    46 |
|  63 | 新五皇–敬神            |    46 |
| 199 | D 丶狙击王            |    46 |
| 298 | 唐三                 |    46 |
|  51 | 新五皇·暴雪           |    45 |
| 272 | D 丶抢人头辅助        |    45 |
+-----+----------------------+-------+
7 rows in set (0.00 sec)

4.2.3 ORDER BY 语句多字段排序

查询等级在 45 级及以上的用户,并以 level 降序排列和 id 降序排列。

mysql> select id,name,level from player where level>=45 order by level desc,id desc;
+-----+----------------------+-------+
| id  | name                 | level |
+-----+----------------------+-------+
|  30 | 抢宝真多呀           |    47 |
| 298 | 唐三                 |    46 |
| 199 | D 丶狙击王           |    46 |
|  63 | 新五皇–敬神          |    46 |
|  15 | 新五皇·白胡子        |    46 |
| 272 | D 丶抢人头辅助       |    45 |
|  51 | 新五皇·暴雪          |    45 |
+-----+----------------------+-------+
7 rows in set (0.00 sec)

注意!
ORDER BY 后面跟多个字段时,字段之间使用英文逗号隔开,
优先级是按先后顺序而定。下面以A和B分别表示两个字段。
ORDER BY A,B desc 指A用升序,B用降序;
ORDER BY A asc,B desc 指A用升序,B用降序;
ORDER BY A desc,B desc 指A用降序,B用降序;

4.2.4 GROUP BY语句

通过 SQL 查询出来的结果,还可以对其进行分组,使用 GROUP BY 语句来实现。
GROUP BY 从字面上看,是以 BY 后面的内容对查询出的数据进行分组,就是将一个“数据集”
划分成若干个“小区域”,然后针对这些个“小区域”进行数据处理。
GROUP BY通常都是结合聚合函数一起使用的,常用的聚合函数包括:
计数(COUNT)、求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN),
这些聚合函数的用法在后面函数小节会有更详细的讲解。GROUP BY 分组的时候可以按一个或多个字段对结果进行分组处理。

mysql> select count(name),level from player where level>=45 group by level;
+-------------+-------+
| count(name) | level |
+-------------+-------+
|           2 |    45 |
|           4 |    46 |
|           1 |    47 |
+-------------+-------+
3 rows in set (0.00 sec)
mysql> select count(name),level from player where level>=45 group by name;
+-------------+-------+
| count(name) | level |
+-------------+-------+
|           1 |    45 |
|           1 |    46 |
|           1 |    46 |
|           1 |    47 |
|           1 |    45 |
|           1 |    46 |
|           1 |    46 |
+-------------+-------+
7 rows in set (0.00 sec)

4.2.5 限制结果条目

LIMIT 的第一个参数是位置偏移量(可选参数),是设置 MySQL 从哪一行开始显示。
如果不设定第一个参数,将会从表中的第一条记录开始显示。需要注意的是,
第一条记录的位置偏移量是 0,第二条是 1,以此类推。第二个参数是设置返回记录行的最大数目。
插入新的字段

insert into player (id,name,level) values ('1','修欧拉卡',10);
insert into player (id,name,level) values ('2','起风了',10);
insert into player (id,name,level) values ('3','吊打低V',15);
insert into player (id,name,level) values ('4','小花',14);
insert into player (id,name,level) values ('5','小舞',35);
mysql> select id,name,level from player limit 3;
+----+--------------+-------+
| id | name         | level |
+----+--------------+-------+
|  1 | 修欧拉卡     |    10 |
|  2 | 起风了       |    10 |
|  3 | 吊打低V      |    15 |
+----+--------------+-------+
3 rows in set (0.00 sec)

LIMIT 子句的使用也可以结合 ORDER BY:先进行排序,然后再LIMIT限制固定的记录。
也就是说LIMIT是放在最后的,将处理好的结果集按要求选出几行来。
例如,将查询记录按等级 level 降序排列,只取前三条记录。

mysql> select id,name,level from player order by level desc limit 3;
+----+----------------------+-------+
| id | name                 | level |
+----+----------------------+-------+
| 30 | 抢宝真多呀           |    47 |
| 15 | 新五皇·白胡子        |    46 |
| 63 | 新五皇–敬神          |    46 |
+----+----------------------+-------+
3 rows in set (0.00 sec)

在显示结果的时候也可以不从第一行开始,引入 offset 参数。
例如,执行以下操作即可从第 3 条记录开始显示之后的 3 条数据。

mysql> select id,name,level from player limit 2,3;
+----+------------+-------+
| id | name       | level |
+----+------------+-------+
|  3 | 吊打低V    |    15 |
|  4 | 小花       |    14 |
|  5 | 小舞       |    35 |
+----+------------+-------+
3 rows in set (0.00 sec)

4.2.6 设置别名

在MySQL查询时,当表的名字比较长或者表内某些字段比较长时,为了方便书写或者多次使用相同的表,可以给字段列或表设置别名。使用的时候直接使用别名,简洁明了,增强可读性。设置别名使用AS语句。
在使用 AS 后,可以用 alias_name 代替 table_name,其中 AS 语句是可选的。AS之后的别名,主要是为表内的列或者表提供临时的名称,在查询过程中使用,库内实际的表名或字段名是不会被改变的。
例如,在统计表内所有记录共有多少条时,使用 count(*), 这么写不便于识别,可以将其别名设置为 number。

mysql> select count(*) as number from player;
+--------+
| number |
+--------+
|     12 |
+--------+
1 row in set (0.00 sec)

mysql> select count(*) number from player;		#省略as是一样的结果
+--------+
| number |
+--------+
|     12 |
+--------+
1 row in set (0.00 sec)

此外,AS还可以作为连接语句的操作符。例如,执行以下操作即可实现用一条 SQL语句完成在创建表tmp的时候将player表内的数据写入 tmp 表。

mysql> create table tmp as select * from player;
Query OK, 12 rows affected (0.02 sec)
Records: 12  Duplicates: 0  Warnings: 0

mysql> select count(*) from tmp;
+----------+
| count(*) |
+----------+
|       12 |
+----------+
1 row in set (0.00 sec)

4.2.7 通配符

通配符主要用于替换字符串中的部分字符,通过部分字符的匹配将相关结果查询出来。
通常通配符都是跟 LIKE 一起使用的,并协同WHERE子句共同来完成查询任务。
常用的通配符有两个,分别是:
%:百分号表示零个、一个或多个字符
_:下划线表示单个字符

mysql> select id,name,level from player where name like 's%';		##name 字段以 s 开头的记录
+------+--------------+-------+
| id   | name         | level |
+------+--------------+-------+
|  238 | sagou 轰总   |     7 |
|  795 | senoku       |    15 |
| 2460 | shirley      |     1 |
+------+--------------+-------+
3 rows in set (0.00 sec)
mysql> select id,name,level from player where name like '_uess';	#替换开头的一个字符
+-----+-------+-------+
| id  | name  | level |
+-----+-------+-------+
| 713 | guess |    25 |
+-----+-------+-------+
1 row in set (0.00 sec)

mysql> select id,name,level from player where name like 'use____';		#替换结尾的四个字符
+-----+---------+-------+
| id  | name    | level |
+-----+---------+-------+
| 448 | useless |     1 |
+-----+---------+-------+
1 row in set (0.00 sec)

4.2.8 子查询

子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语句子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一步的查询过滤。子查询不仅可以在 SELECT 语句中使用,在 INERT、UPDATE、DELETE中也同样适用。在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套。

mysql>  select name,level from player where id in (select id from player where level>=45);
+----------------------+-------+
| name                 | level |
+----------------------+-------+
| 新五皇·白胡子        |    46 |
| 抢宝真多呀           |    47 |
| 新五皇·暴雪          |    45 |
| 新五皇–敬神          |    46 |
| D 丶狙击王           |    46 |
| D 丶抢人头辅助       |    45 |
| 唐三                 |    46 |
+----------------------+-------+

五 DCL语句:设置用户权限

GRANT 权限列表 ON 数据库名.表名 TO 用户名@来源地址 IDENTIFIED BY ‘密码’

mysql> GRANT all ON *.* TO 'root'@'%' IDENTIFIED BY '123';

mysql> GRANT all ON *.* TO 'root'@'localhost' IDENTIFIED BY '123';

flush privileges;		#刷新

用户不存在时新建用户

grant select on auth.* to 'yiqi'@'localhost' identified by '123';	#只授予查询权限

撤销用户的权限

revoke all on auth.* from 'yiqi'@'20.0.0.1';

查看用户权限

show grants for 'yiqi'@'20.0.0.1';

清空表数据

truncate table tmp;

在已有表中添加字段

alter table users add wocao  varchar(50) not null;

远程登录其他用户的数据库

mysql -ulph -p123 -h192.168.1.60

六 临时表

CREATE TEMPORARY TABLE `mytmp` (`id` int(10) NOT NULL AUTO_INCREMENT,`NAME` varchar(32) CHARACTER SET utf8 COLLATE utF8_bin NOT
NULL, `level` int(10) NOT NULL,PRIMARY KEY (id) ) ENGINE InnoDB DEFAULT CHARSET=utf8;

七 克隆表

7.1 方法一:通过like方法,复制ky表生成test表

方法一:
mysql> create table test like ky;             
Query OK, 0 rows affected (0.01 sec)

mysql> show create table ky\G
*************************** 1. row ***************************
       Table: ky
Create Table: CREATE TABLE "ky" (
  "user_name" char(16) NOT NULL,
  "user_passwd" char(48) DEFAULT '',
  PRIMARY KEY ("user_name")
) ENGINE=InnoDB DEFAULT CHARSET=utf8

mysql> select * from ky;           ##like方法复制表结构,不复制数据
Empty set (0.00 sec)

mysql> insert into test select * from users;      ##将ky表的数据写入test表
Query OK, 7 rows affected (0.00 sec)
Records: 7  Duplicates: 0  Warnings: 0

7.2 方法二:通过创建表的方法克隆表

mysql> show create table ky\G         #获取源表结构,,索引等信息
*************************** 1. row ***************************
       Table: ky
Create Table: CREATE TABLE "ky" (
  "user_name" char(16) NOT NULL,
  "user_passwd" char(48) DEFAULT '',
  "level" char(16) NOT NULL,
  PRIMARY KEY ("user_name")
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)


CREATE TABLE "test3" (
  "user_name" char(16) NOT NULL,
  "user_passwd" char(48) DEFAULT '',
  "level" char(16) NOT NULL,
  PRIMARY KEY ("user_name")
) ENGINE=InnoDB DEFAULT CHARSET=utf8;         #改名后创建与源表一样的表结构


mysql> insert into test3 select * from ky;                          #导入源表数据
Query OK, 7 rows affected (0.00 sec)
Records: 7  Duplicates: 0  Warnings: 0

mysql> select * from test3;                                                 #查看新创建表的数据
+-----------+-------------------------------------------+-------+
| user_name | user_passwd                               | level |
+-----------+-------------------------------------------+-------+
| lisi      | *6691484EA6B50DDDE1926A220DA01FA9E575C18A | 10    |
| lisi1     | *6691484EA6B50DDDE1926A220DA01FA9E575C18A | 10    |
| lisi2     | *6691484EA6B50DDDE1926A220DA01FA9E575C18A | 40    |
| lisi3     | *6691484EA6B50DDDE1926A220DA01FA9E575C18A | 50    |
| lisi4     | *6691484EA6B50DDDE1926A220DA01FA9E575C18A | 60    |
| lisi5     | *6691484EA6B50DDDE1926A220DA01FA9E575C18A | 70    |
| lisi6     | *6691484EA6B50DDDE1926A220DA01FA9E575C18A | 80    |
+-----------+-------------------------------------------+-------+
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值