crm开发定制MySQL总结

文章目录

一.SQL语句简介

1.什么是SQL?

SQL(Structured Query Language):crm开发定制结构化查询语言
crm开发定制其实就是定义了操作所crm开发定制有关系型数据库的规则。crm开发定制每一种crm开发定制数据库操作的方crm开发定制式存在不一样的地方,称为“方言”

2.SQL分类

(1)DDL(Data Definition Language):crm开发定制数据库定义语言
用来定义crm开发定制数据库对象(数据库,表,列)。关键字:create,drop,alter等
(2)DML(Data Manipulation Language):crm开发定制数据库操作语言
crm开发定制用来对数据库表中的数crm开发定制据进行增删改。关键字:insert,delete,update等
(3)DQL(Data Query Language):crm开发定制数据查询语言
crm开发定制用来查询数据表中的记录(数据) 。关键字:select,where等
(4)DCL(Data Control Language):crm开发定制数据控制语言(用的不多,了解即可)

二.MySqlcrm开发定制常用数据类型

三.数据库操作

1.crm开发定制crm开发定制crm开发定制创建数据库

(1)crm开发定制使用指令创建数据库

CREATE DATABASE IF NOT EXISTS db1;
  • 1

①创建数据库:
create database crm开发定制crm开发定制数据库名称
②创建数据库,crm开发定制先判断不存在,再去创建
create database if not exists 数据库名称;
(2)crm开发定制crm开发定制创建一个使用utf8crm开发定制字符集的数据库

CREATE DATABASE db2 CHARACTER SET utf8;
  • 1

(3)创建一个使用utf_8字符集,并带校对规则的数据库

CREATE DATABASE db3 CHARACTER SET utf8 COLLATE utf8_bin;
  • 1

(4)校对规则utf8_bin区分大小,默认utf_8_general_ci 不区分大小写(如Tom和tom一样)

2.查询和删除数据库

(1)查看当前数据库服务器中的所有数据库

SHOW DATABASES;
  • 1

(2)查看创建的db2数据库的定义信息

SHOW CREATE DATABASE db2;
  • 1

(3)在创建数据库,表的时候,为了避免关键字,可以使用反引号解决(比如数据库名为关键字create)

CREATE DATABASE `create`;
  • 1

(4)删除数据库

DROP DATABASE db1;
  • 1

3.备份/恢复数据库

(1)备份,要在DOS下执行指令
mysqldump -u 用户名 -p -B 数据库1,数据库2,数据库n > 文件名.sql;

mysqldump -u root -p -B db2 > d:\\db2.sql;
  • 1

(2)恢复数据库(注意:要在DOS中进入MySQL命令行再执行)

source d:\\db2.sql;
  • 1

补充(备份库中的表):mysqldump -u 用户名 -p 数据库 表1 表2 表n > 文件名.sql;

四.表操作

1.创建表

CREATE TABLE table_name(	field1 datatype,	field2 datatype,	field3 datatype	)character set 字符集 collate 校对规则 engine 存储引擎
  • 1
  • 2
  • 3
  • 4
  • 5

(1)field:指定列名
(2)datatype:指定列类型(字段类型)
(3)character set:如果不指定则为所在数据库字符集
(4)collate:如果不指定则为所在数据库校对规则
(5)engine:引擎

2.修改/查看表

