MySQL-SQL语句命令

Posted MinggeQingchun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL-SQL语句命令相关的知识,希望对你有一定的参考价值。

一、mysql LIKE 子句

在 MySQL 中使用 SQL SELECT 命令来读取数据, 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录。

WHERE 子句中可以使用等号 = 来设定获取数据的条件,但是有时候我们需要获取 name 字段含有 "xiao" 字符的所有记录,这时我们就需要在 WHERE 子句中使用 SQL LIKE 子句。

SQL LIKE 子句中使用百分号 %字符来表示任意字符,类似于UNIX或正则表达式中的星号 *。

如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的。

SELECT field1, field2,...fieldN 
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'

可以在 WHERE 子句中指定任何条件。
可以在 WHERE 子句中使用LIKE子句。
可以使用LIKE子句代替等号 =。
LIKE 通常与 % 一同使用,类似于一个元字符的搜索。
可以使用 AND 或者 OR 指定一个或多个条件。
可以在 DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句来指定条件。

Like模糊查询,通常和通配符百分号 % 和 下划线 _ 联合使用

Select * from user where name like 'X%';
查询 user 表中 name 列中有 'X' 的值,X' 为要查询内容中的模糊信息。

百分号%:匹配任意多个字符;下划线 _:任意一个字符(%是一个特殊的符号,_ 也是一个特殊符号)

 'X% ':为能配符,正则表达式,表示的意思为模糊查询信息为 X 开头的

 '%X ':为能配符,正则表达式,表示的意思为模糊查询信息为 X 结尾的

'%X%' : 表示查询包含X的所有内容

 '%X_': 表示查询以X在倒数第二位的所有内容

'_X%':查询第二个字母为 X

'__X%':查询第三个字母为 X

'%\\_%':\\ 转义字符;查询带有 下划线 _ 的

【】查询名字中含有O

select name from user where name like '%O%';

【】查询名字以O结尾

 select name from user where name like '%O';

【】查询名字以O开始

select name from user where name like 'O%';

【】查询第二个字每是O

select name from user where name like '_O%';

【】查询第三个字母是O

select name from user where name like '__O%';

【】查询名字中有下划线“_”

select name from user where name like '%\\_%'; // \\转义字符

二、MySQL UNION 操作符

MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据

SELECT expression1, expression2, ... expression_n
FROM tables1
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables2
[WHERE conditions];

expression1, expression2, ... expression_n: 要检索的列。

tables: 要检索的数据表。

WHERE conditions: 可选, 检索条件。

DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。

ALL: 可选,返回所有结果集,包含重复数据。

UNION 语句:用于将不同表中相同列中查询的数据展示出来;(不包括重复数据)

UNION ALL 语句:用于将不同表中相同列中查询的数据展示出来;(包括重复数据)

使用形式如下:

SELECT 列名称 FROM 表名称 UNION SELECT 列名称 FROM 表名称 ORDER BY 列名称;
SELECT 列名称 FROM 表名称 UNION ALL SELECT 列名称 FROM 表名称 ORDER BY 列名称;

注:

UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型

同时,每个 SELECT 语句中的列的顺序必须相同

如下,都会报错

列数不同

select empname,job from emp where job = 'salesman' union select empname from emp where job='manager';
ERROR 1222 (21000): The used SELECT statements have a different number of columns

字段类型不同;MYSQL中可以不会报错,但是Oracle语法严格 ,会报错

select 
    empname,job 
from 
    emp 
where 
    job = 'salesman' 
union 
select 
    empname,sal 
from 
    emp 
where 
    job='manager';

UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名

(2)union 和 join 选择

union的效率要高一些

join表连接,每连接一次新表,则匹配的次数满足笛卡尔积,是两张表行数的乘积

union可以减少匹配的次数;还可以完成两个结果集的拼接

如下:a 连接 b;连接 c

a表10条记录;b表 10条记录;c表 10条记录;join匹配次数:10*10*10 = 1000

a 连接 b一个结果:10 * 10  = 100; a 连接 c一个结果:10 * 10 = 100次;union匹配次数:100 + 100 = 200次

(union把乘法变成了加法运算)

三、MySQL 排序 ORDER BY

MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果

SELECT field1, field2,...fieldN FROM table_name1, table_name2...
ORDER BY field1 [ASC [DESC][默认 ASC]], [field2...] [ASC [DESC][默认 ASC]]

ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序ASC排列

如果按照多个字段排序的话,最前面的字段起主导作用,如下

查询员工名字和薪资,要求按照薪资升序,如果薪资一样的话,再按照名字升序排列

// sal在前,起主导,只有sal相等的时候,才会考虑启用name排序
select name,sal from emp order by sal asc, name asc; 

我们还可以按照列数排序 ,如下:

