0%

My SQL笔记

My SQL笔记

第一章、数据库的介绍

数据库定义:数据库是指严格按照数据结构来组织、存储和管理数据的仓库。

一、数据库的功能:

​ 1、可以结构化存储大量的数据信息,方便用户进行有效的检索和访问。

​ 2、可以有效的保持数据信息的一致性、完整性,降低数据的重复。

​ 3、满足应用的共享和安全方面的要求。

​ 4、数据库技术能够智能化的分析,产生新的有用信息。

二、常用数据库:

​ 1、SQLSevrver:是微软公司的数据库产品。直接面向Microsoft windows操作系统。

​ 2、Oracle:世界上最好的、最广泛的数据库系统,大中小型计算机,能适应70多种操作系统

​ 3、DB2:支持中小型大大型机,支持IBM公司和HP及SUN UNIX系统等,可以在主机一主/从方式 独立运行,也可以在服务器环境中运行

​ 4、MySQL:开源代码的关系型数据库管理系统。

三、数据库和数据表

​ 数据库并不能直接存储数据,数据是存储在表中。数据表的每一“行”对应一个实体,在数据 库中通常叫作一条“记录(Record)”,每一“列”,如编号、姓名、年龄等,通常称之为“字段“

四、数据库管理系统和数据库系统

​ 1、数据库管理系统(DBMS):是一种系统软件,功能是维护数据库,并有效地访问数据库中各个部分的数据。

​ 2、数据库系统(DBS):由存储介质(磁盘)、处理对象和管理系统共同组成的集合体,通常由软件、数据库、和数据库管理员组成。

五、SQL语言(与数据库进行交换的语言:称之为结构化查询语言)

SQL语言的结构由5部分构成:(面试中经常提到)

1、数据定义语言(DDL):在数据库中用来创建、修改、删除数据库中对象的语句。

如:创建表对象、修改表对象、删除表对象、创建视图对象、修改视图对象、删除视图对象等。

它的具体指令有:create(创建语句)、alter(修改语言)、drop(删除语句)

2、数据操作语言(DML):在数据库中对表中数据进行添加、修改、删除等操作的语句。

​ 如:添加数据、修改数据、删除数据

它的具体指令有:insert、update、delete等

3、数据查询语言(DQL):在数据库中对表中数据进行查询操作的语句。

如:单表查询、多表查询、模糊查询、子查询等等。

它的具有指令有:select

4、数据控制语言(DCL):在数据库中对对象权限的管理语句。

如:表的查询权限、表的删除权限、表的修改权限。

它的具体指令有:grant(授予权限)、revoke(回收权限)、deny(禁用权限)

5、事务控制语言(TCL):在数据库中对数据的完整性进行维护操作。

它的具体指令有:commit tran(提交事务),rollback tran(回滚事务)

六、需要自己掌握安装MySQL。

第二章、数据库和表的基本操作(DDL)

一、数据类型

1、整数类型:

​ TINYINT(迷你整型) 字节数:1(1个字节是8位)

​ SMALLINT(小整型) 字节数:2

​ MEDIUMINT(中整型)字节数:3

​ INT (标准整型) 字节数:4

​ BIGINT(大整型) 字节数:8

无符号数的最大值:2^字节数-1,最小值为-最大值+1。

有符号数的最大值:2^(字节数-1),最小值为负最大值+1。

2、浮点数类型和定点数类型:

​ FLOAT:单精度浮点数类型,字节数:4

​ DOUBLE:双精度浮点数类型,字节数:8

​ DECIMAL(M,D):M:数据的长度,D小数点后的长度。

3、日期和时间类型:

​ YEAR:字节数:1 格式:YYYY

​ DATE:字节数:4 格式:YYYY-MM-DD

​ TIME: 字节数:3 格式:HH:MM:SS

​ DATATIME: 字节数:8 格式: YYYY-MM-DD HH:MM:SS

​ TIMESTAMP(当前时间): 字节数:4 格式:YYYY-MM-DD HH-MM-SS

​ 注意:如果插入的数值不合法,系统会自动将对应的零值插入数据库中。

