查询数据
SELECT 语法结构
SELECT (DISTINCT) column_name1, column_name2,.....,aggregate_function(column_name) FROM table_name ORDER BY column_name1, column_name2,....(LIMIT 0,5);
- 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的 <br />'a' //两位且结尾字母是a的 <br />'a' //两位且开头字母是a的 |
% | 表示任意字符,类似于正则表达式中的星号 ""* | '%a' //以a结尾的数据 <br />'a%' //以a开头的数据 <br />'%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'为开头的所有数据:<br />mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st'; |
$ | 匹配输入字符串的结束位置 | 查找name字段中以'ok'为结尾的所有数据:<br />mysql> SELECT name FROM person_tbl WHERE name REGEXP 'ok$'; |
\ | 匹配特殊字符。 | 查找name字段中包含.的所有数据:<br />mysql> SELECT name FROM person_tbl WHERE name REGEXP '\\.'; |
[...] | 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。 | 查找name字段包含:ak, ek,ik, ok, uk等所有数据:<br />mysql> SELECT name FROM person_tbl WHERE name REGEXP '[aeiou]k'; |
[^...] | 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。 | <br /> |
. | 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用像 '[.\n]' 的模式。 | 查找name字段中以'ok'为结尾的所有数据: |
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 | <br /> |
+ | 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 | <br /> |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 | |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 | <br /> |
p1|p2|p3 | 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 | 查找name字段中以元音字符开头或以'ok'字符串结尾的所有数据:<br />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(),<br />日期和时间处理函数:Date(), Year(), Month(), Day(), Hour()
- 汇总数据:AVG(), COUNT(), MAX(), MIN(), SUM() 忽略列值为NULL的行,可以加DISTINCT参数。
分组
GROUP BY语句根据一个或多个列对结果集进行分组,如果想要对分组的结果进一步过滤,可以使用HAVING。<br />语法结构:
SELECT column_name1, column_name2……,aggregate_function(column_name)
FROM table_name
[WHERE conditions]
GROUP BY column_name1,column_name2…… [HAVING conditions];
执行流程:<br />1.首先进行外层查询,根据WHERE条件过滤出数据;<br />2.对第一步所得数据按照GROUP BY后面跟的字段进行分组,分组顺序与字段顺序保持一致;<br />3.HAVING子句筛选满足第二条件的数据; 如果HAVING中有使用SELECT中聚合函数生成的字段,那等SELECT完之后再执行过滤;<br />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脚本之家<br />http://www.jb51.net/article/64006.htm<br />3.第8篇 MySQL 多表连接查询
网友评论