mysql 一些基础的语法和命令
语法:
SELECT 属性列表
FROM 表名或视图名
[ WHERE 条件表达式1 ]
[ GROUP BY 属性名1 [ HAVING 条件表达式2 ] [ WITH ROOLUP ] ]
[ ORDER BY 属性名2 [ ASC|DESC ] ]
条件表达式1:指定查询条件
条件表达式2:满足该表达式的结果才能输出
WITH ROLLUP:在所有记录的最后增加一条记录,包含上面记录的总和
单独使用GROUP BY 查询结果只显示一个分组的记录,所以它通常和集合函数一起使用
查询条件:
比较 =、<、<=、>、>=、!=、<>、!<、!>
指定范围 BETWEEN AND、NOT BETWEEN AND
指定集合 IN、NOT IN
匹配字符 LIKE、NOT LIKE(只能匹配字符串,%代表任意长度,_代表单个字符)
是否为空值 IS NULL、IS NOT NULL
多个查询条件 AND、OR
限制条件 LIMIT
(一)普通查询
## 查询所有字段
SELECT * FROM grade;
## 查询指定字段
SELECT course FROM grade;
## 查询指定记录
SELECT * FROM grade WHERE num=1;
## 查询指定集合内的记录
SELECT * FROM grade WHERE course IN('语文','数学');
## 查询指定范围内的记录
SELECT * FROM grade WHERE age BETWEEN 18 AND 19 ;
## 匹配查询
SELECT * FROM grade WHERE course LIKE '英%';
## 查询空值
SELECT * FROM grade WHERE score IS NULL;
## 多条件查询
SELECT * FROM grade WHERE score>90 AND sex= 'M';
SELECT * FROM grade WHERE score<90 OR sex= 'F';
## 查询结果不重复
SELECT DISTINCT num FROM grade;
## 对结果排序(支持多字段排序,先按第一个字段排序,第一个字段相等时再按第二个字段排序)
SELECT * FROM grade ORDER BY score DESC;
SELECT * FROM grade ORDER BY num DESC, score ASC;
## 分组查询
#单独使用GROUP BY时,只显示分组结果第一个,无实际意义,一般与集合函数一起使用
SELECT * FROM grade GROUP BY sex;
#与GROUP_CONCAT()一起使用,显示每个分组的字段,一个语句使用只使用一个
语法:
GROUP_CONCAT( [DISTINCT] 属性名 [ORDER BY 属性名 ASC|DESC] [SEPARATOR ‘;|,’] )
SELECT sex,GROUP_CONCAT(name) FROM grade GROUP BY sex;
#与集合函数一起使用,COUNT() SUM() AVG() MAX() MIN()
SELECT sex,COUNT(sex) FROM grade GROUP BY sex;
SELECT num,SUM(score) FROM grade GROUP BY num;
#HAVING一起使用,该关键字用于选择满足条件的分组
SELECT sex, COUNT(sex) FROM grade GROUP BY sex HAVING COUNT(sex)>3;
## 限制查询数量
SELECT * FROM grade LIMIT 2;(前两个)
SELECT * FROM grade LIMIT 2,3;(从第2个位置起(不含),显示之后3个记录)
(二)使用集合函数查询
## 使用COUNT()函数查询记录数
SELECT COUNT(*) FROM employee;
SELECT d_id,COUNT(*) FROM employee GROUP BY d_id;
## 使用SUM()函数,该函数只适用于数值型字段
SELECT num,SUM(score) FROM grade GROUP BY num;
## 使用AVG()函数
SELECT course,AVG(score) FROM grade GROUP BY course;
## 使用MAX()和MIN()函数,可对字符串排序,a最新,z最大,依次排序直至结果
SELECT MAX(age) FROM grade;
SELECT MIN(age) FROM grade;
(三)连接查询
将两个及以上的表按某个条件连接起来,选取数据。不同的表中存在表示相同意义的字段时,可以通过该字段连接这些表。
1. 内连接查询,只查询出指定字段取值相同的记录
SELECT num,name,employee.d_id,age,sex,d_name,function
FROM employee,department
WHERE employee.d_id=department.d_id;
2. 外连接查询
语法:
SELECT 属性名列表
FROM 表名1 LEFT|RIGHT JION 表名2
ON 表名1.属性名1=表名2.属性名2;
## 左连接,可以查询表名1中的所有记录和表名2中的匹配记录
SELECT num,name,employee.d_id,age,sex,d_name,function
FROM employee LEFT JION department
ON employee.d_id=department.d_id;
## 右连接,可以查询表名2中的所有记录和表名1中的匹配记录
SELECT num,name,employee.d_id,age,sex,d_name,function
FROM employee.d_id=department.d_id;
3. 复合条件连接查询
SELECT num,name,employee.d_id,age,sex,d_name,function
FROM employee,department
WHERE employee.d_id=department.d_id AND age>24;
(四)子查询,即将一个查询语句嵌套在另一个查询语句中
1. 带IN关键字的子查询,即一个查询语句的条件可能落在另一个SELECT语句的查询结果中
## 查询employee中的记录,且记录d_id的字段值必须在department表中出现过
SELECT * FROM employee
WHERE d_id IN
(SELECT d_id FROM department);
## 查询employee中的记录,且记录d_id的字段值必须没有在department表中出现过
SELECT * FROM employee
WHERE d_id NOT IN
(SELECT d_id FROM department);
2. 带比较运算符的子查询
## 查询到一等奖学金(level 1)最低分数90分
SELECT * FROM scholarship;
## 查询满足一等奖学金的学生
SELECT id,name,score FROM computer_stu
WHERE score >=
(SELECT score FROM scholarship WHERE level=1);3. 带EXISTS和NOT EXISTS关键字的子查询,内层查询语句不返回查询记录,而是返回一个真假值;当内存查询语句返回true时,外层查询语句将进行查询,否则不进行查询或查询不出任何记录
SELECT * FROM employee
WHERE EXISTS
( SELECT d_name FROM department WHERE d_id=1003);
上述查询语句中,内查询语句返回结果为true,所以外层查询语句执行
4. 带ANY关键字的子查询,只要满足内层查询语句返回结果中的任何一个,就可以通过该条件来执行外层查询语句。
ANY通常与比较运算符一起使用,>ANY表示大于任何一个值,=ANY表示等于任何一个值
##
SELECT * FROM computer_stu
WHERE score >=ANY (SELECT score FROM scholarship)
5. 带ALL关键字的子查询
## 查询分数大于所有奖学金最低分的学生信息
SELECT * FROM computer_stu WHERE score>=ALL (SELECT score FROM scholarship);
(五)合并查询结果
将多个查询结果合并到一起显示。UNION,将所有查询结果合并到一起,然后去掉相同的记录;UNION ALL 关键字只是简单合并到一起。
语法:
SELECT 语句1
UNION|UNION ALL
SELECT 语句2
……;
两个语句之间用UNION或UNION ALL连接
## 将department和employee表中的d_id字段合并到一起
SELECT d_id FROM department
UNION
SELECT d_id FROM employee;
SELECT d_id FROM department
UNION ALL
SELECT d_id FROM employee;
(六)为表和字段去别名
1. 为表取别名,可在查询中使用别名查询,单必须保证该数据库中没有其他表与该别名相同
语法:
表名 表的别名
SELECT * FROM department d WHERE d.d_id=1001;
2. 为字段取别名
属性名 [AS] 别名
查询结果会直接显示字段的别名,但必须保证该表中没有其他字段与该别名相同
SELECT d_id AS department_id, d_name AS department_name FROM department;
(七)使用正则表达式查询
语法:
属性名 REGEXP ‘匹配方式’
正则表达式的模式字符 含义
^ 匹配字符串开始的部分
$ 匹配字符串结束的部分
. 代表字符串中任意一个字符,包括回车和换行
[字符集合] 匹配”字符集合”中的任何一个字符
[^字符集合] 匹配除了“字符集合”以外的任何一个字符
S1|S2|S3 匹配S1、S2和S3中的任意一个字符串
* 代表多个该符号之前的字符,包括0和1个
+ 代表多个该符号之前的字符,包括1个
字符串{N} 字符串出现N次
字符串{M,N} 字符串出现至少M次,最多N次
1. 查询以特定字符或字符串开头的记录
## 查询name字段以L开头的记录
SELECT * FROM computer_stu WHERE name REGEXP '^L';
2. 查询以特定字符或字符串结尾的记录
## 查询name字段以m结尾的记录
SELECT * FROM computer_stu WHERE name REGEXP 'm$';
3. 用符号”.”来代替字符串中的任意一个字符
## 查询name字段以L开头,y结尾,中间有两个字符的记录
SELECT * FROM computer_stu WHERE name REGEXP '^L..y$';4. 匹配字符串中的任意一个
4. 匹配指定字符意外的字符
## 查询name字段中含有a和n任意一个字符的记录
SELECT * FROM computer_stu WHERE name REGEXP '[An]';
5. 匹配指定字符串
SELECT * FROM computer_stu WHERE name REGEXP 'ic';
6. 用“*”和“+”来匹配多个字符
## 查询name字段中字符c之前出现过a的记录,*表示≥0个,+表示>1个
SELECT * FROM computer_stu WHERE name REGEXP 'a*c';
SELECT * FROM computer_stu WHERE name REGEXP 'a+c';
命令
访问监控器:mysql -u [username] -p;
(会提示密码)
显示所有的数据库: show databases;
Access数据库:mysql -u [username] -p [database]
(会提示密码)
创建新的数据库: create database [database];
选择数据库: use [database];
确定是使用什么数据库: select database();
显示所有表: show tables;
显示表结构: describe [table];
列表中的某个表的所有索引: show index from [table];
创建列的新表: CREATE TABLE [table] ([column] VARCHAR(120), [another-column] DATETIME);
添加一列: ALTER TABLE [table] ADD COLUMN [column] VARCHAR(120);
添加列具有独特的自动递增ID: ALTER TABLE [table] ADD COLUMN [column] int NOT NULL AUTO_INCREMENT PRIMARY KEY;
插入一条记录: INSERT INTO [table] ([column], [column]) VALUES ('[value]', [value]');
MySQL的功能输入的日期时间: NOW()
查看记录: SELECT * FROM [table];
说明记录: EXPLAIN SELECT * FROM [table];
选择记录部分: SELECT [column], [another-column] FROM [table];
计数记录: SELECT COUNT([column]) FROM [table];
计数并选择分组记录: SELECT *, (SELECT COUNT([column]) FROM [table]) AS count FROM [table] GROUP BY [column];
选择特定的记录:SELECT * FROM [table] WHERE [column] = [value];
(选择器:<
,>
,!=
,合并多个选择与AND
,OR
)
含选择的记录[value]
:SELECT * FROM [table] WHERE [column] LIKE '%[value]%';
首先是选择的记录[value]
:SELECT * FROM [table] WHERE [column] LIKE '[value]%';
首先是选择记录val
和结尾ue
:SELECT * FROM [table] WHERE [column] LIKE '[val_ue]';
选择一个范围: SELECT * FROM [table] WHERE [column] BETWEEN [value1] and [value2];
与客户订单和唯一的限制选择:SELECT * FROM [table] WHERE [column] ORDER BY [column] ASC LIMIT [value];
(排序:DESC
,ASC
)
更新记录: UPDATE [table] SET [column] = '[updated-value]' WHERE [column] = [value];
删除记录: DELETE FROM [table] WHERE [column] = [value];
删除所有记录从一个表(不删除表本身): DELETE FROM [table];
(这也将重置自动生成的,就像一个id列列递增计数器。)
删除表中的所有记录: truncate table [table];
删除表列: ALTER TABLE [table] DROP COLUMN [column];
删除表: DROP TABLE [table];
删除数据库: DROP DATABASE [database];
自定义列输出名称: SELECT [column] AS [custom-column] FROM [table];
导出数据库转储(更多信息点击这里)mysqldump -u [username] -p [database] > db_backup.sql
使用--lock-tables=false
的锁定表(更多信息选项这里)。
导入数据库转储(更多信息点击这里)mysql -u [username] -p -h localhost [database] < db_backup.sql
登出: exit;
聚合函数
选择但不重复: SELECT distinct name, email, acception FROM owners WHERE acception = 1 AND date >= 2015-01-01 00:00:00
计算记录总数: SELECT SUM([column]) FROM [table];
算上总数[column]
由和组[category-column]
:SELECT [category-column], SUM([column]) FROM [table] GROUP BY [category-column];
获得最大的价值[column]
:SELECT MAX([column]) FROM [table];
获取最小值: SELECT MIN([column]) FROM [table];
获取平均值: SELECT AVG([column]) FROM [table];
找圆润的平均值和组[category-column]
:SELECT [category-column], ROUND(AVG([column]), 2) FROM [table] GROUP BY [category-column];
多个表
从多个表中选择: SELECT [table1].[column], [table1].[another-column], [table2].[column] FROM [table1], [table2];
结合不同表行: SELECT * FROM [table1] INNER JOIN [table2] ON [table1].[column] = [table2].[column];
从不同的表合并行,但不需要连接条件:SELECT * FROM [table1] LEFT OUTER JOIN [table2] ON [table1].[column] = [table2].[column];
(左表是出现在语句中的第一个表。)
使用重命名列或表的别名:SELECT [table1].[column] AS '[value]', [table2].[column] AS '[value]' FROM [table1], [table2];
用户功能
列出所有用户: SELECT User,Host FROM mysql.user;
创建新用户: CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
授予ALL
访问用户为*
表:GRANT ALL ON database.* TO 'user'@'localhost';
找出Mysql的主机的IP地址
SHOW VARIABLES WHERE Variable_name = 'hostname';