(1)添加列
ALTER TABLE tablename
ADD (column1 datatype [表达式语句]
,column2 datatype [表达式语句);

-- t_user表上新增一个varchar类型的image列(要求在email后面)ALTER TABLE t_user   ADD image VARCHAR (32) NOT NULL DEFAULT ''  AFTER email;
  • 1
  • 2
  • 3
  • 4

(2)修改列
ALTER TABLE tablename
MODIFY (column1 datatype [表达式语句];
,column2 datatype [表达式语句))
(3)删除列
ALTER TABLE tablename
DROP column;
(4)修改表名
RENAME TABLE 表名 to 新表名;
(5)修改表字符集
alter table 表名 character set 字符集;
(6)desc 表名; // 查看表的结构

五.CRUD语句

1.Insert语句

insert into 表名(列名1,列名2,...列名n) values(1,2,...,值n);
  • 1

细节:
(1)插入的数据要与字段的数据类型相同,比如把‘abc’添加到int类型会报错
(2)数据的长度应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中
(3)在values中列出的数据位置必须与被加入的列的排列位置相对应
(4)字符和日期类型数据应包含在单引号中
(5)列可以插入空值(前提是该字段允许为空)
(6)如果是给表中的所有字段添加数据,可以不写前面的字段名称

insert into 表名 values(1,2,...值n);
  • 1

(7)默认值的使用,当不给某个字段值时,如果有默认值就会添加,否则报错

2.Delete语句

delete from 表名 [where 条件];
  • 1

(1)如果不加条件,则删除表中所有记录
(2)如果要删除所有记录
delete from 表名; – 不推荐使用。有多少条记录就会执行多少次删除操作
TRUNCATE TABLE 表名; – 推荐使用,效率更高,先删除表,然后再创建一张一样的表

3.Update语句

update 表名 set 列名1 = 值1,列名2 = 值2,…[where 条件];
(1)set子句指示要修改哪些列和要赋予那些值
(2)where子句指定应更新哪些列;如果没有where子句,则更新所有的行
(3)如果需要修改多个字段,可以通过set 字段1=值1,字段2=值2…

4.Select语句

4.1 语法:

select	字段列表from	表名列表where	条件列表group by	分组字段having	分组之后的条件limit	分页限定
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

4.2 基础查询

(1)多个字段的查询

select 字段名1,字段名2...from 表名;
  • 1

注意:如果查询所有字段,则可以使用*来替代字段列表
(2)去除重复:distinct
(4)起别名:as(as也可以省略)

select columnname as 别名 from 表名;
  • 1

4.3 排序查询
(1)语法:order by 子句
select * from 表名 order by 排序字段1 排序方式1,排序字段2 排序方式2...
(2)排序方式:
①ASC:升序,默认的
②DESC:降序
(3)order by 子句应位于select语句的结尾
4.4 分页查询
(1)语法:limit 开始的索引,每页查询的条数
(2)公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数

SELECT * FROM t_product WHERE STATUS = 1 ORDER BY priority DESC LIMIT 0,4;
  • 1

(3)limit是一个MySQL“方言”
4.5 分组统计
(1)使用group by子句对列进行分组

select  column1,column2,column3 ... from 表名 group by column;
  • 1

(2)使用having子句对分组后的结构进行过滤

select column1,column2,column3... 		from  表名		group by column having AVG(sal) < 2000;
  • 1
  • 2
  • 3

五.函数

1.统计函数count

(1)count:返回行的总数

select count(*) | count(列名) from table_name [where 条件]
  • 1

注意:count(*)和count(列名)的区别?
count(*):返回满足条件的记录的行数
②count(列名):统计满足条件的某列有多少个,但是会排除 null
(2)合计函数max/min

select max(列名) from 表名 [where 条件]
  • 1

2.字符串相关函数

(1)CHARSET(str)]// 返回字符串字符集(例如utf8)
(2)CONCAT(string1[,…]) // 连接字符串,将多个列拼接成一列
(3)INSTR(string,substring) // 返回substring在string中出现的位置,没有则返回0
(4)将string转换成大/小写
①UCASE(string) // 转换成大写
②LCASE(string) // 转换成小写
(5)从string中取length个字符串
①LEFT(string,length) // 从string中的左边起取length个字符串
②RIGHT(string,length) // 从string中的右边起取length个字符串
(6)LENGTH(string) // 获取string长度(按照字节)
(7)REPLACE(str,search_str,replace_str) // 在str中用replace_str替换search_str
(8)STRCMP(string1,string2) // 逐字符比较两个字符串的大小(大于返回1,等于返回0,小于返回-1)
(9)SUBSTRING(str,position[,length]) // 从str的position开始[从1开始计算],取length个字符串
(10)TRIM(string) // 去除前后端空格
①LTRIM(string) // 去除前端空格
②RTRIM(string) // 去除后端空格

