简介
如果懒得安装 可以使用牛客网提供的 https://www.nowcoder.com/practice/1bfe3870034e4efeb4b4aa6711316c3b?tpId=82&&tqId=38359&rp=1&ru=/ta/sql&qru=/ta/sql/question-ranking
https://www.runoob.com/sql/sql-where.html 菜鸟sql 学习
刷题数据库.
limit
选取从上到下限定的数据
where <title>
like '%m'
选中 想要的title 有 m结尾的.
select distinct ...
distinct 语义 不同
选择不同的 select distinct grade_num from grade_info;
where
SELECT column_name,column_name
FROM table_name
WHERE column_nameoperator
value;
所有的运算符
运算符 | 描述 |
---|---|
= | 等于 |
<> | 不等于。注释:在 SQL 的一些版本中,该操作符可被写成 != |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN | 在某个范围内 |
LIKE | 搜索某种模式 |
IN | 指定针对某个列的多个可能值 |
AND OR
如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。
select user_id,grade_num from grade_info
where user_id=1 and grade_num = 1;
select user_id,grade_num from grade_info
where user_id=1 or grade_num = 1;
组合成复杂的表达式
select user_id,grade_num from grade_info
where user_id=1
AND (grade_num=1 or grade_num = 3);
order by
排序关键字
语法
SELECT column_name,column_name
FROM table_name
ORDER BY column_name,column_name ASC|DESC;
select user_id,grade_num from grade_info
order by user_id DESC;
select user_id,grade_num from grade_info
order by user_id ASC;
INSERT INTO
语法
INSERT INTO table_name
VALUES (value1,value2,value3,...);
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
Example:
INSERT INTO grade_info (user_id, grade_num, type)
VALUES (5, 1000, 200);
delete
- 语法
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;
- example
update grade_info
set user_id = 100, type = 'delete'
where grade_num=1;
- TIPS
执行没有 WHERE 子句的 UPDATE 要慎重,再慎重。
在 MySQL 中可以通过设置 sql_safe_updates 这个自带的参数来解决,当该参数开启的情况下,你必须在update 语句后携带 where 条件,否则就会报错。
set sql_safe_updates=1; 表示开启该参数
delete
语义: 删除
- 语法
DELETE FROM table_name
WHERE some_column=some_value;
delete from grade_info
where user_id=1;
删除所有数据
DELETE FROM table_name;
SQL 通配符
在SQL中, 通配符有如下几种
运算符 | 描述 |
---|---|
% | 替代0个或多个字符 |
_ | 替代一个字符 |
[charlist] | 字符列中的任何单一字符 |
[^charlist] 或 [!charlist] | 不在字符列中的任何单一字符 |
[1] | 以字符列开头的字符串 |
[charlist]$ | 以字符列结尾的字符串 |
- example
select * from grade_info
where type like 'ad_';
IN
即在列表之中
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...);
- example
select * from grade_info
where grade_num in (3,2,4);
BETWEEN
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
select * from grade_info
where grade_num between 1 and 3;
- tips
包括端点
别名 AS
SELECT column_name AS alias_name
FROM table_name;
SELECT column_name(s)
FROM table_name AS alias_name;
- example
SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info
FROM Websites;
CONCAT 连接的意思, 将这些数据连接
SELECT w.name, w.url, a.count, a.date
FROM Websites AS w, access_log AS a
WHERE a.site_id=w.id and w.name="菜鸟教程";
join
重点: 考察左连 右连
INNER JOIN:如果表中有至少一个匹配,则返回行
LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
FULL JOIN:只要其中一个表中存在匹配,则返回行
INNER JOIN
简单来说将两个表 连接成一个表进行查询.
SELECT Websites.id, Websites.name, access_log.count, access_log.date
FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id;
left join
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
注意 和 on 匹配.
可以看到包含user的所有信息, 当右边不存在时候结果为null. 但是这里显示的是none. 应该是应该显示处理了
1|tm|1|1
2|wwy|None|None
3|zk|5|3
3|zk|4|3
3|zk|3|3
3|zk|2|3
3|zk|1|3
4|qq|None|None
5|lm|None|None
right join
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;
full join
mysql 不支持 full outer join
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;
UNION
选取不同的值 UNION ALL 来选取重复的值!
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
SELECT INTO
复制到新表
mysql 不支持, 先不写了
INSERT INTO SELECT
从一个表中赋值所有的列插入到另一个已存在的表中
INSERT INTO table2
SELECT * FROM table1;
INSERT INTO Websites (name, country)
SELECT app_name, country FROM apps;
INSERT INTO user (id, name)
select user_id, type from grade_info;
FOREIGN KEY
外键, 用来在建立表的时候就构建连接关系, 防止破坏标的连接关系.
ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
视图
视图总是显示最新的数据!每当用户查询视图时,数据库引擎通过使用视图的 SQL 语句重建数据。
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
可以如此查询视图
SELECT * FROM [Current Product List]
[Current Product List] 是创建出来的视图
IS NULL IS NOT NULL
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL
IFNULL(UnitsOnOrder,0) 如果 UnitsOnOrder 是 NULL 那么给他赋值为0
AVG
SELECT AVG(column_name) FROM table_name
group by
以什么标题来进行聚合, 就是合并显示. 通常带上SQL的各种函数.
select user_id, sum(grade_num) as num from
grade_info
group by user_id;
having
因为 where 不能和 聚合函数 group by 一起使用.
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value;
# EXISTS 接 子查询
SELECT Websites.name, Websites.url
FROM Websites
WHERE EXISTS (SELECT count FROM access_log WHERE Websites.id = access_log.site_id AND count > 200);
charlist ↩︎