4、字符串类型

不可变字符串:CHAR和NCHAR,表示字符串的长度是固定的。如:char(20),没有给它赋值20个,它在数据库中 占用的空间还是20个字节。即效率高,但是可能导致空间的浪费。

可变字符串:VARCHAR和NVARCHAR,表示字符串长度是可以压缩的。 如:varchar(20),没有给它赋值20个, 只给了10个,它在数据库中占用的空间只占10个字节, 也就是说它会自动压缩多余的空间。即空间 可以节省,但是它的执行效率低。

区别:
char、varchar一般用来存储单字节。如英文字符或数字之类的。
nchar、nvarchar一般用来存储双字节。如中文、日文等。
注意:在MySql中字符串必须定义在单引号中,不要写在双引号中。

5、其他数据类型:

​ TEXT:大文本数据类型(存新闻)

​ BOLB:二进制类(用来存放视频、音频等内容)
​ ENUM:枚举类型(单选,只能存储一个枚举字符串值)
​ SET:集合类型,可以存储多个值的类型。(多选如:爱好:打球、打游戏等)
​ BIT:真假类型(判断)

二、表的约束

为了防止数据表中插入错误的数据,定义了一些维护数据库完整性的规则,即表的约束,它可以保证数据表中的数据的正确性和唯一性

1、PRIMARY KEY (主键约束):用于int类型,保证表中字段的值不能相同且不能为null。注意:每一个数据表中最多只能有一个主键约束,但是主键可以基于多个字段来建立。主键要建立在能够唯一标示一条记录的字段上。

1
2
3
4
单字段主键
字段名 数据类型 PRIMARY KEY
多字段主键(放在创建表格时所有字段结束后)
PRIMARY KEY (字段名1,字段名2...字段名n);

2、NOT NULL(非空约束):字段的值不能为null

1
字段名  数据类型 NOT NULL ;

3、UNIQUE(唯一约束):字段的值不能重复出现,保证字段的唯一性,null值除外

1
字段名  数据类型 UNIQUE ;

4、DEFAULT(默认约束):用于给数据表中的字段知道默认值,插入一条新数据时,有写数据就按写的数据显示,如果没有就会自动为这个字段插入默认值

1
字段名  数据类型 DEFAULT 默认值(如果不是整数类型,记得用单引号把默认值引起来) ;

5、CHECK(检查约束):表示当前字段的值只能在指定的范围内,在现在的MySql版本中还不支持check约束。
#但是再之后的版本中会提供支持。

1
字段名  数据类型 CHECK(值的指定范围)

三、对数据库的基本定义操作

语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1、创建数据库:CREATE DATABASE 数据库名称

​2、切换数据库:USE 数据库名称

​3、查看所有数据库:SHOW DATABASES 查看数据库所有引擎:SHOW ENGINES
查看数据库的系统信息:SHOW VARIABLES;

​4、修改数据库的编码格式:

1、在创建的时候指定编码格式:CREATE DATABASE 数据库名 CHARSET 编码格式;

2、比如我的数据库已经存在,想改变编码格式,这个时候需要alter:
ALTER DATABASE 数据库名称 CHARACTER SET 编码格式;

​5、删除数据库(注意:一定删除数据库就可能导致数据丢失,所以要慎重。):DROP DATABASE 数据名;

四、数据表的基本操作

1、创建数据表语法(create):

1
2
3
4
5
6
7
8
9
10
CREATE TABLE 表名
(
字段名1 数据类型 约束条件,
字段名2 数据类型 约束条件,
......
字段名n 数据类型 约束条件
);
注意:约束条件根据需求或者是要插入表的数据来确定,也可以没有约束条件。
最后一个字段名约束条件或数据类型后不需要跟英文逗号,其他的都需要跟英文逗号。
字段名或者表名如果与关键字冲突,则用``将其点起来(键盘!号前面的点)

2、查看数据表结构(DESC:describe):

1
DESC 表名;

3、删除数据表(drop)(包括表里的数据及表结构,即在数据库里找不到这个表了):

1
2
3
4
    DROP TABLE 表名1(表名2,...表名n);
