MySQL基础(一):数据库本质理解、sql基本规范、基本分类、sql常用关键字、数据类型、正则

本文深入解析SQL语句的常用关键字,包括distinct、limit、orderby、and/or、like、REGEXP等,涵盖数据检索、结果排序、多条件过滤、模糊匹配等功能,并介绍SQL规范及DDL、DML、DCL的基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

负一:数据库本质的理解

零 : sql语句常用关键字说明

0.1 检索不同的行,即:要求查询的数据不同,关键字:distinct

​编辑

0.2 限制结果条数,关键字:limit

0.3 结果排序,关键字 order by

0.4 多条件过滤的连接,关键字:and / or

0.5 模糊匹配,关键字:like,结合通配符:%,_

0.6 正则表达式实现模糊,关键字:REGEXP,结合正则

0.7 sql中实现计算,依据截图的例子,可以实现:+ - * /

0.8 WITH ROLLUP,在group by分组+聚合计算时,使用该关键字,汇总所有分组项的值;

一:sql规范、分类

1.1:DDL:就是对数据库内部的对象进行创建、删除、修改的操作语言

1.2、DML

1.3、DCL 

二、数据类型

2.1 数值类型

2.2 字符串类型

2.3 时间类型


负一:数据库本质的理解

一个数据库,在计算机的硬盘对应一个文件夹;


下面是windows中MySQL安装目录下,对应Data目录

零 : sql语句常用关键字说明

0.1 检索不同的行,即:要求查询的数据不同,关键字:distinct

SELECT DISTINCT vend_id,prod_price FROM products;

值得注意的是distinct 必须直接放在列名的前面,不能用于*,在聚合函数中,distinct只可用于count,格式:count(distinct 列),distinct关键字应用于所有列而不仅是前置它的列。如果给出SELECT DISTINCT vend_id, prod_price,除非指定的两个列都不同,否则所有行都将被检索出来;

 

0.2 限制结果条数,关键字:limit

#从第一行开始,查5行
SELECT DISTINCT vend_id,prod_price FROM products
LIMIT 5;

#从第3行开始,查5行
SELECT DISTINCT vend_id,prod_price FROM products
LIMIT 3,5;

值得注意的是:1.带一个值的LIMIT总是从第一行开始,给出的数为返回的行数;2. 带两个值的LIMIT可以指定从行号为第一个值的位置开始,获取条数为第二个数值;

0.3 结果排序,关键字 order by

SELECT prod_id,prod_price,prod_name 
FROM products
ORDER BY prod_price DESC,prod_name;
#prod_price列指定DESC,对prod_name列不指定。因此,prod_price列以降序排序,而prod_name列(在每个价格内)仍然按标准的升序排序

值得注意的是:根据上面sql, 多个行具有相同的prod_price 值时才对产品按prod_name进行排序。如果prod_price列中所有的值都是唯一的,则不会按prod_name排序;

默认:asc (升序), 可以指定 desc(降序)排序;

limit 和 order by 结合,可以查询某列最大或最小值(如:price);和max,min查询结果一致;

0.4 多条件过滤的连接,关键字:and / or

 值得注意的是:在处理OR操作符前,优先处理AND操作符

0.5 模糊匹配,关键字:like,结合通配符:%,_

0.6 正则表达式实现模糊,关键字:REGEXP,结合正则

#匹配字段prod_name包含1000
SELECT prod_name FROM products WHERE prod_name REGEXP '1000'
ORDER BY prod_name;

#匹配字段prod_name包含000,注意:.是正则表达式语言中一个特殊的字符。它表示匹配任意一个字符
SELECT prod_name FROM products WHERE prod_name REGEXP '.000'
ORDER BY prod_name;

#为搜索两个串之一,使用|
SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000'
ORDER BY prod_name;

#匹配几个字符之一,[123]定义一组字符,它的意思是匹配1或2或3,事实上,正则表达式[123]Ton为[1|2|3]Ton的缩写
SELECT prod_name FROM products WHERE prod_name REGEXP '[123] ton'
ORDER BY prod_name;

#匹配范围:集合可用来定义要匹配的一个或多个字符,可使用-来定义一个范围,如:[a-z]匹配任意字母字符
SELECT prod_name FROM products WHERE prod_name REGEXP '[1-5] ton [a-z]'
ORDER BY prod_name;

[:alnum:]   任意字母和数字(同[a-zA-Z0-9])
[:alpha:]   任意字符(同[a-zA-Z])
[:blank:]   空格和制表(同[\\t])
[:cntrl:]   ASCII控制字符(ASCII 0到31和127)
[:digit:]   任意数字(同[0-9])
[:graph:]   与[:print:]相同,但不包括空格
[:lower:]   任意小写字母(同[a-z])
[:print:]   任意可打印字符
[:punct:]   既不在[:alnum:]又不在[:cntrl:]中的任意字符
[:space:]   包括空格在内的任意空白字符(同[\\f\\n\\r\\t\\v])
[:upper:]   任意大写字母(同[A-Z])
[:xdigit:]  任意十六进制数字(同[a-fA-F0-9])

^           文本的开始
$           文本的结尾
[[:<:]]     词的开始
[[:>:]]     词的结尾

#另一个例子。这次我们打算匹配连在一起的4位数字

SELECT prod_name FROM products
WHERE prod_name REGEXP '[[:lower:]]{4}'
ORDER BY prod_name;
#例如,如果你想找出以一个数(包括以小数点开始的数)开始的所
#有产品,怎么办?简单搜索[0-9\\.](或[[:digit:]\\.])不行,因为
#它将在文本内任意位置查找匹配。解决办法是使用^定位符

