1+x mysql知识

 CHmysql数据库



#如果没有修改my.ini 配置文件的默认字符集,在创建数据库时,指定字符集

    create database db_name character set 'utf8';

#特殊字符(关键字)用反引号
    create database `create`; 


MySQL\data 目录下将自动生成一个对应名称的目录,目录内部有一个db.opt文件

# 显示数据库创建信息
    show create database db_name;

# 删除数据库
    drop database db_name;

 # 进入(使用)数据库
    use database;

# 显示当前打开的数据库
    select database();



# 第二节: MySQL 表结构管理 #

创建数据表
    create tabe 表明(字段 字段类型,......)

MySQL\data目录下的数据库目录中将自动生成一个对应名称的.frm文件

删除数据表
    drop table 表明;


查看数据表
    show tables;
#查看字母是'abc'开头的表
    show tables like 'abc%'; # %是通配符


查看表创建信息
    show create table 表名;


查看数据表结构

    desc 表名;


###第三节 MySQL 用户管理

登录 

MySQL 是基于C/S架构,必须在客户端通过终端窗口,链接MySQL服务器,进行操作.

    mysql -h host -u user -pc
    Enter password: ******

用户管理

)超级用户root
)修改账号密码, 例:

    ##DOS 命令下修改,将root账号密码修改为 1234
     mysqlladmin -u root password 1234 ## 语句最后不要加分号,否则密码就是'1234;'
    ##mysql命令
     set password for 'root'@'localhost'=password('1234');

)创建用户

使用create语句进行创建用户,语句格式如下:
    create user 'username'@'host'identified by 'password';

其中:username 表示要创建的用户名:host表示制定该用户在那个主机上可以登陆,如果是本地用户可用localhost,如果想让改用户可以从任意远程主机登陆,可以使用通配符%;password表示该用户的登录密码,密码可以为空,如果为空则该用户可以不需要密码登录服务器。例:

    create user 'zhangsan'@'localhost' identfied by '123456';

)删除用户

删除用户使用drop语句,语句格式如下:

    drop user 'username'@'host';

##修改配置文件my.ini

字符集
MySQL默认字符集是latin(拉丁),改变为utf8才能正确显示中文

[mysqld]下添加
character-set-server=utf8
init-connect='\set NAMES utf8';

修改默认引擎
InnoDB 优于MYISAM
default-storage-engine=MYISAM 修改为 default-storage-engine-InnoDB

个性化 mysql 提示符
MySQL默认提示符是"mysql>",可以个性化定制,例如:'mysql(数据库)>'

[mysql]下添加

prompt"mysql(\d)>"


#第四节 默认数据库


information_schema

提供了访问数据库元数据的方式。什么是元数据?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述改信息的其他术语包括“数据词典”和“系统目录”。

performance_schema

mysql5.5版本新增了一个性能优化的引擎

mysql

这个是MySQL的核心数据库,主要负责存储数据库的用户、权限设置、关键字等MySQL自己需要使用的控制和管理信息。不可以删除,也不要轻易修改这个数据库里面的表信息。

test

安装时候创建的一个测试用数据库,空数据库,没有任何表,可以删除(新版mysql已取消)。

# 第三章 SQL基本语法 #

##第一节 SQL语句简介

###sql语言

SQL(Stuctured Query Language)是用于访问和处理数据库的标准计算机语言。使用SQL访问和处理数据系统中的数据,这类数据库包括:Oracle,mysql,Sybase,SQLServer,DB2,Access等等。

###基本规范:

1)SQL对大小写不敏感,一般数据库名称、表名称、字段名称全部小写
2) MySQL要求在每条SQL命令的末端使用分号(MS Access 和 SQL Server 2000,则不必再每条SQL 语句之后使用分号)。

###注释

    mysql>select 1+1; #这是一个注释
    mysql>select 1+1; --这个注释直到该行结束
    mysql>select 1 /*这是一个在行中间的注释*/ +1;
    mysql>select 1+
    /*
    这是一个
    多行注释的形式
    */


##第二节 MySQL 基本数据类型

###字段类型

数据类型是指列、存储过程参数、表达式和局部变量的数据特质,它决定了数据的存储方式,代表了不同的信息类型。不同的数据库,数据类型有所不同,MySQL 数据库有一下几种数据类型:

)字符串型

类型       字节    大小                         说明
char       1      0-255字符(2^8)             定长字符串
varchar    2      0-65 535字符(2^16)         变长字符串
tinytext   1      0-255字符(2^8)             短文本(与char存储形式不同)
text       2      0-65 535字符(2^16)         文本
mediumtext 3      0-16 777 215字符(2^24)     中等长度文本
longtext   4      0-4 294 967 295字符(2^32)  极大文本


