[关闭]
@wangxiong 2017-09-21T06:53:12.000000Z 字数 8925 阅读 220

MySQL基础相关

Database


1、关系型数据库与非关系型数据库

① 关系型数据库(mysql):
由二维表及其实体之间的联系构成的数据组织。关系型数据库使用SQL。
② 非关系型数据库(redis,mogondb):
not only sql,不仅仅是SQL。非关系型数据库的数据是键值结构,key/value,非关系型数据库不需要SQL。
③ 缓存系统(memcache)
Memcache的数据结构是键值结构,但是它的数据放在内存里,它是一个缓存系统,没有存储数据到磁盘文件的功能,因此它不是非关系型数据库。

2、结构化查询语言(SQL)

① SQL:structured query language 专门用于关系型数据库的一门编程语言
② 编程语言的特征:
变量:它可以使用declare来定义变量
数据类型:数值型,字符串型,日期时间型
操作符:+ - * / % > < != and or
函数:count, sum, avg, max, ceil, floor, round
流程控制:分支结构if,循环结构while

3、常用基本命令

  1. mysql -hlocalhost -P3306 -uroot -p 客户端连接数据库服务器端命令
  2. services.msc Windows的服务管理命令
  3. net start/stop mysql 命令行窗口启动和停止数据库
  4. netstat -an 检验本机各端口的网络连接情况

4、找回root密码

① 修改my.ini配置文件
[mysqld]后面增加一行:skip-grant-tables 跳过权限认证

  1. [mysqld]
  2. skip-grant-tables

② 停止mysql服务运行

  1. net stop mysql

③ 重新启动mysql

  1. net start mysql

④ 客户端进入mysql(此时已不需要密码)
⑤ 修改root密码

  1. update user set password=password('123456') where user='root';

⑥ 退出客户端,删除或注释掉my.ini中添加的语句重新启动mysql

  1. [mysqld]
  2. # skip-grant-tables

⑦ 重新登录

  1. mysql -hlocalhost -P3306 -uroot -p123456

5、存储引擎的知识

使用不同的引擎,会影响数据的文件存储方式以及是否支持事务处理功能。
① Myisam:数据操作快速的一种引擎,不支持事务处理功能,支持全文检索。文件保存在数据库名称为目录名的目录中,有3个文件。

  1. .frm 表结构文件
  2. .MYD 表数据文件
  3. .MYI 表索引文件

② Innodb:功能强大的一种引擎,支持事务处理功能,不支持全文检索。文件保存在两个地方,一个是在数据库名称为目录名的目录中存放表结构文件,它的数据是保存在一个共有的文件中的。

  1. ibdata1 Innodb类型数据表的数据保存文件

6、字符集与校对集

① 字符集4个级别:
服务器级:在安装服务器时指定
数据库级:创建数据库时指定,如果不指定,则使用服务器的默认字符集
数据表级:创建数据表时指定,如果不指定,则使用数据库的默认字符集
字段级:在创建数据表时定义字段属性时指定,如果不指定,则使用数据表的默认字符集
② 编码
汉字在Utf8编码下占用3个字节存储空间
汉字在gbk编码下占用2个字节存储空间

  1. show character set (like 'gbk'); 查看数据库支持的字符集
  2. show collation like 'gbk%'; 查看所有的校对集

③ 校对集有三种方式
Ci:代表不区分大小写 (gbk_chinese_ci)
Cs:代表区分大小写 (gbk_cs)
Bin:代表使用二进制去进行比较 (gbk_bin) 按照ASCII码值进行排序

7、相关编码

在PHP和html中,是utf-8,在数据库中是utf8

  1. show variables like 'character_set_%'; 查看编码参数
  2. set character_set_client=gbk;设置character_set_client参数
  3. set character_set_results=gbk;设置character_set_result参数
  4. set names gbk;代替了设置character_set_client(数据库服务器接收sql), character_set_results(数据库服务器返回结果), character_set_connection(数据库服务器转码)