SELECT prod_name FROM products WHERE prod_name REGEXP '^[0-9\\.]'
ORDER BY prod_name;

0.7 sql中实现计算,依据截图的例子,可以实现:+ - * /

0.8 WITH ROLLUP,在group by分组+聚合计算时,使用该关键字,汇总所有分组项的值;

一:sql规范、分类

1.SQL语句不区分大小写;建议命令大写,表名库名小写;但字符串常量区分大小写,

课外知识:select now():查询出当前时间:格式:2019-04-27 10:18:10

2.SQL语句可单行或多行书写,已“;”结尾。关键字不可跨多行或简写;

3.用空格或者缩进来提高语句的可读性,子句通常位于独立行,便于编辑,提高可读性;

例如:

4.注释:单行注释:--

              多行注释:/*……*/

5.DDL,DML,DCL;(定义语言,操作语言、控制语言)这三部分共同构成了sql语言;

# 1. 数据库登录:全命令
mysql -h 127.0.0.1 -P 3306 -uroot -p123456
-h 服务器IP
-P 端口号 3306
-u 登录用户名
-p 密码

# 2. 退出
quit;  或者  exit;


# 3. sql: DDL,DML,DCL  # 定义语言,操作语言,控制语言

创建数据库:
create database [if not exists] db_name [character set xxx];
# character set gbk / utf8 编码方式;
查看数据库:
show databases; 查看所有数据库
show create database db_name; 查看数据库的创建方式

修改数据库:
alter database db_name [character set xxx];

删除数据库:
drop database [if exists] db_name;

使用数据库:
use db_name; 切换数据库;-注意:进入到某个数据库后没有办法再退回之前的状态,但可以通过use进行切换;
查看当前使用的数据库 select database();

1.1:DDL:就是对数据库内部的对象进行创建、删除、修改的操作语言

1.创建数据库:

CREATE DATABASE dbname;

2. 查看已有数据库:show databases,

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| cluster |
| mysql |
| test |
| test1 |
+--------------------+
5 rows in set (0.00 sec)

还有另外 4 个数据库,它们都是安装
MySQL 时系统自动创建的,其各自功能如下。
 information_schema:主要存储了系统中的一些数据库对象信息。比如用户表信息、列信
息、权限信息、字符集信息、分区信息等。
 cluster:存储了系统的集群信息。
 mysql:存储了系统的用户权限信息。
 test:系统自动创建的测试数据库,任何用户都可以使用

show tables;


desc employee;


show CREATE table employee;


CREATE TABLE `employee` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `gender` tinyint(1) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `department` varchar(255) DEFAULT NULL,
  `salary` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;




drop table emp;

alter table employee add is_married TINYINT(1);

alter table employee add entry_date DATE NOT NULL;
desc employee;

# 添加字段
alter table employee add a int(100),add b VARCHAR(200);


# 删除字段
alter table employee drop a;
alter table employee drop a, drop b;

# 修改字段类型

alter table employee modify age smallint not null default 18;

alter table employee modify age smallint not null default 18 after id;# after 在什么之后


# 修改字段名称
alter table employee change department depart VARCHAR(20) AFTER salary;

3.在查看了系统中已有的数据库后,可以用如下命令选择要操作的数据库:

USE dbname;

4.删除数据库:

drop database dbname;

5.创建表

CREATE TABLE tablename (column_name_1  column_type_1  constraints,
column_name_2  column_type_2  constraints , ……column_name_n  column_type_n
constraints);

因为 MySQL 的表名是以目录的形式存在于磁盘上,所以表名的字符可以用任何目录名允许的字符。

column_name 是列的名字,column_type 是列的数据类型,contraints 是这个列的约束条件‘;

例如,创建一个名称为 emp 的表。表中包括 3 个字段,ename(姓名),hiredate(雇用日期)、
sal(薪水),字段类型分别为 varchar(10)、date、int(2);

mysql> create table emp(ename varchar(10),hiredate date,sal decimal(10,2),deptno int(2));

6.删除表:

DROP TABLE tablename;

7.修改表:

(1)修改字段:ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST | AFTER col_name];

如:修改表 emp 的 ename 字段定义,将 varchar(10)改为 varchar(20):
mysql> alter table emp modify ename varchar(20);

(2)新增字段:ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST | AFTER col_name]

例如,表 emp 上新增加字段 age,类型为 int(3):
mysql> alter table emp add column age int(3);

(3)删除表字段:ALTER TABLE tablename DROP [COLUMN] col_name

例如,将字段 age 删除掉:
mysql> alter table emp drop column age;

(4)字段改名,语法如下:

ALTER TABLE tablename CHANGE [COLUMN] old_col_name column_definition [FIRST|AFTER col_name]

例如,将 age 改名为 age1,同时修改字段类型为 int(4):
mysql> alter table emp change age age1 int(4) ;

(5)修改表名,语法如下:

ALTER TABLE tablename RENAME [TO] new_tablename

例如,将表 emp 改名为 emp1,命令如下:
mysql> alter table emp rename emp1;

1.2、DML

主要包括表记录的插入(insert)、更新(update)、删除(delete)和查询(select),是开发人员日常使用最频繁的操作;

查询:子查询:

select * from emp where deptno in(select deptno from dept);

如果子查询记录数唯一,还可以用=代替 in

mysql> select * from emp where deptno = (select deptno from dept);

某些情况下,子查询可以转化为表连接,例如:

mysql> select emp.* from emp ,dept where emp.deptno=dept.deptno;

1.3、DCL 

DCL 语句主要是 DBA 用来管理系统中的对象权限时所使用,一般的开发人员很少使用。

二、数据类型

2.1 数值类型

2.2 字符串类型

2.3 时间类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷凝娇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值