例子:

-- (1)CHARSET(str) 返回字符串字符集(例如utf8)SELECT CHARSET(ename) FROM emp;-- (2)CONCAT(string1[,...]) 连接字符串,将多个列拼接成一列SELECT CONCAT(ename,' 工作是 ',job) FROM emp;-- (3)INSTR(string,substring) 返回substring在string中出现的位置,没有则返回0-- DUAL 亚元表(是一个系统表,可以作为测试表使用)SELECT INSTR('xuexiJava','Java') FROM DUAL;-- (4.1)UCASE(string) 转换成大写SELECT UCASE(ename) FROM emp;-- (4.2)LCASE(string) 转换成小写SELECT LCASE(ename) FROM emp;-- (5.1)LEFT(string,length) 从string中的左边起取length个字符串-- (5.2)RIGHT(string,length) 从string中的右边起取length个字符串SELECT LEFT(ename,2) FROM emp;-- (6)LENGTH(string) 获取string长度(按照字节)SELECT LENGTH(ename) FROM emp;-- (7)REPLACE(str,search_str,replace_str) 在str中用replace_str替换search_str-- 将manager替换成 经理SELECT ename,REPLACE(job,'MANAGER','经理') FROM emp;-- (8)STRCMP(string1,string2) 逐字符比较两个字符串的大小(大于返回1,等于返回0,小于返回-1)SELECT STRCMP('你好','好好') FROM DUAL;-- (9)SUBSTRING(str,position[,length])SELECT SUBSTRING(ename,1,3) FROM emp;--(10)trim(string) // 去除前后端空格SELECT LTRIM(' 我爱学java ') FROM emp;SELECT RTRIM(' 我爱学JavaScript ') FROM emp;SELECT TRIM(' 我爱学习 ') FROM emp;
  • 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

六.MySQL约束

约束用于对表中的数据进行限定,从而保证数据的正确性、有效性和完整性。在MySQL中,约束包括:primary key(主键约束),not null(非空约束),unique(唯一约束),foreign key(外键约束)和check约束五种。

1.primary key(主键)约束

1.1 primary key(主键)的基本使用
字段名 字段类型 primary key
1.2 primary key的细节说明
(1)primary key不能重复,且不能为null
(2)一张表最多只能有一个主键,但可以是复合主键

CREATE TABLE t18(		 id INT,		`name` VARCHAR ( 32 ), 		 email VARCHAR ( 32 ),		 PRIMARY KEY(id,`name`) -- 这里就是复合主键		);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

(3)主键的指定方式有两种
①直接在字段名后指定:字段名 primary key

CREATE TABLE t19(	 id INT ,	`name` VARCHAR(32) PRIMARY KEY, -- 直接在字段名后写	 email VARCHAR(32));
  • 1
  • 2
  • 3
  • 4
  • 5

②在表定义的最后写: primary key(列名)

