数据库基础知识学习

SQL:结构化查询语言,主要由四个部分组成:

数据定义语言(DDL):主要用于定义数据库、表等,其中包括CREATE,ALTER,DROP.

数据操作语言(DML):主要用于对数据库进行添加、修改和删除操作,包括INSERT、UPDATE、DELETE

数据查询语言(DQL):主要用于查询数据,也就是SELETE

数据控制语言(DCL):主要用于控制用户的访问权限,其中包括:

  1. GRANT:给用户增加权限
  2. REVOKE语句用于收回用户的权限
  3. COMMIT语句用于提交事务,ROLLBACK语句用于回滚事务

常用数据库:

  1. Oracle
  2. Mysql
  3. SQL Server
  4. DB2
  5. 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:需要满足所有内层查询条件

posted @ 2018-03-18 21:18  PottyHarry  阅读(395)  评论(0编辑  收藏  举报