You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
hutao/docs/select.md

4.0 KiB

数据库查询

一、基础查询

1.1SELECT

查全部

SELECT * FROM table;

查指定字段

SELECT name,age FROM table;

字段别名

SELECT name as newName,age as '年龄' FROM table;

过滤字段重复

# 过滤掉目标所有字段都重复的行
SELECT DISTINCT name, age FROM table;

1.2聚合函数

SELECT COUNT(id) AS '数量', SUM(id) AS '总和', AVG(id) AS '平均数', MAX(id) AS '最大数', MIN(id) AS '最小数' FROM table;

1.3WHERE

SELECT * FROM table WHERE id = 1;
/* SELECT * FROM user_info_structs WHERE user_info_struct_sequence= '3' OR field_name = '头像'; */
/* SELECT * FROM user_info_structs WHERE user_info_struct_sequence= '1' AND field_name = '头像'; */

1.4模糊查询 LIKE

/*
任意字符 %
单一字符 _
*/
SELECT name WHERE name LIKE '何%';
/*
何% 何(任意个字符)
何_ 何X
何__ 何XX
*/

1.5排序 ORDER BY

/*
默认 ASC 从小到大 升序
DESC 从大到小 降序
*/
SELECT * FROM table ORDER BY id DESC;
SELECT * FROM user_info_structs WHERE field_name LIKE '手机%' ORDER BY user_info_struct_sequence ASC;
/* ORDER BY 要写在 WHERE后面*/

/*多顺序*/
SELECT * FROM table ORDER BY id DESC, name ASC;

1.6分组 GROUP BY

/*
分组只会出现分组数量的列
最好用分组目标作为一个列明区分,然后用count之类的几何函数
ORDER BY放在WHERE后面
HAVING 相当于条件中的条件 放在ORDER BY后面

*/
SELECT field_name,COUNT(user_info_struct_sequence) AS 'num' FROM user_info_structs WHERE user_info_struct_sequence >= 1 GROUP BY field_name HAVING field_name != '手机';

1.7分页LIMIT

/*LIMIT要放在后面,在ORDER BY之后*/

SELECT * FROM table WHERE  id >= 3 ORDER BY age DESC LIMIT 0,10;
SELECT * FROM user_info_structs WHERE user_info_struct_sequence >= 1  ORDER BY field_display_type DESC LIMIT 0,3;
/*想要先切片在排序,需要写子查询*/
SELECT column1, column2
FROM (
         SELECT column1, column2
         FROM table_name
                  LIMIT 10
     ) AS subquery
ORDER BY column1;

二、比较逻辑运算

2.1 AND

SELECT * FROM table WHERE age > 13 AND age < 20;

2.2 BETWEEN < >

SELECT * FROM table WHERE age > 13 AND age < 20;
/*相当于*/
SELECT * FROM table WHERE BETWEEN 13 AND 20;

2.3 OR

SELECT * FROM table WHERE age >= 13 OR sex = 1;

2.4 NULL和''

SELECT * FROM table WHERE sex = '';
SELECT * FROM table WHERE sex IS NULL;
SELECT * FROM table WHERE sex IS NOT NULL;

2.5 !=,<>,NOT

SELECT * FROM table WHERE sex != '';
/*相当与*/
SELECT * FROM table WHERE sex <> '';

三、多表连接

3.1 内连接

/*student是学生表,dept是专业表,差学生所有信息,并获取学生的所在专业ID的名称*/
SELECT s.*, d.name FROM student s INNER JOIN dept d ON s.did = d.did;
SELECT s.*, d.name FROM student s JOIN dept d ON s.did = d.did;
/*不推荐写法*/
SELECT s.*, d.name FROM student s , dept d WHERE s.did = d.did;

3.2 左外连接/右外连接

/*以A表为基准, 查出来的数据A表是满的,*/
-- 左连接
SELECT a.*,b.* FROM ATABLE a LEFT JOIN BTABLE b ON a.bid = b.id;
-- 左外连接
SELECT a.*,b.* FROM ATABLE a LEFT OUTER JOIN BTABLE b ON a.bid = b.id;
-- 以b表为基准
SELECT a.*,b.* FROM BTABLE b LEFT JOIN ATABLE a ON a.bid = b.id;

四、子查询

4.1 =

-- 查询和id等于2的列名一样的数据
SELECT * 
FROM user_info_structs 
WHERE field_name = (
    SELECT field_name 
    FROM user_info_structs 
    WHERE user_info_struct_sequence = 2
    );

4.2 IN

-- 查列名为生日的id的数据
SELECT * 
FROM user_info_structs 
WHERE user_info_struct_sequence IN (
    SELECT user_info_struct_sequence 
    FROM user_info_structs 
    WHERE field_name = "生日"
    );
-- 可以使用NOT IN
-- IN查询一般效率比较低,建议使用多表连接