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常用
Select
、select distinct
、where
、and & or
、order by
、insert into
、update
、delete
假设有数据库,数据表如下,表名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')) |