另一个知识点:
如果表不存在则创建该表,存在则不创建: CREATE TABLE IF NOT EXISTS 表名;
删除表格如果存在学生表:DROP TABLE IF EXISTS 表名;

4、修改数据表(alter):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1、修改表名:ALTER TABLE 旧表名 RENAME TO  新表名;

2、修改字段名: ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;

3、修改字段的数据类型: ALTER TABLE 表名 MODIFY 要修改的字段的名称 修改后的数据类型;

4、添加字段: ALTER TABLE 表名 ADD 要添加的字段名 数据类型 约束条件;
添加字段并且放在数据的第一条: ALTER TABLE 表名 ADD 要添加的字段名 数据类型 约束条件 FIRST
添加字段并放在某字段之后:
ALTER TABLE 表名 ADD COLUMN 要添加的字段名 数据类型 约束条件 AFTER 某字段名;

5、删除字段:ALTER TABLE 表名 DROP 字段名;

6、修改字段的排列位置:
1.把已经存在的某个字段修改为表的第一个字段:
ALTER TABLE 表名 MODIFY 要修改的字段名 数据类型 FIRST
2.把某个字段修改到某个字段之后: ALTER TABLE 表名 MODIFY 要修改的字段名 数据类型 约束条件 AFTER 某字段名
4.1 对数据表中的约束条件进行添加,修改,删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1、添加(add constraint) 修改(modify)约束:
添加主键约束: ALTER TABLE 表名 ADD CONSTRAINT PRIMARY KEY(需要添加约束条件的字段名);

添加联合主键约束: ALTER TABLE 表名 ADD CONSTRAINT 自己取的约束名 PRIMARY KEY(字段名1,字段名2);

添加唯一约束: ALTER TABLE 表名 ADD CONSTRAINT 自己取的约束名 UNIQUE(需要约束的字段名);

添加检查约束: ALTER TABLE 表名 ADD CONSTRAINT 自己取的约束名 CHECK(值的指定范围);

添加(修改)非空约束: ALTER TABLE 表名 MODIFY 字段名 数据类型 NOT NULL;

添加(修改)默认约束 : ALTER TABLE 表名 MODIFY 字段名 数据类型 DEFAULT '默认值';

2、删除(drop)约束:
删除主键约束: ALTER TABLE 表名 DROP PRIMARY KEY;

5、设置表的字段值自动增加(AUTO_INCREMENT )

一个表中只能有一个自动增长列;自动增长列只能在数字类型上,一般主要指整数类型上;自动增长列必须是主键的一部分;默认自动增长是从1开始,但是可以指定开始值。

1
2
3
4
5
6
7
8
1、在创建表的时候设置自增:字段名 数据类型 约束条件 AUTO_INCREMENT;
在创建表的()后写AUTO_INCREMENT=10000 (表示从10000开始自增)【也可以不写,不写默认从1开始】

2、在表已经建立好的情况下来指明自动增长列的起始值,使用这条代码的时候需要勾选主键,勾选自增
ALTER TABLE 表名 AUTO_INCREMENT=1000;

3、控制自动增长列每次增加的数值。设置所有表的自增
SET auto_increment_increment=20;

6、创建和删除索引

首先:先假设有一张表,表的数据有10W条数据,其中有一条数据是nickname=’css’,如果要拿这条数据的话需要些的sql是 SELECT * FROM award WHERE nickname = ‘css’
一般情况下,在没有建立索引的时候,mysql需要扫描全表及扫描10W条数据找这条数据,如果我在nickname上建立索引,那么mysql只需要扫描一行数据及为我们找到这条nickname=’css’的数据,这样性能提升了很多

6.1索引的创建:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
一、单列索引
1、普通索引,这个是最基本的索引
其sql格式是 CREATE INDEX IndexName ON `TableName`(`字段名`(length)) 或者 ALTER TABLE TableName ADD INDEX IndexName(`字段名`(length))

第一种方式 :
CREATE INDEX 索引名 ON 表名(字段名);
第二种方式:
ALTER TABLE award ADD INDEX account_Index(`account`);