8、相关函数

  1. $link = mysql_connect('localhost:3306','root','123456') 连接并认证
  2. mysql_query('set names utf8') 设置字符集参数
  3. mysql_select_db('itcast') 选择操作当前的数据库
  4. mysql_fetch_assoc() 键值数组
  5. mysql_fetch_row() 下标数组
  6. mysql_fetch_array() 既有键值又有下标,双数组
  7. mysql_fetch_object() 对象方式
  8. mysql_num_rows()
  9. mysql_error() 返回错误信息
  10. mysql_errno() 返回错误编码
  11. mysql_data_seek() 移动结果集的指针
  12. mysql_free_result() 释放结果集
  13. mysql_close($link) 关闭数据库连接

9、数据类型

Mysql支持三大类数据类型:数值型,字符串型,日期时间型

分类 类型1 类型2 具体类型
数值型 整数 tinyint,smallint,mediumint,int,bigint
小数 浮点 float,double
定点 decimal
字符串型 char,varchar,text,blob,enum,set
日期时间型 date,time,datetime,year,timestamp

10、数值型

① 整数型

类型 大小(字节) 范围(有符号) 范围(无符号) 用途
tinyint 1 (-128,127) (0,255) 小整数值
smallint 2 (-32768,32767) (0,65535) 大整数值
mediumint 3 (-8388608,8388607) (0,16777215) 大整数值
int或integer 4 (-2147483648,2147483647) (0,4294967295) 大整数值
bigint 8 (-9233372036854775808,9223372036854775807) (0,18446744073709551615) 极大整数值

② 小数浮点型