CREATE TABLE t20(	 id INT,	`name` VARCHAR(32),	email VARCHAR(32),	PRIMARY KEY(`name`) -- 在表定义最后写 primary key(列名)
  • 1
  • 2
  • 3
  • 4
  • 5

(4)使用desc表名,可以看到primary key的使用情况
(5)在实际开发中,每个表往往都会设计一个主键

2.not null(非空)

如果在列上定义了not null,那么某一列的值不能为null
字段名 字段类型 not null

3.unique(唯一)

(1)当定义了唯一约束后,该列值是不能重复的
字段名 字段类型 unique
(2)使用细节
①如果没有指定not null,则unique字段可以有多个null
②一张表可以有多个unique字段

4.foreign key(外键)

(1)让表与表之间产生关系,从而保证数据的正确性
FOREIGN KEY(本表字段名) REFERENCES 主表名(主键名/unique字段名)

-- 创建主表CREATE TABLE my_class(	id INT PRIMARY key, -- 班级编号	`name` VARCHAR(32) NOT NULL DEFAULT '');-- 	创建从表CREATE TABLE my_stu(	id INT PRIMARY KEY, -- 学生编号	`name` VARCHAR(32) NOT NULL DEFAULT '',	class_id INT, -- 学生所在班级的编号-- 	下面指定外键关系	FOREIGN KEY (class_id) REFERENCES my_class(id));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

(2)使用细节:
①外键约束要定义在从表上,主表必须具有主键约束或是unique约束。
②表的类型是innodb,这样的表才支持外键
③外键字段的类型要和主表中关联字段的类型一致(长度可以不同)
④外键字段的值,必须要在主表关联的字段中出现过,或者为null(前提是允许为null)
⑤一旦建立了外建约束,主表数据就不能随意删除了

5.check约束

(1)用于强制行数据必须满足的条件,假定在sal列定义了check约束,并要求在sal列值在1000~2000之间,那么不在1000~2000之间就会提示错误。
(2)Oracle和sql server均支持check,MySQL8之后才支持check

CREATE TABLE t23 (	id INT PRIMARY KEY,	`name` VARCHAR(32) ,	sex VARCHAR(6) CHECK (sex IN('man','woman')),	sal DOUBLE CHECK ( sal > 1000 AND sal < 2000));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

七.索引

1.索引的原理

(1)没有索引为什么会慢?
因为需要全表扫描
(2)使用索引为什么会快?
形成一个索引的数据结构,比如二叉树

(3)索引的代价
①磁盘占用
②影响dml语句(update、delete、insert)语句的效率
但是我们的项目中主要为查询select语句,所以可以忽略

2.索引的类型

(1)主键索引,主键自动成为主索引(类型Primary key)
(2)唯一索引(UNIQUE)
(3)普通索引(INDEX)
(4)全文索引(FULLTEXT)[适合于MyISAM]
开发中考虑使用:全文搜索Slor和ElasticSearch(ES)

3.创建索引

-- 创建表CREATE TABLE t25 (id INT, `name` VARCHAR (32)) ;-- 3.1 查询表中是否有索引SHOW INDEXES FROM t25 ;-- 3.2添加索引-- (1)添加唯一索引CREATE UNIQUE INDEX id_index ON t25 (id) ;-- (2)添加普通索引方式1CREATE INDEX id_index ON t25 (id) ;-- (2)添加普通索引方式2ALTER TABLE t25 ADD INDEX id_index (id);-- 如何选择-- 1.如果某列的值,是不会重复的,则优先考虑使用unique索引,否则使用普通索引-- (3)添加主键索引CREATE TABLE t26 (id INT, `name` VARCHAR (32)) ;ALTER TABLE t26 ADD PRIMARY KEY (id) ;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

4.删除索引

-- 删除索引DROP INDEX id_index ON t25;-- 删除主键索引ALTER TABLE t26 DROP PRIMARY KEY;-- 修改索引,先删除,再添加新的索引
  • 1
  • 2
  • 3
  • 4
  • 5

5.查询索引

-- 查询索引-- 方式1SHOW INDEX FROM t25;-- 方式2SHOW INDEXES FROM t25;-- 方式3SHOW KEYS FROM t25;-- 方式4(索引字段key的值为MUL,该方法没有前面的方法查询结果详细)DESC t25;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

6.哪些列上适合使用索引:

(1)较频繁的作为查询条件字段的应该建立索引
(2)唯一性太差的字段不适合单独创建索引,既使频繁作为查询条件
例如性别:select * from emp where sex = ‘男’;
(3)更新非常频繁的字段不适合创建索引
(4)不会出现在where子句中的字段不该创建索引

八.多表查询

下面都已这两张表为例子


1.内连接查询
(1)隐式内连接:使用where条件消除无用数据
例子:
– 查询所有员工信息和对应的部门信息

SELECT * FROM emp,dept WHERE emp.`dept_id` = dept.`id`; 
  • 1


– 查询员工表的名称、性别,部门表的名称

select emp.`name`,emp.`gender`,dept.`name` from emp,dept where emp.`dept_id` = dept.`id`
  • 1


(2)显示内连接
语法:select 字段列表 from 表名1 [inner] join 表名2 on 条件
例如:

-- 查询所有员工信息和对应的部门信息SELECT * FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`;-- 或者select * from emp join dept on emp.`dept_id` = dept.`id`;
  • 1
  • 2
  • 3
  • 4

2.外链接查询(以下面stu和exam两张表为例)


(1)左外链接
①语法:select 字段列表 from 左表 left [outer] join 右表 on 条件;
②查询的是左表所有数据及其交集的部分。
③例子:

-- 查询所有人的成绩,如果没有成绩,也要显示该人的姓名和id,成绩显示为空SELECT stu.`id`,stu.`name`,exam.`grade` FROM stu LEFT JOIN exam ON stu.`id`=exam.`id`;
  • 1
  • 2

(2)右外链接:
①语法:select 字段列表 from 左表 right [outer] join 右表 on 条件;
②查询的是右表所有数据及其交集的部分
③例子:

-- 显示所有成绩,如果没有名字匹配显示为空SELECT stu.`id`,stu.`name`,exam.`grade`FROM stu RIGHT JOIN exam ON stu.`id`=exam.`id`;
  • 1
  • 2


3.自连接查询
(1)自连接的特点:
①把同一张表当做两张表使用
②需要给表取别名(表名 表列名)
③列名不明确,可以指定列的别名(列名 as 列的别名)
(2)例子:

-- 要求:显示公司员工名字和他的上级的名字select	 worker.ename as '职员名',	 boss.ename as '上级名'from	 emp worker,	 emp bosswhere	worker.mgr = boss.empno; 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

九.事务

1.什么是事务:
事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。如:转账就要用事务来处理,用以保证数据的一致性。
2.事务和锁
当执行事务操作时(dml语句),MySQL会在表上加锁,防止其他用户改变表的数据。
3.mysql数据库控制台事务的几个重要操作
(1)start transaction – 开始一个事务
(2)savepoint 保存点名 – 设置保存点
(3)rollback to 保存点名 – 回退事务
(4)rollback – 回退全部事务
(5)commit – 提交事务,所有的操作生效,不能回退

4.事务的隔离级别
多个事务之间是隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。

(1)读未提交:允许Transaction1读取Transaction2未提交的修改。
(2)读已提交:要求Transaction1只能读取Transaction2已提交的修改。
(3)可重复读:确保Transaction1可以多次从一个字段中读取到相同的值,即Transaction1执行期间禁止
其它事务对这个字段进行更新。
(4)串行化:确保Transaction1可以多次从一个表中读取到相同的行,在Transaction1执行期间,禁止其它
事务对这个表进行添加、更新、删除操作。可以避免任何并发问题,但性能十分低下。
注意:
①Oracle默认为读已提交,MySQL默认为可重复读
②加锁:如果他发现一个事务中有一张表正在操作,没有提交;另一个事务操作时,他会卡在这个地方,他不会操作
5.存在问题
(1)脏读:当一个事务读取到另一个事务尚未提交的改变(update,insert,delete)时,产生脏读
(2)不可重复度:不可重复读是指在事务1内,读取了一个数据,事务1还没有结束时,事务2也访问了这个数据,修改或删除了这个数据,并提交。紧接着,事务1又读取这个数据。由于事务2的修改,那么事务1两次读到的数据可能是不一样的,因此称为是不可重复读。
(事务1想读取开启事务那一刻的数据,结果却读到了修改或删除后的数据)
(3)幻读:幻读是指在事务1内,读取了一个数据,事务1还没有结束时,事务2也访问了这个数据,添加了这个数据,并提交。紧接着,事务1又读取这个数据。由于事务2的添加,那么事务1两次读到的数据可能是不一样的,因此称为是幻读。
(事务1想读取事务开启那一刻的数据,结果却读到了添加后的数据)

6.存储引擎

(1)InnoDB:
①支持事务
②支持外键
③支持行级锁
(2)MyISAM
①添加速度快
②不支持外键和事务
③支持表级锁
(3)memory
①数据存储在内存中(关闭mysql服务,数据丢失,但表还在)
②执行速度快(没有IO读写)
③默认支持索引(hash表)

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发