MySQL基本语句
SQL是Structure Query language(结构化查询语言)的缩写,它是使用关系模型的数据库应用语言。在众多开源数据库中,MySQL正是其中最杰出的代表,MySQL是由三个瑞典人于20世纪90年代开发的一个关系型数据库。并用了创始人之一Michael Widenius女儿的名字My命名,这就是MySQL的由来,本次博客使用的是开源数据库MySQL,版本5.7.19,下面就开始吧!
SQL分类
1.数据定义语句(Data Definition Language,DDL):主要是用来定义数据库、表、列等对象;
2.数据操作语句(Data Manipulation language,DML):用来添加、更新、删除和查询数据库记录,并检查数据完整性;
3.数据控制语句(Data Control language,DCL):定义了数据库、表、用户的访问权限和安全级别等;
DDL语句
1.创建数据库
语法:create database dbname;
举例:
mysql> create database test;
Query OK, 1 row affected (0.01 sec)
查看当前系统中有哪些数据库:
复制代码
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
复制代码
选择要操作的数据库:
mysql> use test
Database changed
查看数据库中所创建的表:
View Code
2.删除数据库
语法:drop database dbname;
举例:
mysql> drop database test;
Query OK, 0 rows affected (0.00 sec)
注意:删除数据库后,数据库下面的所有的的表就被清空了,再删除之前记得备份有用的数据。
3.创建表
create table tablename(
column_name_1 column_type_1 constraints,
column_name_2 column_type_2 constraints,
...
column_name_2 column_type_2 constraints,
);
举例:
mysql> create table emp(name varchar(10),hiredate date,sal decimal(10,2),dept int(2));
Query OK, 0 rows affected (0.04 sec)
查看表:
语法:desc tablename
举例:
复制代码
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| name | varchar(10) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| dept | int(2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
复制代码
查看表的详细信息:
复制代码
mysql> show create table emp \G;
*************************** 1. row ***************************
Table: emp
Create Table: CREATE TABLE emp
(
name
varchar(10) DEFAULT NULL,
hiredate
date DEFAULT NULL,
sal
decimal(10,2) DEFAULT NULL,
dept
int(2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
ERROR:
No query specified
复制代码
4.删除表
语法:drop table tablename
举例:
mysql> drop table emp;
Query OK, 0 rows affected (0.01 sec)
5.修改表
(1)修改表类型:
语法:alter table tablename modify column_name column_type_new
举例:
View Code
(2)增加表字段:
语法:alter table tablename add column column_name column_type;
举例:
复制代码
mysql> alter table emp add column age int(3);
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| dep | int(2) | YES | | NULL | |
| age | int(3) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
复制代码
(3)删除表字段:
alter table tablename drop column column_name
举例:
复制代码
mysql> alter table emp drop column age;
Query OK, 0 rows affected (0.17 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| dep | int(2) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
复制代码
(4)字段改名
语法:alter table tablename change old_column_name new_column_name column_type
举例:
复制代码
mysql> alter table emp change dep dept int(3);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| dept | int(3) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
复制代码
change和midify都可以修改表,change可以修改列的名称和重新定义列的类型,modify却不能修改列的名称。
(5)修改字段排列的顺序
语法:alter table tablename change/add/modify column_name column_type first/after column_name
举例:
复制代码
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| dept | int(3) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql>
mysql>
mysql> alter table emp add column age int(2) after name;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| age | int(2) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| dept | int(3) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
复制代码
(6)修改表名
语法:alter table tablename rename new_tablename
举例:
复制代码
mysql> alter table emp rename emp1;
Query OK, 0 rows affected (0.01 sec)
mysql> desc emp1;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| age | int(2) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| dept | int(3) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
复制代码
DML语句
DML是对数据库中的表的操作,是开发人员最长使用的。
1.插入记录
语法:insert into tablename(column_name1,column_name2,...column_namen) values(value1,value2,...valuen);
举例:
复制代码
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| age | int(2) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | decimal(10,2) | YES | | NULL | |
| dept | int(3) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> insert into emp(name,age,hiredate,sal,dept) values('frank',22,'2017-09-15','10000',1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into emp values('rose',21,'2017-09-15','10000',1); #也可以不指定字段名称,但是后面的顺序必须和字段保持一致
Query OK, 1 row affected (0.00 sec)
mysql> insert into emp values('jeff',23,'2017-09-15','10000',2),('mei',21,'2017-09-15','8000',3); #可以同时插入多条记录
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> insert into emp(name,sal) values('lisa','1000'); #没写的字段默认为NULL
Query OK, 1 row affected (0.00 sec)
复制代码
查看表emp:
复制代码
mysql> select * from emp;
+-------+------+------------+----------+------+
| name | age | hiredate | sal | dept |
+-------+------+------------+----------+------+
| frank | 22 | 2017-09-15 | 10000.00 | 1 |
| rose | 21 | 2017-09-15 | 10000.00 | 1 |
| jeff | 23 | 2017-09-15 | 10000.00 | 2 |
| mei | 21 | 2017-09-15 | 8000.00 | 3 |
| lisa | NULL | NULL | 1000.00 | NULL |
+-------+------+------------+----------+------+
5 rows in set (0.00 sec)
复制代码
2.更新记录
(1)更新单个表
语法:update tablename set column_name1=value1,column_name2=value2,...column_namen=valuen [where condition]
举例:
复制代码
mysql> select * from emp;
+-------+------+------------+----------+------+
| name | age | hiredate | sal | dept |
+-------+------+------------+----------+------+
| frank | 22 | 2017-09-15 | 10000.00 | 1 |
| rose | 21 | 2017-09-15 | 10000.00 | 1 |
| jeff | 23 | 2017-09-15 | 10000.00 | 2 |
| mei | 21 | 2017-09-15 | 8000.00 | 3 |
+-------+------+------------+----------+------+
4 rows in set (0.00 sec)
mysql> update emp set sal='4000' where name='rose';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from emp;
+-------+------+------------+----------+------+
| name | age | hiredate | sal | dept |
+-------+------+------------+----------+------+
| frank | 22 | 2017-09-15 | 10000.00 | 1 |
| rose | 21 | 2017-09-15 | 4000.00 | 1 |
| jeff | 23 | 2017-09-15 | 10000.00 | 2 |
| mei | 21 | 2017-09-15 | 8000.00 | 3 |
+-------+------+------------+----------+------+
4 rows in set (0.00 sec)
复制代码
在MySQL中update可以同时更新多个表中数据:
语法:update tablename1 alias1 ,table2 alias2 set update_condition where condition
举例:
View Code
3.删除记录
语法:delete from tablename [where condition];
举例:
View Code
也可以同时删除多个表的记录:
语法:delete alias1,alias2 from tablename1 alias1,tablename2 alias2 where condition;
举例:
View Code
4.查询记录
语法:select * from tablename [where condition]; #*表示把所有的记录都拿出来
举例:
复制代码
mysql> select * from emp;
+-------+------+------------+---------+------+
| name | age | hiredate | sal | dept |
+-------+------+------------+---------+------+
| rose | 22 | 2017-09-12 | 1000.00 | 1 |
| jeff | 23 | 2017-09-12 | 2000.00 | 1 |
| frank | 23 | 2017-09-15 | 2000.00 | 2 |
| bob | 24 | 2017-02-15 | 3000.00 | 3 |
+-------+------+------------+---------+------+
4 rows in set (0.00 sec)
复制代码
(1)查询指定字段:
复制代码
mysql> select name,age from emp;
+-------+------+
| name | age |
+-------+------+
| rose | 22 |
| jeff | 23 |
| frank | 23 |
| bob | 24 |
+-------+------+
4 rows in set (0.00 sec)
复制代码
(2)查询不重复的记录:
添加关键字distinct
复制代码
mysql> select age from emp;
+------+
| age |
+------+
| 22 |
| 23 |
| 23 |
| 24 |
+------+
4 rows in set (0.00 sec)
mysql> select distinct age from emp;
+------+
| age |
+------+
| 22 |
| 23 |
| 24 |
+------+
3 rows in set (0.00 sec)
复制代码
(2)条件查询
复制代码
mysql> select name,age from emp where age > 23;
+------+------+
| name | age |
+------+------+
| bob | 24 |
+------+------+
1 row in set (0.00 sec)
复制代码
(4)排序和限制
desc和asc是排序的关键字,desc表示按照字段继续降序排序,asc则表示按照字段升序排序,默认是升序。order by后面可以跟着对个排序字段。
举例:
复制代码
mysql> select * from emp order by sal; #默认是升序
+-------+------+------------+---------+------+
| name | age | hiredate | sal | dept |
+-------+------+------------+---------+------+
| rose | 22 | 2017-09-12 | 1000.00 | 1 |
| jeff | 23 | 2017-09-12 | 2000.00 | 1 |
| frank | 23 | 2017-09-15 | 2000.00 | 2 |
| bob | 24 | 2017-02-15 | 3000.00 | 3 |
+-------+------+------------+---------+------+
4 rows in set (0.00 sec)
mysql> select * from emp order by sal desc; #使用降序
+-------+------+------------+---------+------+
| name | age | hiredate | sal | dept |
+-------+------+------------+---------+------+
| bob | 24 | 2017-02-15 | 3000.00 | 3 |
| jeff | 23 | 2017-09-12 | 2000.00 | 1 |
| frank | 23 | 2017-09-15 | 2000.00 | 2 |
| rose | 22 | 2017-09-12 | 1000.00 | 1 |
+-------+------+------------+---------+------+
4 rows in set (0.00 sec)
复制代码
如果对排序之后只想显示其中的一部分,可以使用limit关键字,order by和llimit经常一起配合使用来进行记录的分页显示。
复制代码
mysql> select * from emp order by sal desc limit 2;
+------+------+------------+---------+------+
| name | age | hiredate | sal | dept |
+------+------+------------+---------+------+
| bob | 24 | 2017-02-15 | 3000.00 | 3 |
| jeff | 23 | 2017-09-12 | 2000.00 | 1 |
+------+------+------------+---------+------+
2 rows in set (0.00 sec)
复制代码
(5)聚合
语法:select [column_name1,colun_name2,...] fun_name from tablename [where condition] [group by column_name1,colun_name2,...[with rollup] [having where condition]]
fun_name:表示聚合操作,也就是聚合函数,常用的有sum(求和),count(计数),max(最大值),min(最小值)
group by:要进行分类聚合的字段
with rollup:表明是否对分类聚合后的结果进行再汇总
having:表示对分类后的结果再进行过滤
举例:
View Code
(6)表连接
内连接:选出两张表中互相匹配的记录
复制代码
mysql> select name,dept from emp,dep where emp.dept=dep.depno;
+------+------+
| name | dept |
+------+------+
| bob | 3 |
+------+------+
1 row in set (0.00 sec)
复制代码
外连接:左连接和右连接,外连接会选出其他不匹配的记录。
左连接:
View Code
右连接:
View Code
(7)子查询
子查询的关键字:in、not in、=、!=、exists、not exists;
复制代码
mysql> select * from emp where dept in (select depno from dep);
+------+------+------------+---------+------+
| name | age | hiredate | sal | dept |
+------+------+------------+---------+------+
| bob | 24 | 2017-02-15 | 3000.00 | 3 |
+------+------+------------+---------+------+
1 row in set (0.00 sec)
复制代码
(8)联合
关键字:union和union all,union去会对结果去重。
举例:
View Code
DCL语句
DCL语句一般是数据库管理员用来对对象进行授权使用的,一般开发人员是很少用的,这里先做简单的介绍,后面的博客会更新相关内容:
创建用户:
mysql> create user 'frank'@'%' identified by '123';
Query OK, 0 rows affected (0.00 sec)
授权:
mysql> grant all privileges on test.* to 'frank'@'%' identified by '123';
Query OK, 0 rows affected, 1 warning (0.00 sec)
退出root登录frank:
View Code
帮助使用
查看所有可供查询的分类:
View Code
快速查找:
举例:查找create table怎么使用?
复制代码
mysql> ? create table
Name: 'CREATE TABLE'
Description:
Syntax:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[partition_options]
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
[table_options]
[partition_options]
[IGNORE | REPLACE]
[AS] query_expression
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
{ LIKE old_tbl_name | (LIKE old_tbl_name) }
......(略)
复制代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?