2、唯一索引,与普通索引类似,但是不同的是唯一索引要求所有的类的值是唯一的,这一点和主键索引一样.但是他允许有空值
第一种方式 :
CREATE UNIQUE INDEX 索引名 ON 表名(字段名);
第二种方式:
ALTER TABLE 表名 ADD UNIQUE INDEX 自己取的索引名 (字段名);

3、主键索引,不允许有空值,(在B+TREE中的InnoDB引擎中,主键索引起到了至关重要的地位)
主键索引建立的规则是 int优于varchar,一般在建表的时候创建,
最好是与表的其他字段不相关的列或者是业务不相关的列.一般会设为 int 而且是 AUTO_INCREMENT自增类型的

ALTER TABLE 表名 ADD PRIMARY KEY (字段名) ;

二、组合索引
一个表中含有多个单列索引不代表是组合索引,通俗一点讲 组合索引是:包含多个字段但是只有索引名称
其sql格式是 CREATE INDEX IndexName On `TableName`(`字段名`(length),`字段名`(length),...);

CREATE INDEX 取的索引名 ON 表名(字段名1, 字段名2, 字段名3);
#如果你建立了 组合索引(索引名) 那么他实际包含的是3个索引 (字段名1) (字段名1, 字段名2, )(字段名1, 字段名2, 字段名3)

三、全文索引
文本字段上(text)如果建立的是普通索引,那么只有对文本的字段内容前面的字符进行索引,其字符大小根据索引建立索引时申明的大小来规定。如果文本中出现多个一样的字符,而且需要查找的话,那么其条件只能是 where column lick '%xxxx%' 这样做会让索引失效,这个时候全文索引就起到了作用了
ALTER TABLE tablename ADD FULLTEXT(column1, column2)
有了全文索引,就可以用SELECT查询命令去检索那些包含着一个或多个给定单词的数据记录了。
例:
ALTER TABLE award ADD FULLTEXT(aty_id, nickname);# 产品名 价格

四、Mysql全文搜索match against的用法
SELECT * FROM tablename WHERE MATCH(aty_id, nickname) AGAINST(‘xxx′, ‘sss′, ‘ddd′);
# 这条命令将把column1和column2字段里有xxx、sss和ddd的数据记录全部查询出来。

6.2 索引的删除

1
2
3
4
5
6
第一种方式:
DROP INDEX 之前创建索引取的索引名 ON 表名;
第二种方式:
ALTER TABLE 表名 DROP INDEX 索引名;
例:删除表award的主键索引
ALTER TABLE award DROP PRIMARY KEY ;

6.3 使用索引的优点

1.可以通过建立唯一索引或者主键索引,保证数据库表中每一行数据的唯一性.
2.建立索引可以大大提高检索的数据,以及减少表的检索行数
3.在表连接的连接条件 可以加速表与表直接的相连
4.在分组和排序字句进行数据检索,可以减少查询时间中 分组 和 排序时所消耗的时间(数据库的记录会重新排序)
5.建立索引,在查询中使用索引 可以提高性能

6.4 使用索引的缺点

1.在创建索引和维护索引 会耗费时间,随着数据量的增加而增加
2.索引文件会占用物理空间,除了数据表需要占用物理空间之外,每一个索引还会占用一定的物理空间
3.当对表的数据进行 INSERT,UPDATE,DELETE 的时候,索引也要动态的维护,这样就会降低数据的维护速度,(建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会膨胀很快)。

6.5 使用索引需要注意的地方