注意:char和varchar需要指定长度,例如:char(10)

) 整数型

类型           字节    范围(有符号)                                               范围(无符号)                        说明
tinyint         1     (-128,127)                                               (0,255)                            很小整数值
smallint        2     (-32 768,32 767)                                         (0, 65 535)                        小整数值
mediumint       3     (-8 388 608, 8 388 607)                                  (0,16 777 215)                     中整数值
int或integer    4      (-2 147 483 648,2 147 483 647)                          (0,4 294 967 295)                  整数值
bigint          8      (-9 233 372 036 854 775 808,9 233 372 036 854 755 807)  (0, 18 446 744 073 709 551 615)    很大的整数值


很多人喜欢在定义数据时,这样写:

    create table tbl_name(
    age int(10)
    );

int后面()中的数字不代表占用空间容量。而代表最小显示位数。这个东西基本没有意义,除非你对字段指定zerofill。mysql会自动分配长度:int(11)、tinyint(4)、smallint(6)、mediumint(9)、bigint(20)、所以,建议在使用时,就用这些默认的显示长度就可以了。不用再去自己填长度(比如:int(10)、tinyint(1)之类的基本没用)。

) 浮点型

类型             字节        范围                             用途
float(M,D)    4      23bit(约6~7位10进制数字)      单精度浮点数<br/>值绝对能保证精度为6~7位有效数字
double(M,D)   8      52bit(约 15~16位10进制数字)   双精度浮点数值<br/>精度为15~16位有效数字
decimal(M,D)  M+2    依赖于M和D的值                定点型

M(精度),代表总长度(整数位和小数位)限制
D(标度),代表小数位的长度限制

M必须大于等于D

数字的修饰符          功能            说明
unsigned              无符号     非负数
zerofill            签到0      整形前加0(自动添加unsigned)

)日期型
   
类型            字节            范围                                                格式                                      用途
date         3    1000-01-01---9999-12-31                             YYYY-MM-DD                              日期值
time         3    -838:59:59---838:59:59                              HH:MM:SS                           时间值或持续时间
year         1    1901---2155                                           YYYY                                  年份值
datetime     8    1000-01-01 000:00---9999-12-31 23:59:59           YYYY-MM-DDHH:MM:SS                      混合日期和时间值
timestamp    4    1970-01-01 00:00:00/2038结束时间是第2147483647秒,  YYYYMMDDHHMMSS                     时间戳,混合日期和时间值
                  北京时间2038-1-19 11:14:07,
                  格林尼治时间2038年1月19日凌晨03:14:07
 
)列举与枚举

名称          字节          说明
set       1、2、3、4或8    列举:可以取SET列表中的一个或多个元素(多选)
enum          1或2        枚举:可以取ENUM列表中的一个元素(单选)

    create table student(
    int tinyint #微小整形
    name varchar(10), #变长字符
    sex enum ('m','w'), #单选
    birthday date, #日期型
    tel char(11), #定长字符
    city char(1), #城市
    hobby set('1','2','3','4'), #多选
    introduce text #个人介绍
    );

)字段属性

属性                    功能            说明
not null            非空     必须有值,不允许为null
default             默认值   当插入记录没有赋值,自动赋予默认值(允许为null)
primary key         主键     唯一标识一行数据的字段(主键自动为not null)
auto_increment      自动增量  不能单独使用,必须与primary key一起定义
unique(unique key)  唯一      记录不重复(一张表可以有多个unique,允许为null)


##第三节  数据的增、删、改

增删改查(简称:CURD)

###  增

    #方法一
    insert into students(name,age) value ('张三','20');
    #方法二:省略字段名,字段位要一一对应,不能跳过(auto_increment字段,可以使用null或default)
    insert into students values (null,'张三','20');
    #方法三:批量增加数据
    insert into students(name,age) values ('张三','20'),('李四','21'),('王五','22');

###删

用delete删除记录,一定要加where条件,否则表数据全部删除!!
    
    delete from 表明 where xx=xxx;

用truncate删除记录,不能加where条件,直接删除全部记录,id索引重新从1开始

    truncate table 表明;

###改

单条修改

update 表名 set xx=xx,xxx=xx where xxx=xxx and xxx=xxx;

    #多条修改
    update students
        set name = case id #id字段
            when 1 then 'zhangsan'
            when 2 then 'lisi'
            when 3 then 'wangwu'
            when 4 then 'zhaoliu'
        end,
        city = case id
            when 1 then '2'
            when 2 then '4'
            when 3 then '1'
            when 4 then '2'
        end
    where id in(1,2,3,4);


