【mysql】数据库之SQL查询语句

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支持多种内置数据类型:

  1. 数值类型

    • 整数型:int(m) 4个字节 范围(-2147483648~2147483647)

    • 小数型

      • float 单精度浮点型: 8位精度(4字节) m总个数,d小数位, 注意: 小数点不占用总个数
      • double 双精度浮点型:16位精度(8字节) m总个数,d小数位。 注意: 小数点不占用总个数
  2. 字符串(字符)类型

    • char固定长度,最多255个字符,注意不是字节
    • varchar可变长度,最多65535个字符⭐
    • text :可变,最多65535个字符
  3. 日期/时间类型

    • 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;

6、总结

相关推荐
蓝眸少年CY10 分钟前
MySQL 【流程控制】函数
mysql
荒Huang1 小时前
Linux挖矿病毒(kswapd0进程使cpu爆满)
linux·运维·服务器
Elastic 中国社区官方博客1 小时前
如何将数据从 AWS S3 导入到 Elastic Cloud - 第 3 部分:Elastic S3 连接器
大数据·elasticsearch·搜索引擎·云计算·全文检索·可用性测试·aws
九河云1 小时前
如何选择适合的AWS EC2实例类型
服务器·云计算·aws
掘金-我是哪吒2 小时前
微服务mysql,redis,elasticsearch, kibana,cassandra,mongodb, kafka
redis·mysql·mongodb·elasticsearch·微服务
zmgst3 小时前
canal1.1.7使用canal-adapter进行mysql同步数据
java·数据库·mysql
令狐少侠20113 小时前
explain执行计划分析 ref_
mysql
随心............3 小时前
python操作MySQL以及SQL综合案例
数据库·mysql
hjjdebug3 小时前
linux 下 signal() 函数的用法,信号类型在哪里定义的?
linux·signal
xjjeffery3 小时前
MySQL 基础
数据库·mysql