首页- IT学院- 技术交流
IT学院

技术交流

【MySQL】MySQL基础语句总结

原文:https://blog.csdn.net/weixin_55086330/article/details/115028662

基本介绍

数据库可以持久化数据到本地,结构化查询。


三个基本名词:


DB:数据库,存储数据的容器

DBMS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DB

SQL:结构化查询语言,用于和数据库通信的语言,不是某个数据库软件特有的,而是几乎所有的主流数据库软件通用的语言

数据库存储数据的特点:


数据存放到表中,然后表再放到库中


一个库中可以有多张表,每张表具有唯一的表名用来标识自己


表中有一个或多个列,列又称为“字段”,相当于java中“属性”


表中的每一行数据,相当于java中“对象”


SQL语言的分类


DML(Data Manipulation Language):数据操纵语句,用于添加、删除、修改、查询数据库记录,并检查数据完整性。包括如下SQL语句:


INSERT:添加数据到数据库中。

UPDATE:修改数据库中的数据。

DELETE:删除数据库中的数据。

SELECT:选择(查询)数据。

DDL(Data Definition Language):定义数据库的结构,比如创建、修改或删除数据库对象,包括如下SQL语句:


CREATE TABLE:创建数据库表

ALTER TABLE:更改表结构、添加、删除、修改列长度

DROP TABLE:删除表

CREATE INDEX:在表上建立索引

DROP INDEX:删除索引

DCL(Data Control Language):数据控制语句,用于定义用户的访问权限和安全级别。包括如下SQL语句:


GRANT:授予访问权限


REVOKE:撤销访问权限


COMMIT:提交事务处理


ROLLBACK:事务处理回退


SAVEPOINT:设置保存点


LOCK:对数据库的特定部分进行锁定


基本的命令


首先是数据库的下载,Windows平台下下载:http://dev.mysql.com/downloads/mysql


下载安装后,可以——右击计算机—管理—服务—启动或停止MySQL服务。但是座位于i个程序员,这种方式也太low了,所以这几个命令可以看看:


启动:net start mysql服务名


停止:net stop mysql服务名


登录 mysql [-h 主机名 -P 端口号] –u用户名 –p密码,[]这个是可选的,用于远程连接。


退出 exit


一个基本的操作流程


进入 mysql, 在命令行中输入: mysql –uroot –p#### (其中:####表示密码)



查看 mysql 中有哪些个数据库: show databases;



使用一个数据库: use 数据库名称;


新建一个数据库: create database 数据库名


查看指定的数据库中有哪些数据表: show tables;


建表。


查看表的结构:desc 表名


删除表: drop table 表名


这是对数据库以及表的一些基本的操作命令,只展示两张基本操作截图,其他操作可以自行测试。


然后就是对表的数据经行基本的操作:


查看表中的所有记录: select * from 表名;


向表中插入记录:insert into 表名(列名列表) values(列对应的值的列表);




注意:插入 varchar 或 date 型的数据要用 单引号 引起来


修改记录: update 表名 set 列1 = 列1的值, 列2 = 列2的值 where …


删除记录: delete from 表名 where ….


这大概就是一个最基本的操作了,详细的操作将在下面展开。


DML语句

上面也基本说明了DML就是对数据(也就是表)的基本操作。


SELECT 语句

查询应该是使用最为频繁的一种操作了。数据库的优化,也基本上就是对查询的优化。


基础查询

基本的语法


select 查询列表 from 表名;。例如:select * from student;这就是对student查询所有的数据。


查询列表可以是字段、常量、表达式、函数,也可以是多个

查询结果是一个虚拟表

查询单个字段:select 字段名 from 表名;。例如:select name,age from student;只查询这两个字段。


特别注意:


SQL 语言大小写不敏感。

SQL 可以写在一行或者多行

关键字不能被缩写也不能分行

各子句一般要分行写。

使用缩进提高语句的可读性。

查询的时候可以给查询到的列取一个别名,方便数据的展示。


规则:紧跟列名,也可以在列名和别名之间加入关键字 ‘AS’,别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写。


例如:select name as studentName,age "studentAge" from student;