// 2表示第二列
select name,sal from emp order by 2;

不建议在SQL中这样写,因为不健壮(列的顺序很容易发生改变,列顺序修改之后,则最新列字段代表的就是另一个字段了)

排序时关键字顺序不能改变

select
   ...
from
   ...
where
   ...
order by
   ...

第一步:from
第二步:where
第三步:select
第四步:order by(排序总是在最后执行!)

四、MySQL GROUP BY 语句

GROUP BY 语句根据一个或多个列对结果集进行分组。

在分组的列上我们可以使用 COUNT, SUM, AVG,等函数

SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

WITH ROLLUP

WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)

SELECT name, SUM(student_count) as studentCount FROM  classOne GROUP BY name WITH ROLLUP;

五、MySQL 连接的使用

MySQL 的 JOIN 在两个或多个表中查询数据。

在 SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。

JOIN 按照功能大致分为如下三类:

INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

六、MySQL NULL 值处理

 MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作

为了处理这种情况,MySQL提供了三大运算符:

IS NULL: 当列的值是 NULL,此运算符返回 true。
IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
<=>: 比较操作符(不同于 = 运算符),当比较的的两个值相等或者都为 NULL 时返回 true。

is null 为 null;is not null 不为空

在数据库当中null不能使用等号"="进行衡量;需要使用is null

数据库中的null代表什么也没有,它不是一个值,所以不能使用等号"="衡量

SELECT * FROM student WHERE name IS NULL;

SELECT * FROM student WHERE name IS NOT NULL;

七、MySQL 正则表达式

MySQL中使用 REGEXP 操作符来进行正则表达式匹配

模式描述
^匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\\n' 或 '\\r' 之后的位置。
$匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\\n' 或 '\\r' 之前的位置。
.匹配除 "\\n" 之外的任何单个字符。要匹配包括 '\\n' 在内的任何字符,请使用像 '[.\\n]' 的模式。
[...]字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^...]负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
p1|p2|p3匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
*匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于0,。
+匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 1,。
nn 是一个非负整数。匹配确定的 n 次。例如,'o2' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
n,mm 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

以 student 表为例

查找name字段中以'st'为开头的所有数据:

SELECT name FROM student WHERE name REGEXP '^st';

查找name字段中以'ok'为结尾的所有数据:

SELECT name FROM student WHERE name REGEXP 'ok$';

查找name字段中包含'mar'字符串的所有数据:

SELECT name FROM student WHERE name REGEXP 'mar';

查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据:

SELECT name FROM student WHERE name REGEXP '^[aeiou]|ok$';

八、MySQL ALTER命令

1、删除,添加或修改表字段

用了 ALTER 命令及 DROP 子句来删除以上创建表的 name 字段

ALTER TABLE user DROP name;

如果数据表中只剩余一个字段则无法使用DROP来删除字段

MySQL 中使用 ADD 子句来向数据表中添加列,如下实例在表 user 中添加 age 字段,并定义数据类型

ALTER TABLE user ADD age INT;

age 字段会自动添加到数据表字段的末尾

如果需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)

ALTER TABLE user ADD age INT FIRST;

ALTER TABLE user ADD age INT AFTER name;

2、修改字段类型及名称

如果需要修改字段类型及名称, 可以在ALTER命令中使用 MODIFY 或 CHANGE 子句

把字段 name 的类型从 CHAR(5) 改为 CHAR(10),可以执行以下命令:

ALTER TABLE user MODIFY name CHAR(10);

使用 CHANGE 子句, 语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型

ALTER TABLE user CHANGE age age11 BIGINT;

3、ALTER TABLE 对 Null 值和默认值的影响

当修改字段时,可以指定是否包含值或者是否设置默认值。

以下实例,指定字段 j 为 NOT NULL 且默认值为100 。

ALTER TABLE user MODIFY age BIGINT NOT NULL DEFAULT 100;

如果不设置默认值,MySQL会自动设置该字段默认为 NULL

使用 ALTER 来修改字段的默认值

ALTER TABLE user ALTER age SET DEFAULT 1000;

使用 ALTER 命令及 DROP子句来删除字段的默认值

ALTER TABLE user ALTER age DROP DEFAULT;

修改数据表类型,可以使用 ALTER 命令及 TYPE 子句

ALTER TABLE user ENGINE = MYISAM;

 4、修改表名

如果需要修改数据表的名称,可以在 ALTER TABLE 语句中使用 RENAME 子句来实现

ALTER TABLE user RENAME TO user11;

以上是关于MySQL-SQL语句命令的主要内容,如果未能解决你的问题,请参考以下文章

MySQL-SQL语句

Python mysql-SQL概要

mysql-sql高级应用

MySQL-SQL语法基础

MySQL-SQL基础-子查询

mysql-SQL优化