在建立索引的时候应该考虑索引应该建立在数据库表中的某些列上面 哪一些索引需要建立,哪一些所以是多余的.
一般来说,
1.在经常需要搜索的列上,可以加快索引的速度
2.主键列上可以确保列的唯一性
3.在表与表的而连接条件上加上索引,可以加快连接查询的速度
4.在经常需要排序(order by),分组(group by)和的distinct 列上加索引 可以加快排序查询的时间, (单独order by 用不了索引,索引考虑加where 或加limit)
5.在一些where 之后的 < <= > >= BETWEEN IN 以及某个情况下的like 建立字段的索引(B-TREE)
6.like语句的 如果你对nickname字段建立了一个索引.当查询的时候的语句是 nickname lick ‘%ABC%’ 那么这个索引讲不会起到作用.而nickname lick ‘ABC%’ 那么将可以用到索引
7.索引不会包含NULL列,如果列中包含NULL值都将不会被包含在索引中,复合索引中如果有一列含有NULL值那么这个组合索引都将失效,一般需要给默认值0或者 ‘ ‘字符串
8.使用短索引,如果你的一个字段是Char(32)或者int(32),在创建索引的时候指定前缀长度 比如前10个字符 (前提是多数值是唯一的..)那么短索引可以提高查询速度,并且可以减少磁盘的空间,也可以减少I/0操作.
9.不要在列上进行运算,这样会使得mysql索引失效,也会进行全表扫描
10.选择越小的数据类型越好,因为通常越小的数据类型通常在磁盘,内存,cpu,缓存中 占用的空间很少,处理起来更快

6.6 什么情况下不创建索引

1.查询中很少使用到的列 不应该创建索引,如果建立了索引然而还会降低mysql的性能和增大了空间需求.
2.很少数据的列也不应该建立索引,比如 一个性别字段 0或者1,在查询中,结果集的数据占了表中数据行的比例比较大,mysql需要扫描的行数很多,增加索引,并不能提高效率
3.定义为text和image和bit数据类型的列不应该增加索引,
4.当表的修改(UPDATE,INSERT,DELETE)操作远远大于检索(SELECT)操作时不应该创建索引,这两个操作是互斥的关系
*/

第三章 添加、更新与删除数据表中的数据(DML)

DML:数据操作语言[Data manipulation language]:主要是针对表中数据的添加、修改、删除操作)
具体的指令有:insert(添加)/update(修改)/delete(删除)

一、添加数据(insert into)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
一、单条数据添加有以下几种方式:
1、字段和值全部写完整
INSERT INTO 表名 (字段名1,字段名2,...字段名n) VALUES(值1,值2,...值n);

2、直接省略字段名 直接添加值(如果要给每个字段插入值,则可以省略所有的字段名)
INSERT INTO 表名 VALUES(值1,值2,...值n);

3、有些可以为空的字段可以省略不写
INSERT INTO student(字段名1,字段名2) VALUES(值1,值2);

另一种写法:
INSERT INTO 表名 set 字段名1=值1,字段名2=值2...字段名n=值n;
二、一次添加多条数据
1、直接省略字段名 直接添加值
INSERT INTO 表名 VALUES
(值1,值2,...值n),
(值1,值2,...值n),
(值1,值2,...值n),
(值1,值2,...值n),
(值1,值2,...值n);
2、有些可以为空的字段可以省略不写
INSERT INTO student(字段名1,字段名2) VALUES(值1,值2),(值1,值2),(值1,值2),(值1,值2);

插入数据后,可以用查询语句对表进行查看
SELECT * FROM 表名 (*代表所有的意思)

注意:每个值的顺序类型必须与队友的字段相匹配。如果某个字段定义的时候添加了非空约束,但没有添加默认约束,插入新纪录的时候就必须为该字段赋值,否则会提示错误。值的类型除了整数类型不用’’引起来,其他的需要用’’引起来。**

1
2
3
4
5
6
7
8
9
10
三、把一个已经存在的表以及表中的数据插入到一个新表中。(新表的意思是在数据库中原来是不存在的)(通俗的是指表的备份)
1、在复制表的结构的同时复制表中的数据
CREATE TABLE 新表名 SELECT * FROM 旧表名;

2、只要复制表中的结构不要表中的数据。
CREATE TABLE 新表名 SELECT * FROM student WHERE 1=2;
CREATE TABLE 新表名 LIKE 旧表名;

3、复制表中满足条件的数据与结构
CREATE TABLE 新表名 SELECT * FROM student WHERE 条件;

二、更新(修改)数据(update)