#第四章 数据的 查

SELECT 语句用于从表中选取数据。结果被存储在一个结果表中(成为结果集)。

##第一节 查询表达式 

    #当前使用的数据库
    select database();
    #查看当前MySQL版本
    select version();
    #查看当前用户
    select user();
    #查看运算结果
    select 1+2;


##第二节 条件表达式 

from 子句 

    #字段用','隔开,至少有一个字段,最终结果集按照这个这个顺序显示
    select 字段1,字段2...from 表明;
    
    # *代表所有字段
    select * from  表名;

distinct(去重)

    #去重后的结果,distinct必须紧接着select后面
    select distinct 字段 from 表名;
    
    #统计不重复的个数
    select count(distinct 字段) from 表名;


###where 子句

where子句适用于对记录的 删 、改、查操作。

对记录进行过滤,如果没有规定where子句,则显示所有记录。

在where表达式中,可以使用函数或运算符,运算符包括:

类型            运算符
算术            + - * / %
比较            > < >= <= !==
逻辑         or || and && not!
提升优先级    ()

    # 搜索id<20的所有数据
    select * from students where id<20;
    # 搜索id编号为偶数的数据
    select * from studnets where id%2=0;

where 条件关键字

in:查询一个集合的数据

    #搜索id在(1,3,7)之中的数据
    select * from students where id=1||id=3||id=7;
    select * from students where id in(1,3,7);
    
    #一次删除多条记录
    delete from students where id=3||id=15||id=23;
    delete from students where id in(3,15,23);

between...and...:查询一个区间的数据

    #搜索id在 20-40之间的数据
    select * from students where id>20 && id<40;
    select * from students where id between 20 and 40;
    
    #删除id在20-40之间的数据
    delete from students where id between 20 and 40;

not:排除

    #搜索id除了20-40之间的数据
    select * from students where id not between 30 and 40;

###like 子句

用于模糊查询 %: 任意字符长度     _  :一个字符长度

    #搜索name名字以5结尾的数据
    select * from students where name like '张%';
    #搜索name名字包含字母s的数据
    select * from students where name like '%s%';
    #搜索id以5结尾的两位数数据
    select * from students where id like '_5';

###limit子句

控制查询记录条数,数据表中的记录,索引从0开始

    select * from students limit 2 #返回两条记录
    select * from students limit 3,4  #从索引为3的记录开始,返回4条记录

    #php中的分页功能,偏移值的计算:(当前页-1)* 每页记录数
    select name from student limit 4 offset 3
    #还可以使用offset(偏移) : 从索引为3的记录开始,返回4条


###group by (结果分组)

根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表
利用group by 分组信息进行统计,常见的是配合max等聚合函数筛选数据后分析。

select 指定的字段要么作为分组的依据 (Group By语句的后面),要么就要被包含在聚合函数中。

    #简单分组
    select sex from students group by sex;

    #聚合函数分组
    select count(*),city from students group by city;


###order by(结果排序)

按照给定的字段进行排序, asc:升序(默认) desc:降序

如果同时选择多个字段,先按一个字段排序,如果第一个字段值相等,在尝试第二个字段,以此类推

    #默认升序
    select * from students order by birthday;
    #降序
    select * from students order by birthday desc;

###查询语句的书写顺序

select -> 字段 -> from -> 表名 -> where -> group by -> order by -> limit

别名

    select a.name as myname from students as a

    # myname是name字段的别名
    # a是students表的别名


##第三节 多表查询

    select a.name,c.name,b.score from students as a,score as b,course as c where b.user_id=6 and b.courser_id=4 and a.id=b.user_id and c.id=b.course_id;

##表连接

###内连接
JOIN:如果表中有至少一个匹配,则返回行

    select a.*,b.name from students as a [innder] join city as b on a.livecity=b.id;

LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行

    select a.*,b.name from students as a left join city as b on a.livecity=b.id;

RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
    
    select a.*,b.name from students as a right join city as b on a.livecity=b.id;

FULL JOIN: 只要其中一个表中存在匹配,就返回行(mysql不支持)

    #带有连接的分组
    select city.name,count(*) from students,city where students.livecity=city.id group by students.livecity;

###子查询
子查询(subquery)是指出现在其他sql语句内的select子句(嵌套在查询内部,且必须始终出现在圆括号内)

    #查找城市名称是北京的
    #普通查询方式
    select * from students where livecity=1;
    #子查询方式
    select * from students where livecity=(select id from city where name='北京');