去重查询,有时候不需要重复的数据就可以使用关键字来对这个数据去重,语法如下:

select distinct 字段名 from 表名;


带条件的查询


使用WHERE 子句,将不满足条件的行过滤掉。WHERE 子句紧随 FROM 子句。语法如下:

select 查询列表 from 表名 where 筛选条件,例如:(只查询部门id为90的员工)




也可以加其他的比较运算符:


简单条件运算符:> < = <> != >= <= <=>安全等于




逻辑运算符:&& and || or ! not,如果有多个条件,可以使用逻辑运算符连接起来:




其它比较运算:


操作符 含义

BETWEEN ...AND... 在两个值之间 (包含边界)

IN(set) 等于值列表中的一个

LIKE 模糊查询

IS NULL 空值

使用 IS (NOT) NULL 判断空值,例如:select * from student where name is NULL


使用 BETWEEN 运算来显示在一个区间内的值:




使用 IN运算显示列表中的值:




模糊查询

使用 LIKE 运算选择类似的值,选择条件可以包含字符或数字:


% 代表零个或多个字符(任意个字符)。

_ 代表一个字符。

如下图,查询名字开头单词为S的,后面是啥都行,只要求开头为S,比如Ssdg也会被查询出来。




如果说上面这个例子%改为 _ ,那就变成了后面只能有一个字符。


‘%’和‘-’可以同时使用:select * from student where name like %进_


排序查询

基本语法:select 查询列表 from 表 where 筛选条件 order by 排序列表 【asc}desc】


asc :升序,如果不写默认升序。desc:降序

排序列表 支持 单个字段、多个字段、函数、表达式、别名

order by的位置一般放在查询语句的最后(除limit语句之外)



如果最后不加DESC,默认就是ASC升序的方式。


如果我们的字段取了别名,使用这个字段排序就需要使用别名:(salary*12 扩大12倍)




如果使用多个字段排序,按照ORDER BY 列表的顺序排序。(也就是按照写在前面的排序,如果有相等的就在按照后面的字段再次排序)




函数

分组函数作用于一组数据,并对一组数据返回一个值。




组函数类型:


AVG() 求平均值

COUNT() 求总量

MAX() 求最大值

MIN() 最小值

SUM() 求和

可以对数值型数据使用AVG 和 SUM 函数,可以对==任意数据类型(字符按照字典排序)==的数据使用 MIN 和 MAX 函数。




COUNT(*) 返回表中记录总数,适用于任意数据类型:




COUNT(expr) 返回expr不为空的记录总数。


分组查询

可以使用GROUP BY子句将表中的数据分成若干组,语法如下:


select 分组函数,分组后的字段

from 表

【where 筛选条件】

group by 分组的字段

【having 分组后的筛选】

【order by 排序列表】

1

2

3

4

5

6

在SELECT 列表中所有未包含在组函数中的列都应该包含 在 GROUP BY 子句中。




包含在 GROUP BY 子句中的列不必包含在SELECT 列表中,就比如上面这个例子中的department_id在select中就可以不写,但是结果不会包含这个列。


WHERE 子句中不能使用组函数


使用 HAVING 过滤分组:(跟where用法一样,作用域不同)


行已经被分组。

使用了组函数。

满足HAVING 子句中条件的分组将被显示。

多表查询

多个表可以经行联合的数据查询并展示,语法如下:select 字段 from 表1,表2,...;


笛卡尔集会在下面条件下产生:(效率很低)


省略连接条件

连接条件无效

所有表中的所有行互相连接

为了避免笛卡尔集, 可以在 WHERE 加入有效的连接条件。


在 WHERE 子句中写入连接条件。

在表中有相同列时,在列名之前加上表名前缀。

等值连接:


SELECT beauty.id,NAME,boyname FROM beauty ,boys

WHERE beauty.`boyfriend_id`=boys.id;

1

2

区分重复的列名


使用表名前缀在多个表中区分相同的列。

在不同表中具有相同列名的列可以用表的别名加以区分。

如果使用了表别名,则在select语句中需要使用表别名代替表名