1
2
3
4
5
6
7
8
9
10
1、更新部分数据语法:
UPDATE 表名 SET 字段名1=值1(,字段名2=值2,...字段名n=值n )WHERE 条件表达式;
如果表中有多条记录都满足where子句条件表达式,满足条件的记录都会发生改变

2、更新所有数据语法:
UPDATE 表名 SET 字段名1=值1(,字段名2=值2,...字段名n=值n)
()表示根据实际情况可以只改一个值还是多个值

3、追加值:(如本来是水浒传,用CONCAT后就变成水浒传abc)
UPDATE student SET 字段名1=CONCAT(字段名1,'abc') WHERE 条件表达式;

三、删除数据(delete)

【注意删除数据时不能写*号】

1
2
3
4
5
6
7
8
9
10
11
1、删除部分数据语法:
DELETE FROM 表名 WHERE 条件表达式;

2、删除全部数据语法:
DELETE FROM 表名 ;
TRUNCATE TABLE 表名;
注意:1、delete可以全表删除,也可以按照条件来删除。而truncate只能全表删除。
2、delete在删除数据的时候会做日志,所以删除数据效率要低。但是安全性高。
而truncate在删除数据时不会做日志,所有删除数据库快。但是安全性低。
3、delete在删除表中数据时,如果有自动增长列则下次插入值时会以上次的编号加1.
而truncate在删除表中数据时,如果有自动增长列则下次重新从1开始.

第四章、 单表查询(DQL)

一、简单查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
1、查询所有字段
SELECT 字段名1,字段名2,...字段名n FROM 表名;(表内所有字段)
SELECT * FROM 表名;
注意:在数据库查询中尽量减少使用*号。因为代码的可读性不够,执行效率低。
一般在测试或者字段名比较少的情况下使用。

2、查询指定字段
SELECT 字段名1,字段名2,...字段名n FROM 表名;(表内部分字段)

3、按条件查询
SELECT * FROM 表名 WHERE 条件表达式;
注意: where 条件表达式可以使用关系运算符(>,<,=,!=,<>...)

4、带in关键字查询(判断某个字段的值是否在指定集合中,满足条件的记录将被查询出来)
SELECT 字段名1,字段名2,...字段名n FROM 表名;(表内部分字段) WHERE 字段名 IN (元素1,元素2);
SELECT 字段名1,字段名2,...字段名n FROM 表名;(表内部分字段) WHERE 字段名 NOT IN (元素1,元素2);
加not,表示值不是元素1,元素2的记录

5、带and( &&)关键字查询(满足两个条件为真)
SELECT 字段名1,字段名2,...字段名n FROM 表名 WHERE 表达式1 AND(&&) 表达式2... AND 表达式n;

6、带 or (||)关键字查询 (满足一个条件为真)
SELECT 字段名1,字段名2,...字段名n FROM 表名 WHERE 表达式1 OR(||) 表达式2... OR 表达式n;
注意:如果and和or关键字一起用,and优先级高于or,先算and表达式,再运算or表达式

7、带 between... and...关键字查询(值是否在指定范围内,一般使用在数字与日期范围时候)
SELECT 字段名1,字段名2,...字段名n FROM 表名 WHERE 字段名 BETWEEN 起始值 AND 结束值;
SELECT 字段名1,字段名2,...字段名n FROM 表名 WHERE 字段名 NOT BETWEEN 起始值 AND 结束值;(不在这个范围)

8、空值(is null )查询(空值不同于0,也不同于空字符串)
SELECT 字段名1,字段名2,...字段名n FROM 表名 WHERE 字段名 IS NULL ;
SELECT 字段名1,字段名2,...字段名n FROM 表名 WHERE 字段名 IS NOT NULL ;(不为空)

9、带 distinct 关键字查询(过滤记录中重复的值,null也算值)
select distinct 需要去重的字段名 from 表名;
select distinct 需要去重的字段名1,字段名2,...字段名n from 表名;(指定的多个字段的值都相同,才会被认为是重复记录)

