一、SQL简介
- SQL:structured query language的缩写
- 中文名称:结构化查询语言
- 作用:是一种定义、操作、管理关系数据库的句法。大多数关系型数据库都支持。
- 结构化查询语言的工业标准由ANSI(美国国家标准学会,ISO的成员之一)维护。
- 组成:
DQL:数据查询语言
DML:数据操作语言
DDL:数据定义语言
DCL:数据控制语言
TPL:事务处理语言
CCL:指针控制语言
二、常用数据库
- Oracle
- MySQL
- DB2
- Informix
- Sybase
- SQL Server
- ProstgreSQL面向对象数据库
- Access
- SQLite
三、MySQL安装与配置
四、数据库服务器、数据库和表的关系
- 所谓安装数据库服务器,只是在机器上装了一个数据库管理程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。
- 为保存应用中实体的数据,一般会在数据库创建多个表,以保存程序中实体的数据。
- 数据库服务器、数据库和表的关系如图所示:
五、数据在数据库中的存储方式
六、DDL数据定义语言
DDL:Data Definition Language
作用:用于描述数据库中要存储的现实世界实体的语言。即创建数据库和表的结构。
常用关键字:CREATE ALTER DROP TRUNCATE
七、创建数据库
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_specification [, create_specification] ...]
create_specification:
[DEFAULT] CHARACTER SET charset_name //指定字符集
[DEFAULT] COLLATE collation_name // 指定数据库字符集的比较方式
八、查看、删除数据库
显示数据库语句:SHOW DATABASES
显示数据库创建语句:SHOW CREATE DATABASE db_name
数据库删除语句:DROP DATABASE [IF EXISTS] db_name
九、修改、备份、恢复数据库
ALTER DATABASE [IF NOT EXISTS] db_name [alter_specification, [, alter_specification] ...]
alter_specification:
[DEFAULT] CHARACTER SET charset_name
[DEFAULT] COLLATE collation_name
十、创建表(基本语句)
CREATE TABLE table_name
(
field1 datatype,
field2 datatype,
field3 datatype
)character set 字符集 collate 校对规则
field:指定列名
datatype:指定列类型
注意:创建表前,要先使用use db语句使用库。
注意:创建表时,要根据需要保存的数据创建相应的列,并根据数据的类型定义相应的列类型。
十一、MySQL常用数据类型
分类 | 数据类型 | 说明 |
---|---|---|
数值类型 | BIT(M) TINYINT[UNSIGNED][ZEROFILL] BOOL,BOOLEAN SMALLINT[UNSIGNED][ZEROFILL] INT[UNSIGNED][ZEROFILL] BIGINT[UNSIGNED][ZEROFILL] FLOAT[(M,D)][UNSIGNED][ZEROFILL] DOUBLE[(M,D)][UNSIGNED][ZEROFILL] | 位类型。M指定位数,默认值1,范围1-64 带符号的范围是-128到127,无符号0到255 使用0或1表示真假 2的16次方 2的32次方 2的64次方 M指定显示长度,d指定小数位数 表示比float精度更大的小数 |
文本、二进制类型 | CHAR(size) char(20) VARCHAR(size) varchar(20) BLOB LONGBLOB TEXT(clob) LONGTEXT(longclob) | 固定长度字符串 可变长度字符串 二进制数据 大文本 |
时间日期 | DATE/DATETIME/TimeStamp | 日期类型(YYYY-MM-DD) (YYYY-MM-DD HH:MM:SS),TImeStamp表示时间戳,它可用于自定记录insert、update操作的时间 |
VARCHAR、BLOB和TEXT是变长类型。每个类型的存储需求取决于列值的实际长度。
十二、修改表
使用ALTER TABLE语句追加,修改,或删除列的语法
追加列
ALTER TABLE table_name ADD (column datatype [DEFAULT expr] [, column datatype] ...);
修改列
ALTER TABLE table_name MODIFY column datatype [DEFAULT expr] [, column datatype] ... ;
删除列
ALTER TABLE table_name DROP (column);
修改表的名称:
Rename table 表名 to 新表名;
修改表的字符集
alter table table_name character set utf-8;
十三、数据操纵语言
DML:Data Manipulation Language
作用:用于向数据库表中插入、删除、修改数据
常用关键字:INSERT UPDATE DELETE
十四、Insert语句
- 使用Insert语句向表中插入数据
INSERT INTO table [(column [, column...])] VALUES (value [, value...]);
- 插入的数据应与字段类型相同。
- 数据的大小应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。
- 在values中列出的数据位置必须与被加入的列的排列位置相对应。
- 字符和日期型数据应包含在单引号中。
- 插入空值,不指定或insert into table value (null)
十五、MySQL中文乱码
MySQL有六处使用了字符集,分别为:client、connection、database、results、server、system
- client是客户端使用的字符集
- connection是连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型就按照服务器端默认的字符集设置
- database是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。
- results是数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。
- server是服务器安装时指定的默认字符集设定
- system是数据库系统使用的字符集设定
十六、update语句
- 使用update语句修改表中数据
update table_name SET col_name1=expr1 [, col_name2=expr2 ... ] [WHERE where_definition]
- UPDATE语法可以用新值更新原有表行中的各列
- set子句指示要修改哪些列和要给予哪些值
- where子句指定应更新哪些行,如果没有where子句,则更新所有的行
十七、delete语句
- 使用delete语句删除表中数据
delete from table_name [where where_definition]
- 如果不使用where子句,将删除表中所有数据。
- delete语句不能删除某一列的值(可使用update)。
- 使用delete语句仅删除记录,不删除表本身。如果要删除表,使用drop table语句。
- 同insert和update一样,从一个表中删除记录将引起其它表的参照完整性问题,在修改数据库数据时,头脑中应该始终不要忘记这个潜在的问题。
- 删除表中数据可使用TRUNCATE TABLE语句,它和delete有所不同,参照MySQL文档。
十八、DQL数据查询语言
- DQL:Data Query Language
- 作用:查询数据
- 常用关键字:SELECT
十九、select语句
- 基本的select语句
SELECT [DISTINCT] *|{column1, column2, column3...} FROM table;
- select 指定查询哪些列的数据。
- column指定列名。
- *号代表查询所有列
- From指定查询哪张表
- DISTINCT可选,指定显示结果时,是否提出重复数据。
- 在select语句中可使用表达式对查询的列进行运算
SELECT * | {column1 | expression, column2 | expression, ...} FROM table;
- 在select语句中可使用as语句
SELECT column as 别名 from 表名
- 在where子句中经常使用的运算符
比较运算符 | > < >= <= = <> | 大于、小于、大于等于、小于等于、等于、不等于 |
BETWEEN...AND... | 显示在某一区间的值(含头含尾) | |
IN(set) | 显示在in列表中的值,例如:in(100,200) | |
LIKE | 模糊查询 | |
IS NULLL | 判断是否为空 | |
逻辑运算符 | AND | 多个条件同时成立 |
OR | 多个条件任一成立 | |
NOT | 不成立,例如:where not(salary>100) |
like语句中,%代表另个或多个任意字符,_代表一个任意字符。
- 使用order by子句排序查询结果。
SELECT column1, column2, column3... FROM table ORDER BY column asc|desc;
- order by指定排序的列,排序的列即可是表中的列名,也可以是select语句后指定的列名。
- asc升序、desc降序
- order by子句应位于select语句的结尾。
二十、数据完整性
- 数据完整性是为了保证插入到数据中的数据是正确的,它防止了用户可能的输入错误。
- 数据完整性主要分为以下三类:
- 一、实体完整性:规定表的一行(即每一条记录)在表中是唯一的实体。实体完整性通过表的主键来实现。
- 二、域完整性:指数据库表的列(即字段)必须符合某种特定的数据类型或约束。比如NOT NULL
- 三、参照完整性:保证一个表的外键和另一个表的主键对应。
二十一、定义表的约束
- 定义主键约束
primary key:不允许为空,不允许重复
删除主键:alter table table_name drop primary key;
- 定义主键自动增长
auto_increment
- 定义唯一约束
unique
- 定义非空约束
not null
- 定义外键约束
constraint ordersid_FK foreign key(ordersid) references orders(id);
二十二、DQL数据查询语言
- 连接查询
- 交叉连接(cross join):不带on子句,返回连接表中所有数据行的笛卡尔积。
- 内连接(inner join):返回连接表中符合连接条件及查询条件的数据行。
- 外链接:分为左外连接(left out join)、右外连接(right out join)。与内连接不同的是,外连接不仅返回表中符合连接条件及查询条件的数据行,也返回左表(左外连接时)或右表(右外连接时)中仅符合查询条件但不符合连接条件的数据行。
- 子查询
- 联合查询
- 报表查询
二十三、连接查询
连接查询的from子句的连接语法格式为:
from table_name1 join_type table_name2 [on (join_condition)][where (query_condition)]
其中,table_name1和table_name2表示参与连接操作的表,table_name1为左表,table_name2为右表。on子句设定连接条件,where子句设定查询条件,join_type表示连接类型。
二十四、交叉连接查询
交叉连接查询customers表和orders表
select * from customer cross join orders;
select * from customer, orders;
二十五、内连接查询
- 显示内连接:使用inner join关键字,在on子句中设定连接条件
select * from customer c inner join orders o on c.id = o.customer_id;
- 隐式内连接:不包含inner join关键字和on关键字,在where子句中设定连接条件
select * from customer c, orders o where c.id = o.customer_id;
二十六、左外连接查询
- 使用left outer join关键字,在on子句中设定连接条件
select * from customer c left outer join orders o on c.id = o.customer_id;
查询结果不仅包含符合c.id = o.customer_id连接条件的数据行,还包含customers左表中的其它数据行
- 带查询条件的左外连接查询,在where子句中设定查询条件
select * from customer c left outer join orders o ON c.id = o.customer_id where o.price > 250;
二十七、右外连接查询
- 使用right outer join关键字,在on子句中设定连接条件
select * from customer c right outer join orders o on c.id = o.customer_id;
查询结果不仅包含c.id=o.customer_id连接条件的数据行,还包含orders右表中的其它数据行
- 带查询条件的右外连接查询,在where子句中设定查询条件
select * from customer c right outer join orders o on c.id=o.customer_id where o.price > 200;
二十八、子查询
- 子查询也叫嵌套查询,是指在select子句或者where子句中又嵌入select查询语句
二十九、联合查询
- 联合查询能够合并两条查询语句的查询结果,去掉其中的重复数据行,然后返回没有重复数据行的查询结果。联合查询使用union关键字。
- select * from orders where price > 200 union select * from orders where customer_id =1;
三十、报表查询
- 报表查询对数据行进行分组统计,其语法格式为:
[select ...] from ... [where ...] [group by ...] [having ...] [order by ...]
- 其中group by子句指定按照哪些字段分组,having子句设定分组查询条件。在报表查询中可以使用SQL函数。
三十一、合计函数 - count
- count(列名)返回某一列,行的总数
select count(*) | count(列名) from table_name where where definition
三十二、合计函数 - SUM
- sum函数返回满足where条件的行的和
select sum(列名) {, sum(列名) ...} from table_name [where where_definition]
三十三、合计函数 - AVG
- AVG函数返回满足where条件的一列的平均值
select avg(列名) {, avg(列名) ...} from table_name [where where_definition]
三十四、合计函数 - MAX/MIN
- max/min函数返回满足where条件的一列的最大/最小值
select max(列名) from table_name [where where_definition]
三十五、select语句
- 使用group by子句对列进行分组
select column1, column2, column3 ... from table group by column;
- 使用having子句过滤
select column1, column2, column3 ... from table group by column having...
三十六、时间日期相关函数
ADDTIME(date2, time_interval) | 将time_interval加到date2 |
CURRENT_DATE() | 当前日期 |
CURRENT_TIME() | 当前时间 |
CURRENT_TIMESTAMP() | 当前时间戳 |
DATE(datetime) | 返回datetime的日期部分 |
DATE_ADD(date2, INTERVAL d_value d_type) | 在date2中加上日期或时间 |
DATE_SUB(date2, INTERVAL d_value d_type) | 在date2上减去一个时间 |
DATEDIFF(date1, date2) | 两个时间差 |
NOW() | 当前时间 |
YEAR|MONTH|DATE(datetime) | 年月日 |
三十七、字符串相关函数
CHARSET(str) | 返回字符串字符集 |
CONCAT(string2 [, ...]) | 连接字符串 |
INSTR(string, substring) | 返回substring在string中出现的位置,没有返回0 |
UCASE(string2) | 转换成大写 |
LCASE(string2) | 转换成小写 |
LEFT(string2, length) | 从string2中的左边起取length个字符 |
LENGTH(string) | string长度 |
REPLACE(str, search_str, replace_str) | 在str中用replace_str替换search_str |
STRCMP(string1, string2) | 逐字符比较两字符串大小 |
SUBSTRING(str, position [, length]) | 从str的position开始,取length个字符 |
LTRIM(string2) RTRIM(string2) trim | 去除前端空格或后端空格 |
三十八、数学相关函数
ABS(number2) | 绝对值 |
BIN(decimal_number) | 十进制转二进制 |
CEILING(number2) | 向上取整 |
CONV(number2, from_base, to_base) | 进制转换 |
FLOOR(number2) | 向下取整 |
FORMAT(number, decimal_places) | 保留小数位数 |
HEX(DecimalNumber) | 转十六进制 |
LEAST(number, number2 [, ...]) | 求最小值 |
MOD(numerator, denominator) | 求余 |
RAND([seed]) | RAND([seed]) |
三十九、数据的备份与恢复
-
数据库备份
mysqlump -u root -psorry
test>test.sql
-
数据库恢复
- 创建数据库并选择该数据库
- SOURCE数据库文件
- 或者:mysql -u root -psorry test<test.sql