表别名最多支持32个字符长度,但建议越少越好

连接 n个表,至少需要 n-1个连接条件。


内连接


基本的语法格式:(别名可取可不取)


select 查询列表

from 表1 别名

[inner] join 表2 别名 on 连接条件

where 筛选条件

group by 分组列表

having 分组后的筛选

order by 排序列表

limit 子句;

1

2

3

4

5

6

7

8

这种链接的特点:


表的顺序可以调换

内连接的结果=多表的交集

n表连接至少需要n-1个连接条件

举个例子:


#案例.查询名字中包含e的员工名和工种名(添加筛选)

SELECT last_name,job_title

FROM employees e

INNER JOIN jobs j

ON e.`job_id`=  j.`job_id`

WHERE e.`last_name` LIKE '%e%';

1

2

3

4

5

6

外连接


基本的语法格式:


select 查询列表

from 表1 别名

left|right|full [outer] join 表2 别名 on 连接条件

where 筛选条件

group by 分组列表

having 分组后的筛选

order by 排序列表

limit 子句;

1

2

3

4

5

6

7

8

这种连接的特点:


查询的结果=主表中所有的行,如果从表和它匹配的将显示匹配行,如果从表没有匹配的则显示null

left join 左边的就是主表,right join 右边的就是主表,full join 两边都是主表

一般用于查询除了交集部分的剩余的不匹配的行

举些例子:


#案例1:查询哪个部门没有员工,左外

SELECT d.*,e.employee_id

FROM departments d

LEFT OUTER JOIN employees e

ON d.`department_id` = e.`department_id`

WHERE e.`employee_id` IS NULL;


#右外

SELECT d.*,e.employee_id

FROM employees e

RIGHT OUTER JOIN departments d

ON d.`department_id` = e.`department_id`

WHERE e.`employee_id` IS NULL;


#全外

USE girls;

SELECT b.*,bo.*

FROM beauty b

FULL OUTER JOIN boys bo

ON b.`boyfriend_id` = bo.id;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

John连接总结




举个例子


笛卡尔积

SELECT * FROM t_dept, t_emp;

1

t_dept共20条记录,t_emp共6条记录。两表共同查询后共120条记录


内连接

SELECT * FROM t_emp a INNER JOIN t_dept b ON  a.deptId = b.id;

1

只会把两个表共有的部分查询出来


左外连接

SELECT * FROM t_emp a LEFT JOIN t_dept b ON  a.deptId = b.id;

1

取出左表的所有数据,然后有伴的数据满足就查询出来,不满足就填充null,和右外连接一致


右外连接

SELECT * FROM t_emp a RIGHT JOIN t_dept b ON  a.deptId = b.id;

1

左外连接取左表的独有部分

SELECT * FROM t_emp e LEFT JOIN t_dept d ON d.`id` = e.`deptId` WHERE d.id IS NULL

1

右外连接取右表的独有部分

SELECT * FROM t_emp a RIGHT JOIN t_dept b ON a.deptId = b.id WHERE a.deptId IS NULL;

1

注意:判断字段是否为NULL时,不能使用’=’


因为 = NULL 的结果不会报错,但是结果永远为false。所以必须使用IS NULL来进行判空


全外连接

MySQL不支持全外连接,要查询两个表的全集,需要合并两个查询结果,所以要使用 UNION 关键字


SELECT * FROM t_emp a LEFT JOIN t_dept b ON a.deptId = b.id

UNION

SELECT * FROM t_emp a RIGHT JOIN t_dept b ON a.deptId = b.id;

1

2

3

这种连接会把两个表有的都获取出来,然后对应的没有的置为null


查询两表独有内容

SELECT * FROM t_emp a LEFT JOIN t_dept b ON a.deptId = b.id WHERE b.id IS NULL

UNION

SELECT * FROM t_emp a RIGHT JOIN t_dept b ON a.deptId = b.id WHERE a.deptId IS NULL;

1

2

3

子查询和分页查询

子查询


出现在其他语句内部的select语句,称为子 查询或内查询内部嵌套其他select语句的查询,称为外查询或主查询


例如:


