1、mysql 基础命令
命令中大小写不敏感,但是数据库名称的大小写敏感。
1.1 命令格式
js
格式:
mysql [选项] [数据库名]
选项:
选项 | 含义 |
---|---|
-A | --no-auto-rehash 禁止补全 |
-u | --user= 用户名,默认为root |
-h | --host= 服务器主机,默认为localhost |
-p(小) | --passowrd= 用户密码,建议使用-p,默认为空密码 |
-P(大) | --port= 服务器端口 |
-S | --socket= 指定连接socket文件路径 |
-D | --database= 指定默认数据库 |
-C | --compress 启用压缩 |
-e | "SQL" 执行SQL命令 |
-V | --version 显示版本 |
-v | --verbose 显示详细信息 |
--print-defaults | 获取程序默认使用的配置 |
1.2 基础命令
js
mysql -uroot -p //默认空密码登录
show databases; //查看所有数据库
mysql> status //查看数据库的基本状态
mysql> use mysql; //切换数据库,use类似于cd
mysql> select database(); //查看当前数据库
mysql> select user(); //查看当前用户
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
mysql> SELECT User,Host,Password FROM user;
mysql> system clear //清屏
system ifconfig //不退出mysql,可以查看系统的一些信息
1.3 mysqladmin 命令
客户端程序:
工具 | 备注 |
---|---|
mysql | 交互式或非交互式的CLI工具 加-e |
mysqldump | 备份工具。基于mysql协议向mysqld发起查询请求,并将查得的所有数据转换成 |
mysqladmin | 基于mysql协议管理mysqld |
mysql 示例:
js
[root@7-2 ~]# mysql -uroot -pabc123 -e "create database cxk;" //不进入mysql里面
(root@localhost) [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| cxk | //ok
| mysql |
| performance_schema |
+--------------------+
mysqladmin 格式:
js
格式:mysqladmin -u用户 -p密码
[root@7-2 ~]# mysqladmin -uroot -pabc123 ping //测试mysql服务是否正常,如果正常提示mysqld is alive
[root@7-2 ~]# mysqladmin -uroot -pcentos shutdown //关闭mysql服务,但只能关闭,没有开启命令
[root@7-2 ~]# mysqladmin -uroot -pcentos create testdb //创建数据库testdb
[root@7-2 ~]# mysqladmin -uroot -pcentos drop testdb //删除数据库testdb
[root@7-2 ~]# mysqladmin -uroot -pAdmin@123 password 'zhj' //修改root密码
[root@7-2 ~]# mysqladmin -uroot -pcentos flush-logs //日志滚动,生成新文件/var/lib/mysql/mariadb-bin.00000N
小拓展:
js
应用单多线程:
pstree -p
cat /proc/线程id/status
proc 存在内存中
mysql> system hostname
localhost.localdomain
#可以直接使用系统命令
#source 可以调用脚本
mysql> \h, help
mysql> \u,use
mysql> \s,status
mysql> !,system
2、mysql 数据类型
MySQL支持多种内置数据类型:
-
数值类型
-
整数型:int(m) 4个字节 范围(-2147483648~2147483647)
-
小数型
- float 单精度浮点型: 8位精度(4字节) m总个数,d小数位, 注意: 小数点不占用总个数
- double 双精度浮点型:16位精度(8字节) m总个数,d小数位。 注意: 小数点不占用总个数
-
-
字符串(字符)类型
- char :固定长度,最多255个字符,注意不是字节
- varchar :可变长度,最多65535个字符⭐
- text :可变,最多65535个字符
-
日期/时间类型
- year:年份
- date:年月日
- time:时间 时分秒
- datetime:年月日和时分秒
小拓展:文本中,如果超出字段长度限制,会有下面两种情况
- 整个不让录入
- 将超出部分截断
3、mysql 修饰符
作用:修饰数据
适用所有类型的修饰符:
名称 | 含义 |
---|---|
NULL | 数据列可包含NULL值,默认值 |
NOT NULL | *数据列不允许包含NULL值,为必填选项 |
DEFAULT | 默认值 |
PRIMARY KEY | 主键,所有记录中此字段的值不能重复,且不能为NULL,一张表里只能有一个主键 |
UNIQUE KEY | 唯一键,所有记录中此字段的值不能重复,但可以为NULL |
CHARACTER SET | name 指定一个字符集 |
适用数值型的修饰符:
名称 | 作用 |
---|---|
AUTO_INCREMENT | 自动递增,适用于整数类型 |
UNSIGNED | 无符号,把符号去掉 |
4、库|表|字段 增删改查⭐
-
database 数据库
-
table 表
- 字段
-
SQL语句 规范格式:
- SQL语句支持单行或多行书写,默认以 " ; " 结尾
- 客户端命令结尾不加分号
数据库 命名规则:
- 必须以字母开头,后续可以包括字母、数字和3个特殊字符(# _ $)
- 不能使用MySQL的保留字,如table select show databases
js
mysql> help create //help 后面跟上具体命令可以查看帮助
修改默认的字符集:
默认的字符集是拉丁文。
js
MariaDB [DB1]> show create database DB1;
+----------+----------------------------------------------------------------+
| Database | Create Database |
+----------+----------------------------------------------------------------+
| DB1 | CREATE DATABASE `DB1` /*!40100 DEFAULT CHARACTER SET latin1 */ | //拉丁
+----------+----------------------------------------------------------------+
`查看支持哪些字符集:`
MariaDB [DB1]> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
js
`修改字符集:`
[root@7-3 ~]# vim /etc/my.cnf
[mysqld]
character-set-server=utf8mb4 //将字符集由拉丁文,改成utf8
[root@7-3 ~]# systemctl restart mysqld
4.1 database 数据库
4.1.1 create 创建
js
语法格式:
create database 数据库名称; //database后不需要加s
create database DB2; //创建数据库DB2
示例1:
js
create database DB3 character set 'utf8'; //创建DB3,字符集为utf8
MariaDB [DB1]> show create database DB3;
+----------+--------------------------------------------------------------+
| Database | Create Database |
+----------+--------------------------------------------------------------+
| DB3 | CREATE DATABASE `DB3` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------+
示例2:
js
create database IF NOT EXISTS DB1; //如果没有DB1,那么就创建DB1
MariaDB [DB1]> show warnings;
+-------+------+----------------------------------------------+
| Level | Code | Message |
+-------+------+----------------------------------------------+
| Note | 1007 | Can't create database 'DB1'; database exists | //DB1已存在
+-------+------+----------------------------------------------+
4.1.2 drop 删除
js
语法格式:
drop database 数据库名称;
js
[root@localhost mysql]# cd /home/mysql/
#数据库其实 就是一个文件夹,删除数据库等于删除文件夹
示例:
js
drop database DB2; //删除DB2数据库
4.1.3 alter 修改
比如增加或者删除字段。一般不能修改数据库名字!这个命令用的非常非常少!!!
js
help alter database //查看帮助
ALTER DATABASE DB1 character set 'utf8'; //修改字符集
4.2 table 表
表的增删改查,必须要先指定数据库!
库中有表,表中有数据。
table 基础命令:
js
help create table //查看帮助
show tables; //显示当前数据库下的 所有表格
查看表结构:
desc student; //显示当前数据库下的 所有表结构⭐
desc DB1.student; //显示DB2数据库下的 所有表结构
show table status like 'student'\G; //分行显示表状态
unsigned: 取消负数
primary key: 主键
auto_increment: 自增长
enum('M','F'): 多选,枚举值
default 'M':默认值为 M
4.2.1 create 新建表
js
格式:
create table 表名 (字段名1 字段类型 [修饰符],字段名2 字段类型 [修饰符],字段名3 字段类型 [修饰符]); //必须要定义字段类型,否则会报错。修饰符是可选项,可加可不加!
示例1:新建student表
js
create table student (id int primary key,name varchar(10),age char(3));
js
MariaDB [DB1]> desc student; //查看student表结构
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(10) | YES | | NULL | |
| age | char(3) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
示例2:在一行写
js
create table student2 (id int primary key,name varchar(10),age char(3),gender enum('M','F') default 'M'); //gender是性别,enum是枚举类型,只能在M男和F女里面选择,默认是男。
示例3:分成多行写
js
MariaDB [DB1]> create table student3 (
-> id int primary key,
-> name varchar(10),
-> age char(3),
-> gender enum('M','F') default 'M'); //只有出现分号; 才是结束
4.2.2 alter 修改表结构
4.2.2.1 add 添加字段
js
格式:
alter table 表名 add 字段名 字段类型 [修饰符];
示例1:
js
alter table student add phone varchar(11) not null;
4.2.2.2 change 修改字段名
js
alter table student change phone mobile char(11); //将字段名phone改为mobile
4.2.2.3 drop 删除字段
js
alter table student drop mobile;
4.2.2.4 rename 表格重命名
js
alter table student rename s1; //将student表重命名为s1
4.3 字段
4.3.1 insert 插入行记录
功能:一次插入一行或多行数据
js
格式:
insert [into] 表名(字段1,字段2,字段3...) values(值1,值2,值3...) //使用 insert 语句时 into可以省略。
示例1:
js
insert student(name,age,mobile) values('wxy',22,'123456');
MariaDB [DB1]> select * from student;
+----+------+------+--------+
| id | name | age | mobile |
+----+------+------+--------+
| 0 | wxy | 22 | 123456 |
+----+------+------+--------+
示例2:
js
insert student values('2','wjy',32,'654321'); //表名后不加字段,就要按字段顺序一一对应填写信息,id不要忘了写!(注意:字符串要用引号引起来)
MariaDB [DB1]> select * from student;
+----+------+------+--------+
| id | name | age | mobile |
+----+------+------+--------+
| 0 | wxy | 22 | 123456 |
| 2 | wjy | 32 | 654321 |
+----+------+------+--------+
4.3.2 update 更新修改记录
注意:一定要有限制条件,否则将修改所有行的指定字段⭐⭐⭐
js
格式:
update 表名 set 字段名=修改 where 指定条件;
示例1:
js
update student set id=1 where id=2; //当student表中,id=2时,将id改为1
MariaDB [DB1]> select * from student;
+----+------+------+--------+
| id | name | age | mobile |
+----+------+------+--------+
| 0 | wxy | 22 | 123456 |
| 1 | wjy | 32 | 654321 |
+----+------+------+--------+
4.3.3 delete 删除记录
注意:一定要有限制条件,否则将清空表中的所有数据!!! ⭐⭐⭐
删除表中数据,但不会自动缩减数据文件的大小。
js
格式:
delete from 表名 where 指定条件
示例1:
js
MariaDB [DB1]> delete from student where id=0; //删除表中id=0对应的记录
MariaDB [DB1]> select * from student;
+----+------+------+--------+
| id | name | age | mobile |
+----+------+------+--------+
| 1 | wjy | 32 | 654321 |
+----+------+------+--------+
5、select 查询
前期准备:添加脚本
js
[root@7-2 ~]# *****加载sql脚本*****
source /root/hellodb_innodb.sql //运行脚本
show tables;
5.1 基础命令
js
select * from 表名; //查看表中所有内容。生产环境中一定要慎用!!因为数据量太大!!!
`可以与where 搭配使用:`
select * from 表名 where 指定条件;
select name,age from student; //可以指定查看两个字段。中间用逗号隔开
select name as 名字,age as 年龄 from student; //as类似于别名,可以省略不写。
5.2 单表查询
5.2.1 where 过滤查询
js
语法:
select 字段 from 表名 where 条件;
说明:
- 过滤条件:布尔型表达式
- 算术操作符:+, -, *, /, %
- 比较操作符:=,<=>(相等或都为空), <>, !=(非标准SQL), >, >=, <, <=
- 范例查询: BETWEEN min_num AND max_num
- 不连续的查询: IN (element1, element2, ...)
- 空查询: IS NULL, IS NOT NULL
- 字段显示可以使用别名
示例:
js
select * from students where name="xi ren";
5.2.1.1 连续范围查询 between and
从一个范围到另一个范围 BETWEEN min_num AND max_num
示例1:
js
select * from students where classid between 1 and 3; //筛选出班级id为从1到3
5.2.1.2 非连续范围查询 in
不连续的查询 IN (element1, element2, ...)
示例:
js
select * from students where classid in (1,3); //筛选出班级id为 1和3
5.2.1.3 空查询
空查询 IS NULL, IS NOT NULL
示例:
js
select * from students where classid is null;
select * from students where classid is not null;
5.2.2 and且 | or或
js
语法:
SELECT "字段" FROM "表名" WHERE "条件1" AND|OR "条件2";
示例1:
js
select * from students where classid >= 1 and classid <= 3; //classid为1到3的
示例2:
js
select * from students where classid = 1 or classid = 3; //classid为1或3的
5.2.3 distinct 去除重复行
js
格式:
select distinct 字段名 from 表名;
示例1:
js
MariaDB [hellodb]> select distinct gender from students;
+--------+
| gender |
+--------+
| M |
| F |
+--------+
示例2:
js
select distinct classid from students;
5.2.4 like模糊查询 与 通配符
mysql里基本不使用正则表达式。
js
% :百分号表示零个、一个或多个字符
_ :下划线表示单个字符
'A_Z':所有以 'A' 起头,另一个任何值的字符,且以 'Z' 为结尾的字符串。例如,'ABZ' 和 'A2Z' 都符合这一个模式,而 'AKKZ' 并不符合 (因为在 A 和 Z 之间有两个字符,而不是一个字符)。
'ABC%': 所有以 'ABC' 起头的字符串。例如,'ABCD' 和 'ABCABC' 都符合这个模式。
'%XYZ': 所有以 'XYZ' 结尾的字符串。例如,'WXYZ' 和 'ZZXYZ' 都符合这个模式。
'%AN%': 所有含有 'AN'这个模式的字符串。例如,'LOS ANGELES' 和 'SAN FRANCISCO' 都符合这个模式。
'_AN%':所有第二个字母为 'A' 和第三个字母为 'N' 的字符串。例如,'SAN FRANCISCO' 符合这个模式,而 'LOS ANGELES' 则不符合这个模式。
js
语法:
SELECT "字段" FROM "表名" WHERE "字段" LIKE "匹配表达式";
示例:
js
select * from students where name like "xu %"; //名字以xu 开头的
小拓展:复制表结构
js
create table test like students;
5.2.5 聚合函数
函数名 | 函数意 |
---|---|
avg() | 返回指定列的平均值 |
count() | 返回指定列中非 NULL 值的个数 |
min() | 返回指定列的最小值 |
max() | 返回指定列的最大值 |
sum(x) | 返回指定列的所有值之和 |
语法格式:
js
select 函数(*) from 表名; // *代表所有字段
select 函数(单个字段) from 表名;
示例:
js
`avg 平均值:`
select avg(age) from students; //表中所有人年龄的平均值
select avg(age) from students where classid=1; //求1班年龄的平均值
`count 计数:`
select count(age) from students;
`sum 求和:`
select sum(age) from students;
select sum(age) from students where classid = 3;
5.2.6 group by 分组
对GROUP BY后面的字段的查询结果进行汇总分组
js
语法:
SELECT "字段1", 聚合函数("字段2") FROM "表名" GROUP BY "字段1"; //前面有字段1, group by 后面也必须要有字段1
示例1:
js
MariaDB [hellodb]> select gender from students group by gender; //按性别进行分组
+--------+
| gender |
+--------+
| F |
| M |
+--------+
示例2:
js
MariaDB [hellodb]> select gender,count(*) from students group by gender; //按性别分组,并统计个数
+--------+----------+
| gender | count(*) |
+--------+----------+
| F | 10 |
| M | 15 |
+--------+----------+
示例3:
js
select classid,avg(age) from students group by classid;
5.2.7 order by 排序
语法:
js
SELECT "字段" FROM "表名" [WHERE "条件"] ORDER BY "字段" [ASC | DESC];
ASC 是按照升序进行排序的,是默认的排序方式。
DESC 是按降序方式进行排序。
示例1:asc
js
select * from students order by age; //按年龄正序排列,默认是ASC正序
示例2:desc
js
select * from students order by age desc; //按年龄,倒序排列。
5.2.8 limit⭐
示例1:显示前5个
js
select * from students limit 5;
示例2:
js
MariaDB [hellodb]> select * from students order by age desc limit 3; //倒序显示前3个
+-------+-------------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+-------------+-----+--------+---------+-----------+
| 25 | Sun Dasheng | 100 | M | NULL | NULL |
| 3 | Xie Yanke | 53 | M | 2 | 16 |
| 6 | Shi Qing | 46 | M | 5 | NULL |
+-------+-------------+-----+--------+---------+-----------+
示例3:跳过前3个,以第4个为基础,显示5个
js
MariaDB [hellodb]> select * from students limit 3,5;
+-------+-----------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+-----------+-----+--------+---------+-----------+
| 4 | Ding Dian | 32 | M | 4 | 4 |
| 5 | Yu Yutong | 26 | M | 3 | 1 |
| 6 | Shi Qing | 46 | M | 5 | NULL |
| 7 | Xi Ren | 19 | F | 3 | NULL |
| 8 | Lin Daiyu | 17 | F | 7 | NULL |
+-------+-----------+-----+--------+---------+-----------+
5.2.9 having
having 通常与group by组合使用。
having 语句的存在弥补了 WHERE 关键字不能与聚合函数联合使用的不足
示例1:
js
MariaDB [hellodb]> select classid from students group by classid; //根据classid进行排序
+---------+
| classid |
+---------+
| NULL |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
+---------+
MariaDB [hellodb]> select classid from students group by classid having classid > 5; //筛选出classid大于5的,并根据classid进行排序
+---------+
| classid |
+---------+
| 6 |
| 7 |
+---------+
示例2:
js
MariaDB [hellodb]> select age from students group by age having age > 35;
+-----+
| age |
+-----+
| 46 |
| 53 |
| 100 |
+-----+
5.2.10 view 视图(临时表)
视图:数据库中的虚拟表,这张虚拟表中不包含真实数据,只是临时数据。
js
格式:
create view 视图名 as 查询结果
示例1:
js
create view wt as select * from students where age between 20 and 50; //创建wt临时表
select * from wt;
示例2:
js
create view hlm as select * from students where stuid=7 or stuid=8;
MariaDB [hellodb]> select * from hlm;
+-------+-----------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+-----------+-----+--------+---------+-----------+
| 7 | Xi Ren | 19 | F | 3 | NULL |
| 8 | Lin Daiyu | 17 | F | 7 | NULL |
+-------+-----------+-----+--------+---------+-----------+
5.3 多表查询
5.3.1 子查询(嵌套)
示例1:
js
update students set age=(select avg(age) from teachers) where stuid=23; //将23号的年龄修改为 教师表的平均年龄
select * from students where stuid=23; //查看修改后的23号对应的年龄。
示例2:
js
select * from students where age > (select avg(age) from students); //选出比平均年龄大的人
5.3.2 联合查询(纵向合并)
union:表与表之间的字段数量相同,把第二张表追加到后面
示例1:两张表根据对应字段 纵向合并
js
select name,age from students union select name,age from teachers;
示例2:相同的表之间关联,union默认自动去重
js
select * from teachers union select *from teachers;
示例3:union all不去重
js
select * from teachers union all select * from teachers;
5.3.3 交叉连接(横向合并)
cross join: 即多表的记录之间做 笛卡尔乘积组合,并且多个表的列横向合并相加,这个用的比较少
示例:行的数量是两张表数量相乘,列的数量是两张表数量相加。
js
select * from students cross join teachers;
5.3.4 内连接
inner join 内连接取多个表的交集
语法:
js
第一张表 inner join 第二张表 on 条件
示例1:学生表id和教师表id相同的行
js
select * from students inner join teachers on students.stuid =teachers.tid;