SQL:结构化查询语言,主要由四个部分组成:
数据定义语言(DDL):主要用于定义数据库、表等,其中包括CREATE,ALTER,DROP.
数据操作语言(DML):主要用于对数据库进行添加、修改和删除操作,包括INSERT、UPDATE、DELETE
数据查询语言(DQL):主要用于查询数据,也就是SELETE
数据控制语言(DCL):主要用于控制用户的访问权限,其中包括:
- GRANT:给用户增加权限
- REVOKE语句用于收回用户的权限
- COMMIT语句用于提交事务,ROLLBACK语句用于回滚事务
常用数据库:
- Oracle
- Mysql
- SQL Server
- DB2
- MongoDB
在DOS下,Mysql登入语句:
mysql -h localhost -u root -p
创建数据库的语法格式:
CREATE DATABASE 数据库名
修改数据库编码的基本语法格式:
ALTER DATABASE 数据库名 DEFAULT Character set 编码方式 collate 编码方式_bin
删除数据库:
DROP DATABASE 数据库名
数据类型:
1、整数类型
tinyInt(1字节) 、smallInt(2字节)、 mediumInt(3字节) 、Int(4字节) 、bigInt(8字节)
2、浮点数类型和定点数类型
float(4字节) 、double(8字节)
decimal(m,d)(m+2字节):M:数据长度,D:小数点后的长度
3、日期与时间类型
YEAR 、DATE 、 TIME 、 DATETIME 、 TIMESTAMP
注:如果插入数值不合法,系统会自动插入0值
4、字符串和二进制类型(存字符串、图片、声音等)
char binary
varchar varbinary
Bolb:用于表示二进制大数据
TEXT:用于表示大文本数据
ENUM:枚举类型
SET:字符串对象,有0或多个值
BIT:表示位字段类型
注:char(4)类型,不管插入值的长度多少,始终占四个字节,而varchar(4):占(实际长度+1)字节
查看数据表/数据库:
show create table/database 表名/数据库名
使用DESCRIBE语句可以查看表的字段信息
语句:DESCRIBE 表名 或者 DESC 表名
修改表名:ALTER TABLE 旧表名 RENAME [TO] 新表名;
修改字段名:ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型
修改字段的数据类型:ALTER TABLE 表名 MODIFY 字段名 数据类型
添加字段:ALTER TABLE 表名 ADD 新字段名 数据类型 [约束条件] [FIRST|AFTER 已存在字段名]
删除字段:ALTER TABLE 表名 DROP 字段名
修改字段的排列位置:ALTER TABLE 表名 MODIFY 字段1 数据类型 FIRST|AFTER 字段2
删除表:DROP TABLE 表名
表的约束有:
1、PRIMARY KEY :主键 2、FOREIGN KEY :外键 3、NOT NULL :非空 4、UNIQUE :唯一 5、DEFAULT:默认值约束
索引:
普通索引:由KEY 或 INDEX 定义
唯一性索引:由UNIQUE定义
全文索引:由FULLTEXT定义,只能创建在CHAR、VARCHAR或TEXT类型的字段上,而且只有MgISAM存储引擎支持
单列索引:在表中单个字段上创建索引
多列索引:在表中多个字段上创建索引,只有查询条件中使用了这些字段中的第一个字段,该索引才会被使用
空间索引:由Spatial定义,它只能创建在空间数据类型的字段上
注:索引提高数据查询速度,但会占用一定的磁盘空间
创建表的时候创建索引语句:
CREATE TABLE 表名(字段名 数据类型
[unique|fulltext|spatial] index|key
[别名](字段名[(长度)])[ASC|DESC]
)
查看索引是否被使用,可以使用Explain
语句:Explain select * from 表名 where 字段=值 G
使用CREATE INDEX 语句在已经存在的表上建索引
语句:CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX 索引名 ON 表名(字段名[(长度)])[ASC|DESC]
使用ALTER TABLE 在已存在的表上建索引
语句:ALTER TABLE 表名 ADD [unique|fulltext|spatial] index 索引名(字段名[(长度)])[ASC|DESC]
删除索引:
ALTER TABLE 表名 DROP INDEX 索引名
DROP INDEX 索引名 ON 表名
注:索引建立后,当检索时会自动判断有无可用索引
插入语句:
INSERT INTO 表名(字段1,字段2,.....) VALUES(值1,值2......)
INSERT INTO 表名 VALUES (值1,值2......)
可以为表中指定的字段或者全部字段添加数据:INSERT INTO 表名 SET 字段1=值1[,字段2=值2,......]
更新数据:
UPDATE 表名 SET 字段1=值1[,字段2=值2,......] [where条件表达式]
删除数据:
DELETE FROM 表名[where条件表达式]
TRUNCATE [TABLE] 表名
二者的区别:
1、DELETE 语句是DML语言,而TRUNCATE是DDL语言
2、DELETE 后可以跟WHERE子句,而TRUNCATE只能删除表中的所有记录
3、使用TRUNCATE语句删除表中数据后,再次添加记录时,自动增加字段的默认初始值重新由1开始,而DELETE为删除时该字段的最大值加1
4、使用DELETE语句,每删除一条记录都会在日志中记录,而TRUNCATE不会在日志中记录删除的内容,因此TRUNCATE的执行效率更高
(因为DELETE语句删除会有记录,所以在事务中可以使用回滚来恢复数据)
查询语句:
SELETE [DISTINCT] *|{字段1,字段2,......} FROM 表名
[WHERE条件表达式]
[Group by 字段名[having条件表达式]]
[Order by 字段名[ASC|DESC]]
[LIMIT [OFFSET]记录数]
注:使用*星号,会因为获取的数据过多而降低查询的效率,WHERE条件表达式中的关系运算符:<>和!=效果一样,都表示不等于
带IN关键字的查询:
SELECT * |{字段1,字段2,...} from 表名 where 字段名 [NOT] IN (元素1,元素2,......)
带BETWEEN AND 关键字的查询:
SELECT * |{字段1,字段2,,..} from 表名 where 字段名 [NOT] BETWEEN 值1 AND 值2
空值查询:
SELECT * |{字段1,字段2,...} from 表名 where字段名 IS [NOT] NULL
DISTINCT:
SELECT DISTINCT 字段1,字段2.... from 表名
注:当DISTINCT作用于多字段,必须这些字段都相同,才会被认作是重复记录
带LIKE关键字的查询
SELECT * |{字段1,字段2,...} from 表名 where字段名[]NOTLIKE '匹配字符串'
匹配字符串可以是普通字符串,也可以是包含百分号和下划线
百分号通配符:可以匹配任意长度的字符串
下划线通配符:只匹配单个字符,匹配多个字符要多个下划线通配符
注:下划线之间不能有空格,否则就如以下例子所示:M_ _QL只能匹配MY SQL不能匹配MYSQL
如果要匹配字符串中的百分号和下划线,就需要转义
AND 、OR关键字查询:
AND:同时满足多个条件
OR:满足一个即可
注:AND的优先级高于OR
聚合函数:
COUNT():返回某列的行数
语法格式:SELECT COUNT(*) FROM 表名
SUM:返回某列值的和
语法格式:SELECT SUM(字段名) FROM 表名
AVG():返回某列的平均值
语法格式:SELECT AVG(字段名) FROM 表名
MAX():返回某列的最大值
语法格式:SELECT MAX(字段名) FROM 表名
MIN():返回某列的最小值
语法格式:SELECT MIN(字段名) FROM 表名
对查询结果排序
order by 字段1[ASC|DESC] ,字段2[ASC|DESC]....
默认是ASC升序
排序先按字段1排序,然后再对字段1排序好的相同的值再进行字段2的排序,以此类推
注:字段值为NULL的可以被认为是最小值
分组查询:Group by
单独使用Group by 分组,查询的是每个分组中的一条记录,所以一般与聚合函数一起使用
例如:Select count(*),gender from student group by gender;
where与having作用相同:区别在于having后可以跟聚合函数,而where不能
Limit限制查询结果的数量:可以实现分页
语法格式:LIMIT [OFFSET,]记录数
为表取别名:
select * from 表名 [as] 别名
为字段取别名:select 字段1[as]别名[,字段2 [as] 别名,......] from 表名
这样查询结果显示的就是别名
外键
定义:指引用另一个表中的一列或多列,被引用的列应该具有主键约束或唯一性约束
为表添加外键约束:
alter table 表名 add constraint FK_ID foreign key(外键字段名) references 外表表名(主键字段名)
constraint:约束 FK_ID:外键约束名
删除外键约束:
alter table 表名 drop foreign key 外键名
注:但外键还在,可以直接alter table 表名 add foreign key(外键字段名) references 外表名(主键字段名)的方式重新建立与另一个表的外键约束
操作带有外键的表:
在两个具有关联关系的表中删除数据时,一定要先删除从表中的数据,然后再删除主表中的数据,否则会报错,
即:不能直接删除带有从表参照物的外键字段,如果外键字段不是非空,可以通过先将他们置空,再删除
例如:
GID是STUDENT的外键,GRADE主键id的参照物,不能直接DELETE FROM STUDENT WHERE GID =1的方式删除记录;
可以通过其他字段删除,where name = '小';或者先将ID置为NULL
连接查询:
1、交叉连接
语法格式:select * from 表1 cross join 表2
查询两个表中所有数据组合,eg:表1有四条记录,表2也有四条记录,那么显示结果就是16条记录
2、内连接(简单连接或自然连接)
语法格式:Select 查询字段 from 表1 [inner] join 表2 on 表1.字段=表2.字段
在Mysql中,可以用where条件语句来实现同样的功能,select 查询语句 from 表1,表2 where 表1.字段=表2.字段
区别:inner join 语句后不可以直接添加其他条件,而where 可以
3、外连接
语法格式:select 所查字段 from 表1 left|right [outer] join 表2 on 表1.字段=表2.字段 [where条件表达式]
左右连接功能正好相反
注:如果左表的某条记录在右表中不存在,则在右表中显示为空(左连接)
子查询:
1、IN:返回一个数据列
2、EXISTS:返回true或false
3、any:只要满足内层子查询中的任意一个比较条件,就返回一个结果作为外层查询条件
4、all:需要满足所有内层查询条件