子查询可以包含多个关键字或条件,如:distinct、group by、order by、limit、函数等
子查询的外层可以是:select,insert,update


#第五章 视图与事务

##第一节

视图是从一个或几个基本表(或视图)中导出的虚拟的表。在系统的数据字典中仅存放了视图的定义,不存放视图对应的数据。视图是原始数据库数据的一种变换,是查看表中数据的另外一种方式。可以将视图看成是一个移动的窗口。通过它可以看到感兴趣的数据。视图是从一个或多个实际表中获得的,这些表的数据存放在数据库中。那些用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。


##创建视图

    CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition;
    #viewname为欲创建的视图名,columnnams(s)为查询的列名,table_name为查询的表名,condition为查询条件。

##修改视图
    
    #ALTER语句:
    ALTER VIEW view_name AS SELECT colunm_name(s) FROM table_name WHERE condition;
    #CREATE OR REPLACE 语句:  
    ALTER VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition;

##删除视图

    DROP view view_name;
    
##查询视图

    SHOW TABLES;
    SHOW TABLE STATUS;

查看某个视图的定义:
    
    SHOW CREATE VIEW view_name;

##第二节 事务

####回滚 
    
    rollback;    


#第六章 索引约束分区

##第一节 索引

索引是帮助MySQL高效获取数据的数据结构

在MySQL中,对于一个Primary Key的列,MySQL已经自动对其建立了Unique和Index。

###创建索引

    create table 表名(
    id int not null,
    username varchar(16) not null,
    index(username(length))    #用username字段作为索引
    );

###显示索引
    
    show index from 表名;

### 删除索引

    alter table 表名 drop index name:

##第二节 约束(constraint)

约束保证数据的完整性和一致性,根据约束的字段数目的多少,约束又分为表级约束和列级约束

列级约束:针对某一字段来使用
表级约束:针对两个或两个以上的字段使用

约束类型包括:
not null(非空约束)

primary key(主键约束)    #为没有主键的表添加主键    alter table 表名 add primary key(字段名);
主键自动为notnull(同时作为表的索引)

unique key(唯一约束)    primary key被自动定义为unique约束。 每个表可以有多个unique,但是每个表只能有一个primary key约束

default(默认约束)  用于约束对应列中的值的默认值

foreign key(外键约束)
字表(具有外键列的表)和父表(子表所参照的表),存储引擎只能为innoDB.
外键列和参照列必须具有相似的数据类型。
    - 如果是数字类型,数字的长度、是否有符号位 必须相同
    - 字符类型的长度则可以不同

外键列和参照列必须创建索引(如果外键列不存在索引的话,MySQL将自动创建索引).


##第三节 删除约束

删除primary key

    alter table 表名 drop primary key;

删除index
    
    alter table 表名 drop index index_name;

删除外键约束
    
    alter table 表名 drop foreign key FK_ID;

##第四节 索引与约束的关系

索引是面向数据库本身的,用于查询优化等操作。约束则更多的是业务上的关系。
通常,创建唯一约束就自动获取唯一索引, 是因为数据库认为对数据库进行唯一检
查时,如果该字段上有索引会很快,所以创建唯一约束就默认创建唯 - -索引。同样,
常见的主键即是唯一性的约束, 也是个索引。但对于not nul这样的约束,数据库
是不会创建索引的。

##第五节 分区

如果一张表的数据量太大, 不仅查找数据的效率低下,而且难以找到一块集中的存储来存放。为了解决这个问题,数据库推出了分区的功能。MySQL 表分区主要有以下四种类型:

RANGE 分区:
RANGE即范围分区,根据区间来判断位于那个分区。这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义。

LIST 分区:
LIST 分区类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。

HASH分区:
HASH分区基于用户定义的表达式返回值来选择分区,该表达式对要插入到表的行中列值进行Hash计算。

KEY分区:

KEY分区类似HASH,但是HASH允许用户使用自定义表达式,而KEY分区不允许,它需要使用MySQL服务器提供的HASH函数,同时HASH分区只支持整数分区,而KEY分区支持除BLOB和TEXT类型外其他列。

#第七章 存储过程、触发器

##存储过程的创建和调用

    create procedure 存储过程名称(in|out|inout参数名称 参数类型,......)
    begin
    过程体;
    end