类型 大小(字节) 范围(有符号) 范围(无符号) 用途
float 4 (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度浮点数值
double 8 (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度浮点数值
  1. 定义方式:字段名称 类型(M, D) unsigned zerofill
  2. M:代表总有效位数,不包括小数点
  3. D:小数部分的位数
  4. `travel_fee_adult` float(10,2) unsigned NOT NULL COMMENT 'xx',

③ 小数定点型

类型 大小(字节) 范围(有符号) 范围(无符号) 用途
decimal 对decimal(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值
  1. 定点型又称为严格的浮点数。它不会发生数据不准确的情况。
  2. 定义格式:字段名称 decimal(M, D) unsigned zerofill

11、字符串型

类型 大小(字节) 用途
char 0-255(2^8-1) 定长字符串
varchar 0-65535(2^16-1) 变长字符串
tinytext 0-255(2^8-1) 短文本字符串
text 0-65535(2^16-1) 长文本数据
mediumtext 0-16777215(2^24-1) 中等长度文本数据
longtext 0-4294967295(2^32-1) 极大文本数据
tinyblob 0-255(2^8-1) 不超过 255 个字符的二进制字符串
blob 0-65535(2^16-1) 二进制形式的长文本数据
mediumblob 0-16777215(2^24-1) 二进制形式的中等长度文本数据
longblob 0-4294967295(2^32-1) 二进制形式的极大文本数据
enum 最大可定义65536个数据项 枚举类型,通常用于存储单选内容
set 最多可定义64个数据项 集合类型,适合保存多选内容

char说明:

  1. 定义方法:字段名 char(L)
  2. L:代表字符数。它会根据字符集自动去分配空间。一个字母当成一个字符,一个汉字也当成一个字符。我们不用操心使用了何种字符集。
  3. 0 < L <= 255

varchar说明:

  1. 定义方法:字段名 varchar(L)
  2. L:代表占用的字节数。
  3. 实际占用有两种情况
  4. 0 < L <= 255L+1个字节
  5. 255 < L < 65535时,占用L+2个字节
  6. 额外出来的12也要从65535中扣除。
  7. 我们是不是还要字符集的问题。Utf8一个汉字要占用3个字节,gbk占用2个字节。
  8. 实际上系统还会把第一个字节来占用掉。
  9. Utf8:(65535-3)/3 = 21844
  10. Gbk:(65535-3)/2 = 32766
  11. 以上就是两种字符集情况下可以定义的最大长度。

12、日期时间型

类型 大小(字节) 范围 格式 用途
date 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
time 3 -838:59:59/838:59:59 HH:MM:SS 时间值或持续时间
datetime 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
year 1 1901/2155 YYYY 年份值
timestamp 8 1970-01-01 00:00:00/2037-xx-xx YYYYMMDD HHMMSS 混合日期和时间值,时间戳

timestamp的特殊性:

  1. `pubtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENTAMP
  2. `edittime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'

13、设计范式

① 第一范式,NF1,字段的原子性(字段的不可拆分性)
② 第二范式,NF2,消除部分依赖(有一个字段可以来代表整条记录 增加主键字段)
③ 第三范式,NF3,消除传递依赖(不同实体的数据拆分成不同的数据表)

14、外键

  1. foreign key (classid) references classinfo(id); 创建外键
  2. alter table studinfo add foreign key (classid) references classinfo(id);添加外键
  3. alter table studinfo drop foreign key studinfo_ibfk_1;删除外键
  4. 修改外键(关联方式):严格方式:restrict 级联方式:cascade 设置为nullset null
  5. alter table studinfo add foreign key (classid) references classinfo(id)
  6. on update cascade
  7. on delete set null;

15、索引

① 索引分类
primary key:主键,一个表只能有一个主键
unique key:唯一索引,一个表可以有多个唯一索引
index:普通索引,一个表可以有多个普通索引

② 建立索引的原x则:

16、连接查询

① 连接查询的分类

  1. Inner join:内连接
  2. Outer join:(left joinrigth join)外连接
  3. Cross join:交叉连接
  4. Natural join:自然连接
  5. 语法格式:SELECT * FROM A [inner|left|right|cross|natural] join B on 连接条件

② 内连接(inner join)

  1. 有连接条件的查询:
  2. 1. 总的字段数量是俩个表的字段之和
  3. 2. 左表中不符合连接条件的数据不会出现
  4. 3. 右表中不符合连接条件的数据也不会出现
  5. 4. 右表中会有重复的记录出现
  6. 如果不加连接条件,则会出现两个表记录数乘积数量的记录

③ 左外连接(left join)

  1. 1. 总的字段数是两个数据表字段之和
  2. 2. 左表中的记录会全部出现
  3. 3. 右表满足连接的记录会和左表记录对接
  4. 4. 左表中连接条件不满足的记录,右表数据部分会用null来填充
  5. 5. 右表中的数据会有重复出现的情况,也会有不显示的记录
  6. 当前左表是多 右表的一 left join 结果是多对一

④ 右外连接(right join)

  1. 1. 右表的记录会全部出现
  2. 2. 右表中记录不满足连接条件的记录左表部分的数据会用null填充
  3. 3. 左表不满足连接条件的记录不会出现
  4. 4. 如果左表有多个记录满足右表同一记录的连接条件,右表记录会出现多次

⑤ 交叉连接(cross join)

  1. 1.满足连接条件的记录才会出现
  2. 2.无论左表还右表,只要不满足连接条件,都不出现
  3. 3.交叉连接时,两个表的地位是平等的

⑥ 自然连接(natural join)

  1. Natural join:自然连接,它会自己找出连接的字段
  2. Natural left join:左外连接,省略连接条件的方式
  3. Natural right join:右外连接,省略连接条件的方式
  4. Natural join相当于cross join + using

17、安全事务处理

把一组SQL当成一个集合,视为一个事务,集合中的SQL要么全部执行成功,要么全部没有效果。如果在执行中间出现了问题,可以回滚到初始状态,保持了完整性。
注意:只有innodb存储引擎才支持事务处理功能。
① 使用transaction实现安全事务处理

  1. start transaction ;开启事务处理
  2. commit;提交事务
  3. rollback;回滚操作

② 使用autocommit手工执行事务处理

  1. show variables like 'autocommit' 系统参数
  2. autocommit的值为on时,表示客户端的SQL是执行+提交的状态

手工执行事务处理的过程:

  1. 1. Set autocommit=0,代表现在SQL只执行先不提交
  2. 2. 然后我们可以执行我们的一组SQL
  3. 3. 如果有失败的情况,则可以使用rollback进行回滚
  4. 4. 如果全部正常完成,可以使用commit进行提交,或者直接set autocommit=1

③ 事务日志

  1. MYSQL的事务处理实际上是利用了日志,在开启安全事务处理的情况下,SQL只是先写到日志文件,并未写入真实的数据表中。

④ 事务处理的ACID特点

  1. 事务处理具有原子性,atomicity
  2. 事务处理中的SQL是一个整体,不能够被分割
  3. 事务处理具有一致性,consistency
  4. 事务处理中的SQL要么全执行成功,要么都不生效
  5. 事务处理是想到隔离的,isolation
  6. 不同的事务不会相互影响,之间是有隔离的
  7. 事务处理的结果要有持久性,durability
  8. 事务处理的结果数据要能够实际的写入数据表中

18、矛盾体sql语句

  1. 在数据库test中的一个表student,字段是nameclassscore。分别代表姓名、所在班级,分数。
  2. 1) 算出每个班级中的学生,成绩按照降序排序;
  3. select name,class,score from student order by class,score desc;
  4. 2) 查出每个班的及格人数和不及格人数,格式为:class、及格人数、不及格人数;
  5. case语句
  6. SELECT class,
  7. SUM(CASE WHEN score>=60 THEN 1 ELSE 0 END),
  8. SUM(CASE WHEN score<60 THEN 1 ELSE 0 END)
  9. FROM tb1 GROUP BY class
  10. if语句
  11. SELECT class,
  12. SUM(IF(score>=60,1,0))jige,
  13. SUM(IF(score<60,1,0))bujige
  14. FROM student
  15. GROUP BY class
  16. LIMIT 0,30;
  17. 3) PHP写入连接数据库("localhost","msuser","mspass")、执行以上SQL、显示结果、判断错误、关闭数据库的过程
  18. $connect =mysql_connect("localhost","msuser","mspass");
  19. mysql_select_db('test');
  20. $sql="SELECT class,
  21. SUM(IF(score>=60,1,0))jigei,
  22. SUM(IF(score<60,1,0))bujigei
  23. FROM student
  24. GROUP BY class
  25. LIMIT 0,30";
  26. if($result = mysql_query($sql)){
  27. while($row=mysql_fetch_assoc($result)){
  28. print_r($row);
  29. }
  30. }
  31. mysql_close($connect);

