SQL笔记

SQL 语法

一个数据库通常包含一个或多个表,每个表都有一个名字标记(例如“websites”),表包含带有数据的记录(行)。
常用语法:
use 数据库名 ;用于选择数据库
set names utf8 ;用于设置使用的字符集
SELECT * FROM 表名;读取数据表的信息。
set names utf8 是用于设置编码,可以再在建数据库的时候设置,也可以在创建表的时候设置,或 只是对部分字段进行设置,而且在设置编码的时候,这些地方最好是一致的,这样能最大程度避免数据记录出现乱码。
执行SET NAMES utf8的效果等同于同时设定如下:
SET charactor_set_client = ‘utf8’;
SET charactor_set_connection=’utf8’;
SET charactor_set_results=’utf8’;

SQL 语句后面的分号

某些数据库系统要求每条SQL语句的末端使用分号;分号是数据库系统中分割每条SQL语句的标准方法,这样就可以对服务器的相同请求中执行一条以上的SQL语句。

一些重要的SQL语句

  • SELECT - 从数据库中提取数据
  • UPDATE - 更新数据库中的数据
  • DELETE - 从数据库中删除数据
  • INSERT INTO - 向数据库中插入新数据
  • CREATE DATABASE - 创建新数据库
  • ALTER DATABASE - 修改数据库
  • CREATE TABLE - 创建新表
  • ALTER TABLE - 变更(改变)数据库表
  • DROP TABLE - 删除表
  • CREATE INDEX - 创建索引(搜索键)
  • DROP INDEX - 删除索引

中文乱码

如果数据中出现乱码可以试着用以下办法解决:

避免创建数据库和表出现中文和查看编码的方法

