@wangxiong
2017-09-21T06:53:12.000000Z
字数 8925
阅读 220
Database
① 关系型数据库(mysql):
由二维表及其实体之间的联系构成的数据组织。关系型数据库使用SQL。
② 非关系型数据库(redis,mogondb):
not only sql,不仅仅是SQL。非关系型数据库的数据是键值结构,key/value,非关系型数据库不需要SQL。
③ 缓存系统(memcache)
Memcache的数据结构是键值结构,但是它的数据放在内存里,它是一个缓存系统,没有存储数据到磁盘文件的功能,因此它不是非关系型数据库。
① SQL:structured query language 专门用于关系型数据库的一门编程语言
② 编程语言的特征:
变量:它可以使用declare来定义变量
数据类型:数值型,字符串型,日期时间型
操作符:+ - * / % > < != and or
函数:count, sum, avg, max, ceil, floor, round
流程控制:分支结构if,循环结构while
① mysql -hlocalhost -P3306 -uroot -p 客户端连接数据库服务器端命令② services.msc Windows的服务管理命令③ net start/stop mysql 命令行窗口启动和停止数据库④ netstat -an 检验本机各端口的网络连接情况
① 修改my.ini配置文件
[mysqld]后面增加一行:skip-grant-tables 跳过权限认证
[mysqld]skip-grant-tables
② 停止mysql服务运行
net stop mysql
③ 重新启动mysql
net start mysql
④ 客户端进入mysql(此时已不需要密码)
⑤ 修改root密码
update user set password=password('123456') where user='root';
⑥ 退出客户端,删除或注释掉my.ini中添加的语句重新启动mysql
[mysqld]# skip-grant-tables
⑦ 重新登录
mysql -hlocalhost -P3306 -uroot -p123456
使用不同的引擎,会影响数据的文件存储方式以及是否支持事务处理功能。
① Myisam:数据操作快速的一种引擎,不支持事务处理功能,支持全文检索。文件保存在数据库名称为目录名的目录中,有3个文件。
.frm 表结构文件.MYD 表数据文件.MYI 表索引文件
② Innodb:功能强大的一种引擎,支持事务处理功能,不支持全文检索。文件保存在两个地方,一个是在数据库名称为目录名的目录中存放表结构文件,它的数据是保存在一个共有的文件中的。
ibdata1 Innodb类型数据表的数据保存文件
① 字符集4个级别:
服务器级:在安装服务器时指定
数据库级:创建数据库时指定,如果不指定,则使用服务器的默认字符集
数据表级:创建数据表时指定,如果不指定,则使用数据库的默认字符集
字段级:在创建数据表时定义字段属性时指定,如果不指定,则使用数据表的默认字符集
② 编码
汉字在Utf8编码下占用3个字节存储空间
汉字在gbk编码下占用2个字节存储空间
show character set (like 'gbk'); 查看数据库支持的字符集show collation like 'gbk%'; 查看所有的校对集
③ 校对集有三种方式
Ci:代表不区分大小写 (gbk_chinese_ci)
Cs:代表区分大小写 (gbk_cs)
Bin:代表使用二进制去进行比较 (gbk_bin) 按照ASCII码值进行排序
在PHP和html中,是utf-8,在数据库中是utf8
show variables like 'character_set_%'; 查看编码参数set character_set_client=gbk;设置character_set_client参数set character_set_results=gbk;设置character_set_result参数set names gbk;代替了设置character_set_client(数据库服务器接收sql), character_set_results(数据库服务器返回结果), character_set_connection(数据库服务器转码)
$link = mysql_connect('localhost:3306','root','123456') 连接并认证mysql_query('set names utf8') 设置字符集参数mysql_select_db('itcast') 选择操作当前的数据库mysql_fetch_assoc() 键值数组mysql_fetch_row() 下标数组mysql_fetch_array() 既有键值又有下标,双数组mysql_fetch_object() 对象方式mysql_num_rows()mysql_error() 返回错误信息mysql_errno() 返回错误编码mysql_data_seek() 移动结果集的指针mysql_free_result() 释放结果集mysql_close($link) 关闭数据库连接
Mysql支持三大类数据类型:数值型,字符串型,日期时间型
| 分类 | 类型1 | 类型2 | 具体类型 |
|---|---|---|---|
| 数值型 | 整数 | tinyint,smallint,mediumint,int,bigint | |
| 小数 | 浮点 | float,double | |
| 定点 | decimal | ||
| 字符串型 | char,varchar,text,blob,enum,set | ||
| 日期时间型 | date,time,datetime,year,timestamp |
① 整数型
| 类型 | 大小(字节) | 范围(有符号) | 范围(无符号) | 用途 |
|---|---|---|---|---|
| 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) | 双精度浮点数值 |
定义方式:字段名称 类型(M, D) unsigned zerofillM:代表总有效位数,不包括小数点D:小数部分的位数`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的值 | 小数值 |
定点型又称为严格的浮点数。它不会发生数据不准确的情况。定义格式:字段名称 decimal(M, D) unsigned zerofill
| 类型 | 大小(字节) | 用途 |
|---|---|---|
| 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说明:
定义方法:字段名 char(L)L:代表字符数。它会根据字符集自动去分配空间。一个字母当成一个字符,一个汉字也当成一个字符。我们不用操心使用了何种字符集。0 < L <= 255
varchar说明:
定义方法:字段名 varchar(L)L:代表占用的字节数。实际占用有两种情况0 < L <= 255,L+1个字节255 < L < 65535时,占用L+2个字节额外出来的1或2也要从65535中扣除。我们是不是还要字符集的问题。Utf8一个汉字要占用3个字节,gbk占用2个字节。实际上系统还会把第一个字节来占用掉。Utf8:(65535-3)/3 = 21844Gbk:(65535-3)/2 = 32766以上就是两种字符集情况下可以定义的最大长度。
| 类型 | 大小(字节) | 范围 | 格式 | 用途 |
|---|---|---|---|---|
| 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的特殊性:
`pubtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENTAMP`edittime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
① 第一范式,NF1,字段的原子性(字段的不可拆分性)
② 第二范式,NF2,消除部分依赖(有一个字段可以来代表整条记录 增加主键字段)
③ 第三范式,NF3,消除传递依赖(不同实体的数据拆分成不同的数据表)
foreign key (classid) references classinfo(id); 创建外键alter table studinfo add foreign key (classid) references classinfo(id);添加外键alter table studinfo drop foreign key studinfo_ibfk_1;删除外键修改外键(关联方式):严格方式:restrict 级联方式:cascade 设置为null:set nullalter table studinfo add foreign key (classid) references classinfo(id)on update cascadeon delete set null;
① 索引分类
primary key:主键,一个表只能有一个主键
unique key:唯一索引,一个表可以有多个唯一索引
index:普通索引,一个表可以有多个普通索引
② 建立索引的原x则:
① 连接查询的分类
Inner join:内连接Outer join:(left join和rigth join)外连接Cross join:交叉连接Natural join:自然连接语法格式:SELECT * FROM 表A [inner|left|right|cross|natural] join 表B on 连接条件
② 内连接(inner join)
有连接条件的查询:1. 总的字段数量是俩个表的字段之和2. 左表中不符合连接条件的数据不会出现3. 右表中不符合连接条件的数据也不会出现4. 右表中会有重复的记录出现如果不加连接条件,则会出现两个表记录数乘积数量的记录
③ 左外连接(left join)
1. 总的字段数是两个数据表字段之和2. 左表中的记录会全部出现3. 右表满足连接的记录会和左表记录对接4. 左表中连接条件不满足的记录,右表数据部分会用null来填充5. 右表中的数据会有重复出现的情况,也会有不显示的记录当前左表是多 对 右表的一 left join 结果是多对一
④ 右外连接(right join)
1. 右表的记录会全部出现2. 右表中记录不满足连接条件的记录左表部分的数据会用null填充3. 左表不满足连接条件的记录不会出现4. 如果左表有多个记录满足右表同一记录的连接条件,右表记录会出现多次
⑤ 交叉连接(cross join)
1.满足连接条件的记录才会出现2.无论左表还右表,只要不满足连接条件,都不出现3.交叉连接时,两个表的地位是平等的
⑥ 自然连接(natural join)
Natural join:自然连接,它会自己找出连接的字段Natural left join:左外连接,省略连接条件的方式Natural right join:右外连接,省略连接条件的方式Natural join相当于cross join + using
把一组SQL当成一个集合,视为一个事务,集合中的SQL要么全部执行成功,要么全部没有效果。如果在执行中间出现了问题,可以回滚到初始状态,保持了完整性。
注意:只有innodb存储引擎才支持事务处理功能。
① 使用transaction实现安全事务处理
start transaction ;开启事务处理commit;提交事务rollback;回滚操作
② 使用autocommit手工执行事务处理
show variables like 'autocommit'; 系统参数autocommit的值为on时,表示客户端的SQL是执行+提交的状态
手工执行事务处理的过程:
1. Set autocommit=0,代表现在SQL只执行先不提交2. 然后我们可以执行我们的一组SQL3. 如果有失败的情况,则可以使用rollback进行回滚4. 如果全部正常完成,可以使用commit进行提交,或者直接set autocommit=1
③ 事务日志
MYSQL的事务处理实际上是利用了日志,在开启安全事务处理的情况下,SQL只是先写到日志文件,并未写入真实的数据表中。
④ 事务处理的ACID特点
事务处理具有原子性,atomicity事务处理中的SQL是一个整体,不能够被分割事务处理具有一致性,consistency事务处理中的SQL要么全执行成功,要么都不生效事务处理是想到隔离的,isolation不同的事务不会相互影响,之间是有隔离的事务处理的结果要有持久性,durability事务处理的结果数据要能够实际的写入数据表中
在数据库test中的一个表student,字段是name,class,score。分别代表姓名、所在班级,分数。1) 算出每个班级中的学生,成绩按照降序排序;select name,class,score from student order by class,score desc;2) 查出每个班的及格人数和不及格人数,格式为:class、及格人数、不及格人数;①case语句SELECT class,SUM(CASE WHEN score>=60 THEN 1 ELSE 0 END),SUM(CASE WHEN score<60 THEN 1 ELSE 0 END)FROM tb1 GROUP BY class②if语句SELECT class,SUM(IF(score>=60,1,0))jige,SUM(IF(score<60,1,0))bujigeFROM studentGROUP BY classLIMIT 0,30;3) 用PHP写入连接数据库("localhost","msuser","mspass")、执行以上SQL、显示结果、判断错误、关闭数据库的过程$connect =mysql_connect("localhost","msuser","mspass");mysql_select_db('test');$sql="SELECT class,SUM(IF(score>=60,1,0))jigei,SUM(IF(score<60,1,0))bujigeiFROM studentGROUP BY classLIMIT 0,30";if($result = mysql_query($sql)){while($row=mysql_fetch_assoc($result)){print_r($row);}}mysql_close($connect);
1) alter table user add sex enum(1,2,3)not null default '1'comment '1:男 2:女 3:保密';//增加字段2) alter table user add index in_age(age);//增加索引
不同操作员不同营业部
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按两个字段分组并统计相关信息:
$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();相应的sql语句: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` descselect contract_id,travel_agency,operator,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,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,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 feeCfrom youngmanager_contract_info group by operator,travel_agency
grant all privileges on *.* to 'root'@'%' identified by 'mm0715xx1201' with grant option;flush privileges;//重新加载权限表