select first_name from employees where department_id in(

   select department_id from departments where location_id=1700

)

1

2

3

特别注意:


子查询要包含在括号内。

将子查询放在比较条件的右侧。

子查询 (内查询) 在主查询之前一次执行完成

子查询的结果被主查询(外查询)使用 。

举个例子:谁的工资比 Abel 高?


SELECT last_name

FROM employees

WHERE salary > (SELECT salary FROM employees WHERE last_name = 'Abel');

1

2

3

会先执行完子查询,然后结果供主查询使用。


分页查询


当要查询的条目数太多,一页显示不全,这个时候就可以使用分页查询。


基本的语法格式:


select 查询列表

from 表

limit [offset,] size;

# 注意:

 offset代表的是起始的条目索引,默认从0开始

 size代表的是显示的条目数

1

2

3

4

5

6

一个固定的分页公式:


假如要显示的页数为page,每一页条目数为size:select 查询列表 from 表 limit (page-1)*size,size;


举个例子:


#案例1:查询前五条员工信息

SELECT * FROM  employees LIMIT 0,5;

SELECT * FROM  employees LIMIT 5;


#案例2:查询第11条——第25条

SELECT * FROM  employees LIMIT 10,15;

1

2

3

4

5

6

总结查询以及执行顺序


select 查询列表     7

from 表1 别名       1

连接类型 join 表2    2

on 连接条件          3

where 筛选          4

group by 分组列表    5

having 筛选         6

order by排序列表     8

limit 起始条目索引,条目数;  9

1

2

3

4

5

6

7

8

9

增删改

insert语句


基本语法格式:insert into 表名(字段名,...) values(值,...);


特别注意:


要求值的类型和字段的类型要一致或兼容


字段的个数和顺序不一定与原始表中的字段个数和顺序一致,但必须保证值和字段一一对应


假如表中有可以为null的字段,注意可以通过以下两种方式插入null值


字段和值都省略

字段写上,值使用null

字段和值的个数必须一致


字段名可以省略,默认所有列


举个例子:


INSERT INTO departments(department_id, department_name,manager_id, location_id)

VALUES (70, 'Public Relations', 100, 1700);

1

2

如果有日期类型:字符和日期型数据应包含在单引号中。


INSERT INTO employees(employee_id,last_name,email,hire_date,job_id)

VALUES (300,’Tom’,’tom@126.com’,to_date(‘2012-3-21’,’yyyy-mm-dd’),’SA_RAP’);

1

2

一次插入多条语句的语法:insert into 表名【(字段名,..)】 values(值,..),(值,...)


举个例子:


INSERT INTO departments(department_id, department_name,manager_id, location_id)

VALUES

(70, 'Public Relations', 100, 1700),

(71, 'Public sdf', 23, 65745),

(72, 'Public asdg', 54, 3454);

1

2

3

4

5

update语句


基本的语法格式:update 表名 set 字段=值,字段=值 【where 筛选条件】;


可以一次更新多条数据。如果需要回滚数据,需要保证在DML前,进行 设置:SET AUTOCOMMIT = FALSE;


使用 WHERE 子句指定需要更新的数据:


UPDATE employees SET department_id = 70 WHERE employee_id = 113;


如果省略 WHERE 子句,则表中的所有数据都将被更新:


UPDATE copy_emp SET department_id = 110;


delete语句


基本的语法格式:delete from 表名 【where 筛选条件】【limit 条目数】


使用 WHERE 子句删除指定的记录:delete from departments where department_name = 'Finance';


如果省略 WHERE 子句,则表中的全部数据将被删除:DELETE FROM copy_emp;


DDL语句

这个部分相对上面内容就少了很多了。


数据库的管理


创建数据库:create database [if not exists] 库名 [character set 字符集名];


修改库:alter database 库名 character set 字符集名;


删除库:drop database [if exists] 库名;


相关其他命令,这个一般用于命令行中:


show databases;查看当前所有数据库

use employees;“使用”一个数据库,使其作为当前数据库

表的管理语句


创建表:


create table 【if not exists】 表名(

字段名 字段类型 【约束】,

字段名 字段类型 【约束】,

。。。

字段名 字段类型 【约束】

)