1、 创建数据库的时候:
CREATE DATABASE test
CHARACTER SET ‘utf8’
COLLATE ‘utf8_general_ci ;
2 、建表的时候
CREATE TABLE database_user (
ID varchar(40) NOT NULL default ‘ ‘ ,
UserID varchar(40) NOT NULL default ‘ ‘ ,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
建库和建表时都使用相同的编码格式。如果是已经建了库和表可以通过以下方式进行查询。

查看默认的编码格式

msql> show variables like “%char%” ;
+--------------------------+---------------+ | Variable_name | Value | +--------------------------+---------------+ | character_set_client | gbk | | character_set_connection | gbk | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | gbk | | character_set_server | utf8 | | character_set_system | utf8 |
注: 前两个确定,可以使用set names utf8, set names gbk设置默认的编码格式;

SQL常用

Selectselect distinctwhereand & ororder byinsert intoupdatedelete
假设有数据库,数据表如下,表名Websites
+----+--------------+---------------------------+-------+---------+ | id | name | url | alexa | country | +----+--------------+---------------------------+-------+---------+ | 1 | Google | https://www.google.cm/ | 1 | USA | | 2 | 淘宝 | https://www.taobao.com/ | 13 | CN | | 3 | 菜鸟教程 | http://www.runoob.com/ | 4689 | CN | | 4 | 微博 | http://weibo.com/ | 20 | CN | | 5 | Facebook | https://www.facebook.com/ | 3 | USA | +----+--------------+---------------------------+-------+---------+
  • select 用于从数据库中选取数据
    • 示例:SELECT column_name, column_name FROM table_name;
      或者:SELECT * FROM table_name;
      实例:SELECT name,country FROM Websites; 从Websites表中西选取name和country列;
  • select distinct 用于返回唯一不同的值
    • 示例: SELECT DISTINCT column_name,column_name FROM table_name;
      实例:SELECT DISTINCT country FROM Websites; 仅从Websites表中country列中选取唯一不同的值,也就是去掉country列重复值。
  • where 用于提取那些满足指定条件的记录
    • 示例:SELECT column_name,column_name FROM table_name WHERE column_name operator value;
      实例:SELECT * FROM Websites WHERE country=’CN’; 从Websites表中选取国家为“CN”的所有网站。
      或者:(数值字段,不使用引号)SELECT * FROM Websites WHERE id=1;
      逻辑运算:
      and:同时满足两个条件的值。Select * from table_name where condition_1 and condition_2 ;
      or:满足其中一个。Select * from table_name where condition_1 or condition_2;
      not :满足不包含该条件的值。Select * from table_name where not condition;
      特殊条件:
      空值判断Select * from table_name where column_name is null;
      between and(在两个条件之间的值):Select * from table_name where column_name between value_1 and value_2;
      in(满足多个值中的一个): Select * from table_name where column_name in (value_1,value_2,value_3)
      like(模糊查询)Select * from table_name where column_name LIKE “keyword”;

SQL快速查找

SQL 语句
语法
备注
AND / OR (条件)
SELECT column_name(s) FROM table_name WHERE conditionAND|OR condition
条件关系
ALTER TABLE (用于在已有的表中添加、删除或修改列)
ALTER TABLE table_name ADD column_name datatype or ALTER TABLE table_name DROP COLUMN column_name
增删列
AS (alias) (别名)
SELECT column_name AS column_alias FROM table_name or SELECT column_name FROM table_name AS table_alias
变量别名
BETWEEN (条件范围限制)
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2
条件范围
CREATE DATABASE (创建库)
CREATE DATABASE database_name
创建库
CREATE TABLE (创建表)
CREATE TABLE table_name (column_name1 data_type,column_name2 data_type,column_name2 data_type,...)
创建表
CREATE INDEX (创建索引)
CREATE INDEX index_name ON table_name (column_name) or CREATE UNIQUE INDEX index_name ON table_name (column_name)
创建index
CREATE VIEW
CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition
视图中的字段就是来自一个或多个数据库中的真实的表中的字段
DELETE (删除)
DELETE FROM table_name WHERE some_column=some_value or DELETE FROM table_name (Note: Deletes the entire table!!) DELETE * FROM table_name(Note: Deletes the entire table!!)
删除行、删除表中所有数据(不加where很危险)
DROP DATABASE
DROP DATABASE database_name
直接删除数据库
DROP INDEX
DROP INDEX table_name.index_name (SQL Server)DROP INDEX index_name ON table_name (MS Access)DROP INDEX index_name (DB2/Oracle)ALTER TABLE table_nameDROP INDEX index_name (MySQL)
删除表中的索引
DROP TABLE
DROP TABLE table_name
删除表
GROUP BY
SELECT column_name, aggregate_function(column_name) FROM table_nameWHERE column_name operator value GROUP BY column_name
结合聚合函数,根据一个或多个列对结果集进行分组
HAVING
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
WHERE 关键字无法与聚合函数一起使用。 HAVING 子句可以让我们筛选分组后的各组数据
IN
SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,..)
多个条件
INSERT INTO
INSERT INTO table_name VALUES (value1, value2, value3,....) or INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,....)
插入
INNER JOIN
SELECT column_name(s) FROM table_name1 INNER JOIN table_name2ON table_name1.column_name=table_name2.column_name
inner join 内连接与join是相同的(类似交集)
LEFT JOIN
SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name=table_name2.column_name
left join也是left outer join(一般用小表驱动大表)左表返回所有的行,即使右表中没有匹配。
RIGHT JOIN
SELECT column_name(s) FROM table_name1 RIGHT JOIN table_name2ON table_name1.column_name=table_name2.column_name
同上
FULL JOIN
SELECT column_name(s) FROM table_name1 FULL JOIN table_name2ON table_name1.column_name=table_name2.column_name
full outer join,结合了left join和right join,只要左表和右表其中一个存在匹配
LIKE
SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern
以指定模式的条件查找,一般和通配符等并用
ORDER BY
SELECT column_name(s) FROM table_name ORDER BY column_name [ASC|DESC]
排序,默认正序asc,倒序desc
SELECT
SELECT column_name(s) FROM table_name
选择(可疑指定列)
SELECT *
SELECT * FROM table_name
选择全部列
SELECT DISTINCT
SELECT DISTINCT column_name(s) FROM table_name
选择不重复的
SELECT INTO
SELECT * INTO new_table_name [IN externaldatabase] FROM old_table_name or SELECT column_name(s) INTO new_table_name [IN externaldatabase] FROM old_table_name
从一个表复制数据,然后把数据插入到另一个新表中
SELECT TOP
SELECT TOP number|percent column_name(s)FROM table_name
同limit,限制查找返回数量
TRUNCATE TABLE
TRUNCATE TABLE table_name
删除表中所有行,但是比delete所有行更快,类似delete不加where
UNION
SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2
组合两个或多个SQL查询的结果(不重复)
UNION ALL
SELECT column_name(s) FROM table_name1UNION ALLSELECT column_name(s) FROM table_name2
组合两个或多个SQL查询的结果(包含重复值)
UPDATE
UPDATE table_nameSET column1=value, column2=value,...WHERE some_column=some_value
更新表中的行
WHERE
SELECT column_name(s) FROM table_name WHERE column_name operator value
查询条件

