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,。 |
n | n 是一个非负整数。匹配确定的 n 次。例如,'o2' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 |
n,m | m 和 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语句命令的主要内容,如果未能解决你的问题,请参考以下文章