10、带 like RLIKE 关键字查询(对字符串进行模糊查询,需要使用通配符%,_符合正则定律)
SELECT * FROM titles WHERE title LIKE '生%'; -- 以什么开头
SELECT * FROM titles WHERE title LIKE '%术'; -- 以什么结尾
SELECT * FROM titles WHERE title LIKE '%科%'; -- 包含

SELECT * FROM titles WHERE title LIKE '历_'; -- 一个下划线代表一个占位符,表示以历开头的两个字
SELECT * FROM titles WHERE title LIKE '百___';-- 多个下划线代表多个占位符,以百开头的三个字

SELECT * FROM titles WHERE title RLIKE '^历'; #shift + 6 以什么开头
SELECT * FROM titles WHERE title RLIKE '书$'; #shift + 4 以什么结尾
SELECT * FROM titles WHERE title RLIKE '美' ; #包含美的字

二、高级查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1、聚合函数:对一组值进行统计,并返回唯一值
count()统计记录的条数,null值不会忽略: SELECT COUNT(*) FROM 表名;

在使用聚合函数时,如果记录中有NULL则聚合函数会自动过滤它。
SUM()求和函数:SELECT SUM (字段名) FROM 表名
AVG()求平均值:SELECT AVG(字段名) FROM 表名
MAX()求最大值:SELECT MAX(字段名) FROM 表名
MIN()求最小值:SELECT MIN(字段名) FROM 表名

2、对查询结果排序 order by ( ASC升序 DESC降序)
SELECT 字段名1,字段名2,...字段名n FROM 表名 ORDER BY 字段名1 (ASC/DESC),字段名2(ASC/DESC);
如果 order by 字段名后不写任何,默认升序排列,写了DESC就按降序排列。注意:null可以被认为是最小值,也会参与排序。

3、分组查询 group by (按某个字段或某个值分组,字段中的值相同的为一组,一般和聚合函数一起使用)
SELECT 字段名1或函数,字段名2,...字段名n FROM 表名 GROUP BY 字段名1,字段名2,...字段名n (HAVING 条件表达式)
注意 group by 和 having关键字一起使用,不是 where

4、分页查询 limit
SELECT 字段名1,字段名2,...字段名n FROM 表名 LIMIT (偏移量)返回记录的条数
例:SELECT * FROM student2 grade LIMIT 4 #查询表中前4条记录
SELECT * FROM student2 grade DESC LIMIT 4,4; #查询greade字段值在表中第5位到第8位的学生(从高到低)

三、函数汇总

1、数学函数
CEIL(9.09); 向上取舍,10
FLOOR(9.99); 向下取舍 9

2、字符串函数
LENGTH(‘i love you’); 返回字符串长度
CONCAT(‘abc’,’efg’); 返回连接产生的新字符串
LOWER(‘AAAA’); 返回字符串的小写形式
UPPER(‘bbbb’); 返回字符串的大写形式
SUBSTRING(‘abcdefg’,1,6); #第一个值是起始位置,第二个值是截取的长度
REPLACE(‘myLoveYou’,’my’,’XXX’); 使用XXX替换my

3、日期函数
NOW();获取当前的年月日时分秒
CURDATE(); 获取年月日
CURTIME(); 获取时分秒

ADDDATE(‘2017-1-1’,20); 添加日期

ADDDATE(‘2017-1-31’,-20); 减日期

4、函数是可以嵌套的
YEAR(NOW());
MONTH(NOW());
DAY(NOW());
HOUR(NOW());
DAYOFWEEK(NOW()); #返回日期在本周的星期几索引,星期天 = 1,星期一 = 2,星期六 = 7
WEEKDAY(NOW()); #WEEKDAY函数返回一个日期的工作日索引值,即星期一为0,星期二为1,星期日为6。范围从0到6,表示星期一到星期日。
DAYOFYEAR(NOW()); #返回年份为日期的天,范围为1至366。
WEEKOFYEAR(NOW()); #返回日期中的日历星期数,范围是从1至53。
QUARTER(NOW()); #返回年份日期的季度值,范围为1〜4。

5、判断函数

IF(exp,v1,v2) :如果表达式exp为真,则返回V1,否则返回V2

