Mysql基本操作

查询数据

SELECT 语法结构

SELECT (DISTINCT) column_name1, column_name2,.....,aggregate_function(column_name) FROM table_name ORDER BY  column_name1, column_name2,....(LIMIT 05);
  • SELECT 命令可以读取一条或者多条记录。
  • 你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
  • 你可以使用 WHERE 语句来包含任何条件。
  • 你可以使用 LIMIT 属性来设定返回的记录数。
  • 你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。

过滤数据

值比较符号=、<>、 !=、<、<=、>、>=、IS [NOT] NULL

范围(BETWEEN AND), IN(范围, 范围) NOT IN(范围, 范围)

LIKE过滤

语法结构:

SELECT field1, field2,...fieldN 
FROM table_name
WHERE field1 LIKE condition1;
模式描述示例
_表示任意单个字符。类似于正则表达式中的星号 "."'a' //三位且中间字母是a的
'a' //两位且结尾字母是a的
'a
' //两位且开头字母是a的
%表示任意字符,类似于正则表达式中的星号 "*"'%a' //以a结尾的数据
'a%' //以a开头的数据
'%a%' //含有a的数据
[...]字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^...]负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。

示例:

SELECT prod_id, prod_name FROM products WHERE prod_name  LIKE 'jet%';  //搜索prod_name字段中包含jet字符串的所有数据

正则表达式过滤

模式描述示例
^匹配输入字符串的开始位置查找name字段中以'st'为开头的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st';
$匹配输入字符串的结束位置查找name字段中以'ok'为结尾的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$';
\匹配特殊字符。查找name字段中包含.的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '\\.';
[...]字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。查找name字段包含:ak, ek,ik, ok, uk等所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '[aeiou]k';
[^...]负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
.匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用像 '[.\n]' 的模式。查找name字段中以'ok'为结尾的所有数据:
*匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
{n}n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,m}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。
p1|p2|p3匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据:
mysql> SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$';

示例:

SELECT prod_name FROM products WHERE prod_name REGXP '[1-5] Ton' ORDER BY prod_name;
SELECT vend_name FROM vendors WHERE vend_name REGEXP '\\.' ORDER BY vend_name;

[NOT] EXISTS

判断子查询是否存在。语法结构:

SELECT column_name1, column_name2,... FROM table_name_1 WHERE [conditions] and [NOT] EXISTS (SELECT * FROM table_name_2 where [conditons]);

执行过程:
1、首先进行外层查询,在表table_name_1中查询满足条件的column1;
2、接下来进行内层查询,将满足条件的column1带入内层的表table_name_2中进行查询;
3、如果内层的表table_name_2满足查询条件,则返回true,该条数据保留;如果内层的表table_name_2不满足查询条件,则返回false,该条数据不保留;
4、最终将数据进行返回;
示例:

select * from student s where exists( select * from classinfo c where s.classid = c.classid);

函数
拼接字段:Concat
别名:AS, 会创建新的列
算术计算:+,-,*,/
文本处理函数:LTrim(), RTrim(), Lower(), Upper(), Left(), Right(), Length(),
日期和时间处理函数:Date(), Year(), Month(), Day(), Hour()
汇总数据:AVG(), COUNT(), MAX(), MIN(), SUM() 忽略列值为NULL的行,可以加DISTINCT参数。

分组

GROUP BY语句根据一个或多个列对结果集进行分组,如果想要对分组的结果进一步过滤,可以使用HAVING。
语法结构:

SELECT column_name1, column_name2……,aggregate_function(column_name)
FROM table_name
[WHERE conditions]
GROUP BY column_name1,column_name2…… [HAVING conditions];

执行流程:
1.首先进行外层查询,根据WHERE条件过滤出数据;
2.对第一步所得数据按照GROUP BY后面跟的字段进行分组,分组顺序与字段顺序保持一致;
3.HAVING子句筛选满足第二条件的数据; 如果HAVING中有使用SELECT中聚合函数生成的字段,那等SELECT完之后再执行过滤;
4.执行SELECT, 返回指定的字段;

示例:

SELECT order_num, SUM(quantity*item_price) AS ordertotal FROM orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price) >= 50
ORDER BY ordertotal;

增删改数据

INSERT INTO customers(cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country) VALUES(...);
UPDATE customers SET cust_name = 'The Fudds', cust_email = 'elmer@fudd.com' WHERE cust_id = 10005;
DELETE FROM  customers WHERE cust_id = 10006;

表定义操作

创建和删除表

SHOW DATABASES;                                        //显示数据库;
USE <数据库名>;                                         //使用数据库;
SHOW TABLES;                                           //显示库下面所有表;
DROP TABLE <表名>;                                      //删除表

ALTER TABLE <表名> ADD <新字段名><数据类型>[约束条件];    //添加字段
ALTER TABLE <表名> DROP <字段名>;                       //删除字段
ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>;//修改字段定义
ALTER TABLE <表名> MODIFY <字段名> <新数据类型>;//修改字段定义, 跟CHANGE区别是不能重命名字段


参考:

1.几种MySQL中的联接查询操作方法总结_Mysql_脚本之家
www.jb51.net/article/640…
3.第8篇 MySQL 多表连接查询

posted @ 2023-08-21 00:15  扎Zn了老Fe  阅读(12)  评论(0编辑  收藏  举报  来源