19、基本语句

  1. 1) alter table user add sex enum(1,2,3)not null default '1'
  2. comment '1:男 2:女 3:保密';//增加字段
  3. 2) alter table user add index in_age(age);//增加索引

20、sql语句统计

不同操作员不同营业部

  1. select * from (select contract_id as business_id,business_sector,operator from `youngmanager_contract_info` group by business_sector union select contract_id as operator_id,business_sector,operator from `youngmanager_contract_info` group by operator) as uni order by business_sector

laravel按两个字段分组并统计相关信息:

  1. $travelAgencyUnique = DB::table('contract_info')->select('contract_id', 'travel_agency', 'travel_type',DB::raw('count(travel_agency) as contract_num'), DB::raw('count(operator) as operator_num'),DB::raw('sum(passenger_number) as tourist_num'), DB::raw('sum(travel_fee_total) as contract_fee'))->groupBy('travel_type', 'travel_agency')->orderBy('contract_id', 'desc')->get();
  2. 相应的sql语句:
  3. select `contract_id`, `travel_agency`, `travel_type`, count(travel_agency) as contract_num, count(distinct operator) as operator_num, sum(passenger_number) as tourist_num, sum(travel_fee_total) as contract_fee from `youngmanager_contract_info` group by `travel_type`, `travel_agency` order by `contract_id` desc
  4. select contract_id,travel_agency,operator,
  5. sum(case when travel_type=1 then 1 else 0 end )as typeA ,sum(case when travel_type=1 then passenger_number else 0 end) as numberA,sum(case when travel_type=1 then travel_fee_total else 0 end) as feeA,
  6. sum(case when travel_type=2 then 1 else 0 end )as typeB ,sum(case when travel_type=2 then passenger_number else 0 end) as numberB,sum(case when travel_type=2 then travel_fee_total else 0 end) as feeB,
  7. sum(case when travel_type=3 then 1 else 0 end )as typeC ,sum(case when travel_type=3 then passenger_number else 0 end) as numberC,sum(case when travel_type=3 then travel_fee_total else 0 end) as feeC
  8. from youngmanager_contract_info group by operator,travel_agency

21、MySql开启远程用户登录

  1. grant all privileges on *.* to 'root'@'%' identified by 'mm0715xx1201' with grant option;
  2. flush privileges;//重新加载权限表
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注