IFNULL(字段名,0) 如果当前字段的值为null,则使用0来替换
ISNULL() 判断有值就返回0,没有值就返回1

CASE(字段) WHEN 表达式 THEN 结果 (WHEN 表达式 THEN 结果)…ELSE 结果 END

相当于针对范围判断的时候类似于if…else if…else if…else…

1
2
3
4
5
6
7
8
9
例:SELECT TYPE,CASE(TYPE) WHEN 'business' THEN '商业书籍'
WHEN 'mod_cook' THEN '烹调书籍'
WHEN 'popular_comp' THEN '电脑书籍'
WHEN 'psychology' THEN '物理书籍'
WHEN 'trad_cook' THEN '交通书籍'
WHEN 'UNDECIDED' THEN '绘图书籍'
ELSE '其他书籍'
END AS '书籍类型123'
FROM titles;

四、为表和字段取别名 AS

1
2
3
4
5
6
7
8
9
10
给表取别名:
SELECT * FROM 表名 (AS) 别名; #AS可以省略不写
给字段取别名
SELECT 字段名 (AS) '别名' FROM 表名 ;
取好别名后,查询所有这个表的数据
SELECT * FROM 表名 别名;

通过别名点出字段名,例如:
SELECT t.`advance`,t.`notes`,t.`price`,t.`pub_id`,t.`title`,t.`type` FROM titles t;
注意需要先把 select 及from后面的表名,别命写出来以后才可以点出字段名,不然你用.是出不来选择的字段名

第五章、多表查询(DQL)

一、外键 foreign key

外键是指引用另一个表中的一列或多列,被引用的列应该具有主键约束或唯一性约束。外键用于建立和加强两个表数据之间的连接。

语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
添加外键约束
alter table 表名 add constraint FK_ID(外键字段名) foreign key REFERENCES 外表表名(主键字段名)
或者直接在创建表的下面写
CREATE TABLE pro_sal
( sal_id VARCHAR(20) NOT NULL,
sal_date DATE NOT NULL,
sal_prodect_id VARCHAR(20) NOT NULL,
sal_count INT(11) NOT NULL,
sal_money DECIMAL(10,0) NOT NULL,
FOREIGN KEY(sal_id) REFERENCES saler(s_id ),
FOREIGN KEY(sal_prodect_id ) REFERENCES pros(p_id)
);
删除外键约束
alter table 表名 drop foreign key 外键名;

二、操作关联表

1、关联关系

①多对一

最常见的一种关系,如员工与部门之间的关系,一个部门可以有多个员工,而一个员工不能属多个部门。在这个关系中,外键建在多的一方。

②多对多

也是数据表的一种关系,如学生与课程之间的关系,一个学生可以选择多门课程,一个课程也供多个学生选择。

为了实现这种关系,需要定义一章中间表(称为连接表),该表会存在两个外键,分别参照课程表和学生表,注意:连接表的两个外键都是可以重复的,但是两个外键之间 关系是不能重复的,所有这两个外键又是连接表的联合主键

③一对一

如人和身份证。要建立外键,首先要分清主从关系,从表需要主表的存在才有意义。

一般这种关系在数据库中并不常见,一般会应用到:1、分割具有很多列的表;2、由于安全原因而隔离表的一部分;3、保存临时数据,并且可以毫不费力地通过删除该表而删除这些数据

2、添加数据

外键列只能插入参照列存在的值,所有如果要添加数据,需要先为主表添加数据,然后从表中的外键列只能添加主表中与外键列相关联的列的值

3、删除数据

两个具有关联关系的表中删除数据时,一定要先删除从表中的数据,然后再删除主表中的数据,否则会报错。

三、连接查询

1、交叉连接 cross join

2、内连接 inner join…on…

3、外连接

​ 左连接left join

​ 右连接 right join

4、复合连接查询

四、子查询

子查询是指在一个查询语句嵌套在另一个查询语句内部的查询,首先执行子查询中的语句,然后将返回的结果作为外层查询的过滤条件

1、带in关键字的子查询

2、带exists关键字的子查询

3、带any关键字的子查询

4、带all关键字的子查询

5、带比较运算符的子查询