SQL函数

SQL有很多内建的函数,可用于计数和计算。

SQL Aggregate 函数

SQL Aggregate 函数计算从列中取得的值,返回一个单一的值。
有用的 Aggregate 函数:
  • AVG() - 返回平均值
  • COUNT() - 返回行数
  • FIRST() - 返回第一个记录的值
  • LAST() - 返回最后一个记录的值
  • MAX() - 返回最大值
  • MIN() - 返回最小值
  • SUM() - 返回总和

SQL Scalar 函数

SQL Scalar 函数基于输入值,返回一个单一的值。
有用的 Scalar 函数:
  • UCASE() - 将某个字段转换为大写
  • LCASE() - 将某个字段转换为小写
  • MID() - 从某个文本字段提取字符,MySql 中使用
  • SubString(字段,1,end) - 从某个文本字段提取字符
  • LEN() - 返回某个文本字段的长度
  • ROUND() - 对某个数值字段进行指定小数位数的四舍五入
  • NOW() - 返回当前的系统日期和时间
  • FORMAT() - 格式化某个字段的显示方式
SQL函数
语法
备注
AVG()
SELECT AVG(column_name) FROM table_name;
返回某列的平均值
COUNT()
SELECT COUNT(column_name) FROM table_name;
返回匹配指定条件的行数
FIRST()
SELECT FIRST(column_name) FROM table_name;
返回指定的列第一个记录的值;(除了MS Acess大多数数据库是不支持的,可用top 1 或limit 1 )
LAST()
加倒排desc,之后limit 1
MAX()
SELECT MAX(column_name) FROM table_name;
返回指定列的最大值
MIN()
SELECT MIN(column_name) FROM table_name;
返回指定列的最小值
SUM()
SELECT SUM(column_name) FROM table_name;
返回指定列的总和
HAVING()
HAVING 子句可以筛选分组后的各组数据
GROUP BY()
进行分组,可以结合一些聚合函数
EXISTS()
SELECT column_name(s) FROM table_name WHERE EXISTS (SELECT column_name FROM table_name WHERE condition);
用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False
UCASE()
SELECT UCASE(column_name) FROM table_name;
字段的值转换为大写(Uper)
LCASE()
SELECT LCASE(column_name) FROM table_name;
字段的值转换为小写(Lower)
MID()
SELECT MID(column_name,start[,length]) FROM table_name;
文本字段中提取字符
LEN()
SELECT LEN(column_name) FROM table_name;
返回文本字段中值的长度
ROUND()
SELECT ROUND(column_name,decimals) FROM TABLE_NAME;
把数值字段舍入为指定的小数位数(四舍五入)
NOW()
SELECT NOW() FROM table_name;
返回当前系统的日期和时间
FORMAT()
SELECT FORMAT(column_name,format) FROM table_name;
用于对字段的显示进行格式化(DATE_FORMAT(Now(),'%Y-%m-%d'))