实例:

    CREATE PROCEDURE in_users(in in_id int,in in_name char(100),in in_phone varchar(100),in in_address varchar(100))
    begin
        set @id=in_id;
        set @name_=in_name;
        set @phone=in_phone;
        set @address=in_address;
        INSERT into users VALUES (@id,@name_,@phone,@address);
    end
    
    call in_users(1,'李剑','15031159880','石家庄');
    
##查询、修改与删除

查询:

查看所有存储过程状态:
    
    SHOW PROCEDURE STATUS;

    SHOW PROCEDURE STATUS WHERE DB='数据库名';

    SHOW PROCEDURE STATUS WHERE name LIKE '%Student%'; 
查询存储过程详细代码:
    
    SHOW CREATE PROCEDURE 过程名;

修改:
    
    ALTER PROCEDURE 过程名([过程参数[,...]])过程体;

删除:

    DROP PROCEDURE 过程名;
注意:不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程。

##调用存储过程

    CALL 存储过程名([过程参数[,...]]);


##第二节 触发器


###创建触发器

    CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW trigger_stmt

trigger_name 标识触发器名称,由用户自行制定。
trigger_time 标识触发时机,取值为BEFORE 或 AFTER;
trigger_event 标识触发事件,取值为INSERT、UPDATE DELETE;
tb_name 标识建立触发器的表名,即在哪张表上建立触发器。
FOR EACH ROW 表示任何一条记录上的操作满足触发事件都会触发该触发器。
trigger_stmt 触发器程序体,可以是一句sql语句,<br/>或者用BEGIN和END包含的多条语句,与存储过程类似。

触发事件类型介绍如下:

INSERT型触发 插入某一行时激活触发器,可能通过INSERT、LOAD、DATA、REPLACE 语句触发
UPDATE型触 更改某一行时激活触发器,可能通过UPDATE语句触发
DELETE型触 删除某一行时激活触发器,可能通过DELETE、REPLACE语句触发

实例:

    CREATE trigger tir_stuinsert after insert
    on student for each row
    BEGIN
        declare c int;
        set c=(select stuCount from class where classID=new.classID);
        update class set stuCount=c+1 where calssID = new.classID;
    END

从需求我们可以得知,版内学生数的变化是在插入学生记录之后发生的,所以创建的触发器类型为after insert类型。


##查看触发器

SHOW TRIGGERS;

##删除触发器

DROP TRIGGER [IF EXISTS] trigger_name

##触发器执行顺序

日常开发中创建的数据库通常都是InnoDB数据库,在数据库上建立的表大都是事务性表,也就是事务安全的,这时触发器的执行顺序主要是:

1:如果BEFORE类型的触发器执行失败,SQL无法正确执行。
2:如果SQL执行失败时,AFTER类型的触发器不会触发。
3:如果AFTER类型的触发器执行失败,数据会回滚。

如果是对数据库的非事务表进行操作,当触发器执行顺序中的任何一步执行出错,那么久无法回滚了,数据可能会出错。

#第八章 MYSQL函数

##第一节 运算函数

abs(x):返回x的绝对值
floor(x):返回小于x的最大整数值
round(x,y):返回参数x的四舍五入的有y位小数的值
mod(x,y):返回x/y的模(余数)
greatest(x1,x2,...,xn):返回集合中最大的值
least(x1,x2,...,xn):返回集合中最小的值

##第二节 字符串函数

trim(str):去除字符串首尾两端的空格
upper(str):字符串转大写
concat(s1,s2,...,sn):将s1,s2,...,sn连接成字符串

    #concat
    insert into tb_name value(concat('abc','def'));

##第三节 日期函数

year(date):返回日期date的年份(1000-9999)
month(date): 返回date的月份值(1~12)
dat(date):返回date的日(1~31)
curdate():返回当前的日期
week(date):返回日期date为一年中第几周(0~53)
now():返回当前的日期和事件
curtime():返回当前的时间
hour(time):返回time的小时值(0~23)
minute(time):返回time的分钟值(0~59)

##第四节 聚合函数

count(col):统计记录的条数
sum(col):求和
avg(col):求平均值
max(col):求最大值
min(col):求最小值


FOUND_ROWS()与count()的区别:
1、当SQL限制条件太多时,count()的执行效率不是很高,最好使用FOUND_ROWS()
2、当SQL查询语句没有where等条件限制时,使用count()函数的执行效率较高。

#第九章 数据库备份

使用Navicat可视化工具导入 导出数据,备份 恢复数据

##第一节 备份数据

mysqldump -u[用户名]-p[密码][数据库名]>[path]/[名称].sql


##第二节 恢复数据

mysql>source c:\system.sql

猜你喜欢

转载自www.cnblogs.com/lijian-cn/p/11941201.html