# 举个例子:

CREATE TABLE dept(

   deptno INT(2),

   dname VARCHAR(14),

   loc VARCHAR(13)

);


1

2

3

4

5

6

7

8

9

10

11

12

13

常用的数据类型:


INT 使用4个字节保存整数数据

CHAR(size) 定长字符数据。若未指定,默认为1个字符,最大长度255

VARCHAR(size) 可变长字符数据,根据字符串实际长度保存,必须指定长度

FLOAT(M,D) 单精度,M=整数位+小数位,D=小数位。 D<=M<=255,0<=D<=30, 默认M+D<=6

DOUBLE(M,D) 双精度。D<=M<=255,0<=D<=30,默认M+D<=15

DATE 日期型数据,格式’YYYY-MM-DD’

BLOB 二进制形式的长文本数据,最大可达4G

TEXT 长文本数据,最大可达4G

修改表的语句:


添加列:alter table 表名 add column 列名 类型 [first|after 字段名];


修改列的类型或约束:alter table 表名 modify column 列名 新类型 [新约束];


修改列名:alter table 表名 change column 旧列名 新列名 类型;


删除列:alter table 表名 drop column 列名;


修改表名:alter table 表名 rename [to] 新表名;


删除表:drop table [if exists] 表名;


建表的时候常见的约束


NOT NULL:非空,该字段的值必填

UNIQUE:唯一,该字段的值不可重复

DEFAULT:默认,该字段的值不用手动插入有默认值

CHECK:检查,mysql不支持

PRIMARY KEY:主键,该字段的值不可重复并且非空 unique+not null

FOREIGN KEY:外键,该字段的值引用了另外的表的字段

主键:一个表至多有一个主键,主键本生就包含了唯一和非空两个约束


外键的作用和注意点:


用于限制两个表的关系,从表的字段值引用了主表的某字段值

外键列和主表的被引用列要求类型一致,意义一样,名称无要求

主表的被引用列要求是一个key(一般就是主键)

插入数据,先插入主表

删除数据,先删除从表

create table 表名(

字段名 字段类型 not null,#非空

字段名 字段类型 primary key,#主键

字段名 字段类型 unique,#唯一

字段名 字段类型 default 值,#默认

constraint 约束名 foreign key(字段名) references 主表(被引用列)

)

1

2

3

4

5

6

7

在一张数据表建好之后,这些约束也可以通过SQL语句经行修改或者删除:


添加非空:alter table 表名 modify column 字段名 字段类型 not null;

删除非空:alter table 表名 modify column 字段名 字段类型 ;

添加默认:alter table 表名 modify column 字段名 字段类型 default 值;

删除默认:alter table 表名 modify column 字段名 字段类型 ;

添加主键:alter table 表名 add [constraint 约束名] primary key(字段名);

删除主键:alter table 表名 drop primary key;

更多的写法就自行搜索吧。


的字段值引用了主表的某字段值


外键列和主表的被引用列要求类型一致,意义一样,名称无要求

主表的被引用列要求是一个key(一般就是主键)

插入数据,先插入主表

删除数据,先删除从表

create table 表名(

字段名 字段类型 not null,#非空

字段名 字段类型 primary key,#主键

字段名 字段类型 unique,#唯一

字段名 字段类型 default 值,#默认

constraint 约束名 foreign key(字段名) references 主表(被引用列)

)

1

2

3

4

5

6

7

在一张数据表建好之后,这些约束也可以通过SQL语句经行修改或者删除:


添加非空:alter table 表名 modify column 字段名 字段类型 not null;

删除非空:alter table 表名 modify column 字段名 字段类型 ;

添加默认:alter table 表名 modify column 字段名 字段类型 default 值;

删除默认:alter table 表名 modify column 字段名 字段类型 ;

添加主键:alter table 表名 add [constraint 约束名] primary key(字段名);

删除主键:alter table 表名 drop primary key;

更多的写法就自行搜索吧。

————————————————

版权声明:本文为CSDN博主「小王子jvm」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_55086330/article/details/115028662