sql基础-笔记

wujiawen 发布于

sql基础学习笔记

SQL 对大小写不敏感

SQL 使用单引号来表示字符串的值(大部分数据库系统也接受双引号)

use + 数据库名 选择使用的数据库

1
use Mydb;

重要命令

  • SELECT - 从数据库中提取数据

  • UPDATE - 更新数据库中的数据

  • DELETE - 从数据库中删除数据

  • INSERT INTO - 向数据库中插入新数据

  • CREATE DATABASE - 创建新数据库

  • ALTER DATABASE - 修改数据库

  • CREATE TABLE - 创建新表

  • ALTER TABLE - 变更(改变)数据库表

  • DROP TABLE - 删除表

  • CREATE INDEX - 创建索引(搜索键)

  • DROP INDEX - 删除索引

select

从”table”表中选择所有列

1
select * from table; 

从”table”表中选择某几列

1
select name,sex from table; 

select distinct

从”table”表中选择唯一值
注意:是组合的唯一值
一下sql选择的是 name和sex组合是唯一的值

1
select distinct name,sex from table;

where 条件语句

添加筛选条件
从”table”表中选择id=1的那条记录(所有列)

1
select * from table where id=1; 

运算符 描述

1
2
3
4
5
6
7
8
9
=          -- 等于
<> -- 不等于。注释:在 SQL 的一些版本中,该操作符可被写成 !=
> -- 大于
< -- 小于
>= -- 大于等于
<= -- 小于等于
BETWEEN -- 在某个范围内
LIKE -- 搜索某种模式
IN -- 指定针对某个列的多个可能值

逻辑运算符

1
2
and
or

order by 关键字

ORDER BY 关键字默认按照升序对记录进行排序(ASC) (从上到下,从小到大)
如果需要按照降序对记录进行排序,您可以使用 DESC 关键字

Websites表:

1
2
3
4
5
country   alexa
CN 13
CN 20
USA 12
USA 129

操作:

1
2
SELECT * FROM Websites
ORDER BY country,alexa;

ORDER BY 多列的时候,先按照第一个column name排序,在按照第二个column name排序; 如上面的例子

  • 先将country值这一列排序,同为CN的排前面,同属USA的排后面;
  • 然后在同属CN的这些多行数据中,再根据alexa值的大小排列。
  • ORDER BY 排列时,不写明ASC DESC的时候,默认是ASC

desc 或者 asc 只对它紧跟着的第一个列名有效,其他不受影响,仍然是默认的升序

1
2
3
order by A,B        -- 这个时候都是默认按升序排列
order by A desc,B -- 这个时候 A 降序,B 升序排列
order by A ,B desc -- 这个时候 A 升序,B 降序排列

insert into

向表中插入新记录
需注意的是:要求必填的字段必须有值

1
insert into table (username, password) values ('wjw', '123')

若没有指定插入的列名,则需要列出插入行的每一列数据

update

1
2
3
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;

请注意 SQL UPDATE 语句中的 WHERE 子句!
WHERE 子句规定哪条记录或者哪些记录需要更新
如果省略了 WHERE 子句,所有的记录都将被更新!

在 MySQL 中可以设置 sql_safe_updates
当该参数开启的情况下,必须在update 语句后携带 where 条件,否则就会报错

1
set sql_safe_updates=1;

delete 语句

1
2
DELETE FROM table_name
WHERE some_column=some_value;

请注意 SQL DELETE 语句中的 WHERE 子句!
WHERE 子句规定哪条记录或者哪些记录需要删除
如果省略了 WHERE 子句,所有的记录都将被删除!

limit

MySQL 语法

1
2
3
SELECT column_name(s)
FROM table_name
LIMIT number;

like

模糊搜索

语法

1
2
3
4
5
6
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern;

SELECT * FROM Websites
WHERE name LIKE 'G%';

通过使用 NOT 关键字,可以选取不匹配模式的记录

1
2
SELECT * FROM Websites
WHERE name NOT LIKE '%oo%';

通配符

在 SQL 中,通配符与 SQL LIKE 操作符一起使用

1
2
3
4
5
6
7
8
9
%           -- 替代 0 个或多个字符

_ -- 替代一个字符

[charlist] -- 正则 字符列中的任何单一字符

[^charlist] -- 正则 不在字符列中的任何单一字符

[!charlist]

示例:

替代一个或多个字符

1
2
3
4
5
SELECT * FROM Websites
WHERE url LIKE 'https%';

SELECT * FROM Websites
WHERE url LIKE '%oo%';

替代一个字符

1
2
3
4
5
SELECT * FROM Websites
WHERE name LIKE '_oogle';

SELECT * FROM Websites
WHERE name LIKE 'G_o_le';

MySQL 中使用 REGEXP 或 NOT REGEXP 运算符 (或 RLIKE 和 NOT RLIKE) 来操作正则表达式。

选取 name 以 “G”、”F” 或 “s” 开始的所有网站:

1
2
SELECT * FROM Websites
WHERE name REGEXP '^[GFs]';

选取 name 以 A 到 H 字母开头的网站:

1
2
SELECT * FROM Websites
WHERE name REGEXP '^[A-H]';

选取 name 不以 A 到 H 字母开头的网站:

1
2
SELECT * FROM Websites
WHERE name REGEXP '^[^A-H]';

in 操作符

IN 操作符允许您在 WHERE 子句中规定多个值

1
2
3
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...);

between 操作符

BETWEEN 操作符用于选取介于两个值之间的数据范围内的值

1
2
3
SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;

示例:

1
2
3
4
5
SELECT * FROM Websites
WHERE alexa BETWEEN 1 AND 20;

SELECT * FROM Websites
WHERE alexa NOT BETWEEN 1 AND 20;

请注意,在不同的数据库中,BETWEEN 操作符会产生不同的结果!

  • 在某些数据库中,BETWEEN 选取介于两个值之间但不包括两个测试值的字段

  • 在某些数据库中,BETWEEN 选取介于两个值之间且包括两个测试值的字段

  • 在某些数据库中,BETWEEN 选取介于两个值之间且包括第一个测试值但不包括最后一个测试值的字段

因此,请检查数据库是如何处理 BETWEEN 操作符!

mysql中,两边都是闭区间(即包括两个测试值的字段)

别名

为表名称或列名称指定别名
基本上,创建别名是为了让列名称的可读性更强

示例:

为列指定别名

1
2
SELECT name AS n, country AS c
FROM Websites;

把三个列(url、alexa 和 country)结合在一起,并创建一个名为 “site_info” 的别名:
需要 concat 函数

1
2
SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info
FROM Websites;

为表指定别名

1
2
3
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="菜鸟教程";

使用别名的情景:

  • 在查询中涉及超过一个表
  • 在查询中使用了函数
  • 列名称很长或者可读性差
  • 需要把两个列或者多个列结合在一起

NULL 值

NULL 值代表遗漏的未知数据

默认地,表的列可以存放 NULL 值

NULL 值无法使用比较运算符来测试,比如 =、< 或 <>

必须使用 IS NULL 和 IS NOT NULL 操作符

示例

1
2
3
4
5
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL

SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL

IFNULL() 函数

IFNULL() 函数用于处理 NULL 值
如果值是 NULL 则 IFNULL() 返回 0,否则,取原值

示例

1
2
3
4
5
6
SELECT ProductName, UnitPrice * (UnitsInStock + IFNULL(UnitsOnOrder, 0))
FROM Products

-- 或
SELECT ProductName,UnitPrice * (UnitsInStock + COALESCE(UnitsOnOrder, 0))
FROM Products