数据库安装-1

mariadb 10.3.14 安装

centos  7  yum  源
[mariadb]
name = MariaDB
baseurl =  https://mirrors.tuna.tsinghua.edu.cn/mariadb//mariadb-10.3.14/yum/centos7-amd64/
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck= 0
安装
yum  -y install  mariadb-server  
./scripts/mysql_install_db    --datadir=path     --defaults-file=name   --user=user_name    
在其上层目录执行初始化数据库
cp   ./suport-files/mysql.server    /etc/rc.d/init.d/mysqld
mysql_secure_installation     删除匿名用户
启动
yum安装    使用  systemctl     mariadb


centos  6 yum源
https://mirrors.tuna.tsinghua.edu.cn/mariadb//mariadb-10.3.14/yum/centos6-amd64/

CentOS 6
wget -O /etc/yum.repos.d/CentOS-Base.repo   http://mirrors.aliyun.com/repo/Centos-6.repo或者
curl -o /etc/yum.repos.d/CentOS-Base.repo   http://mirrors.aliyun.com/repo/Centos-6.repo
CentOS 7

wget -O /etc/yum.repos.d/CentOS-Base.repo   http://mirrors.aliyun.com/repo/Centos-7.repo或者
curl -o /etc/yum.repos.d/CentOS-Base.repo      http://mirrors.aliyun.com/repo/Centos-7.repo


yum安装后改变数据目录
cp   /usr/share/mysql/my-huge.cnf   /etc/my.cnf
vim  /etc/my.cnf   修改数据目录及sockt ,必须项 
chown  -R mysql.mysql  /data/mysql 
mysql_install_db   --datadir=/data/mysql   --user=mysql


配置文件须要的配置项
server-id = 1 
skip-networking=1                           #禁止网络链接的
character-set-server=utf8mb4            # 设置字符集

innodb_file_per_table=ON                 #数据库分开存放
log_queries_not_using_indexes=on    # 查询未使用索引记录 
skip_name_resolve=on                      #禁止主机名解析
 #二进制日志启用
log_bin=/path/mysqlbin/master 
#默认sql_log_bin 开启  若是log_bin未开启,没有日志产生
innodb_log_group_home_dir=         #事务日志目录到其余目录
innodb_log_file_size=                      #日志大小
log_bin_basename=/var/lib/mysql/mysql-bin     #日志的基本文件名及目录  
log_bin_index=/var/lib/mysql/mysql-bin.index   #管理全部binlog文件的目录


log_error=/var/log/mariadb/mariadb.error
sql_safe_updates    
置为1时,update:要有where,并查询条件必须使用为索引字段,或者使用limit,或者两个条件同时存在,才能正常执行。delete:where条件中带有索引字段可删除,where中查询条件不是索引,得必须有limit。主要是防止update和deLete没有使用索引致使变动及删除大量数据。参数默认值为0

set global sql_safe_updates = 1

############################################
推荐的配置选项:
硬件:内存32G
innodb_file_per_table = 1         #独立表空间
max_connections = 8000         #MySQL 服务所容许的同时会话数的上限,常常出现Too Many Connections的错误提示,则须要增大此值
back_log = 300                         #back_log 是操做系统在监听队列中所能保持的链接数
max_connect_errors = 1000    #每一个客户端链接最大的错误容许数量,当超过该次数,MYSQL服务器将禁止此主机的链接请求,直到MYSQL服务器重启或经过flush hosts命令清空此主机的相关信息
open_files_limit = 10240          #全部线程所打开表的数量
max_allowed_packet = 32M    #每一个链接传输数据大小.最大1G,须是1024的倍数,通常设为最大的BLOB的值
wait_timeout = 10                    #指定一个请求的最大链接时间
sort_buffer_size = 16M                   # 排序缓冲被用来处理相似ORDER BY以及GROUP BY队列所引发的排序
join_buffer_size = 16M                    #不带索引的全表扫描.使用的buffer的最小值
query_cache_size = 128M                #查询缓冲大小
query_cache_limit = 4M                    #指定单个查询可以使用的缓冲区大小,缺省为1M
transaction_isolation = REPEATABLE-READ            # 设定默认的事务隔离级别
thread_stack = 512K                                                # 线程使用的堆大小. 此值限制内存中能处理的存储过程的递归深度和SQL语句复杂性,此容量的内存在每次链接时被预留.
log-bin                                                                        # 二进制日志功能
binlog_format=row                                                       #二进制日志格式
innodb_buffer_pool_size = 24G                                    #InnoDB使用一个缓冲池来保存索引和原始数据, 可设置这个变量到物理内存大小的80%
innodb_file_io_threads = 4                                            #用来同步IO操做的IO线程的数量

innodb_thread_concurrency = 16                            #在InnoDb核心内的容许线程数量,建议的设置是CPU数量加上磁盘数量的两倍
innodb_log_buffer_size = 16M                                # 用来缓冲日志数据的缓冲区的大小
innodb_log_file_size = 512M                                #在日志组中每一个日志文件的大小
innodb_log_files_in_group = 3                            # 在日志组中的文件总数
innodb_lock_wait_timeout = 120                     # SQL语句在被回滚前,InnoDB事务等待InnoDB行锁的时间
long_query_time = 2                                        #慢查询时长
log-queries-not-using-indexes                            #将没有使用索引的查询也记录下来

数据库查询原理:mysql

客户端同数据库服务层创建TCP链接,链接管理模块会创建链接,并请求一个链接线程。若是链接池中有空闲的链接线程,则分配给这个链接,若是没有,在没有超过最大链接数的状况下,建立新的链接线程负责这个客户端。

在真正的操做以前,还须要调用用户模块进行受权检查,来验证用户是否有权限。经过后,方才提供服务,链接线程开始接收并处理来自客户端的SQL语句。

链接线程接收到SQL语句以后,将语句交给SQL语句解析模块进行语法分析和语义分析。

若是是一个查询语句,则能够先看查询缓存中是否有结果,若是有结果能够直接返回给客户端。

交互式客户端须要 ;
非交互 不用带 ;
二进制程序的解压缩的固定解压目录 /usr/local
客户端命令
服务器端命令
链接数据库
/usr/bin/mysqld_safe  & 非rpm 安装服务启动
链接数据库
mysql -uroot -p xxx
mysql -uroot -D test -p xx -D 指定数据库名称
mysql -u root -p -S /var/lib/mysql/mysql.sock
mysql -u -p -h ip -P 端口
数据库经常使用选项面试

若是查询缓存中没有结果,就须要真的查询数据库引擎层了,因而发给SQL优化器,进行查询的优化。若是是表变动,则分别交给insert、update、delete、create、alter处理模块进行处理。

接下来就是请求数据库引擎层,打开表,若是须要的话获取相应的锁。

接下来的处理过程就到了数据库引擎层,例如InnoDB。

在数据库引擎层,要先查询缓存页中有没有相应的数据,若是有则能够直接返回,若是没有就要从磁盘上去读取。

当在磁盘中找到相应的数据以后,则会加载到缓存中来,从而使得后面的查询更加高效,因为内存有限,多采用变通的LRU表来管理缓存页,保证缓存的都是常常访问的数据。

获取数据后返回给客户端,关闭链接,释放链接线程,过程结束

变量:
系统 : mysql 运行过程的环境属性
全局:global variables 做用域为整个服务器
会话级别: session 做用域为当前会话
状态变量: 运行过程状态信息sql

show global variables \G ;
--- like "%version%" 版本相关
---- where varliable_name like "character%"
like "%log%" and value = "of"
show session valiables \G;
select @@[global.|session.]system_var_name
select @@global.pid_file
select @@session.warning_count;
数据库

用户管理
user@host
host ip 或主机名
_ 任意单个字符
%任意长度任意字符
use mysql
create “user”@‘host’
insert into mysql.user(user,host,password) values('xxxx','192.168.%.%',password('11111'));
受权数据库时,对应用户不存在,以下语句MySQl自动建立用户
grant all on  database.* to  xxx@127.0.0.1 identified by 'dddddd';
删除用户
delete from mysql.user where user="tee" and host="localhost"
若是某些权限已经授予该用户,删除用户其权限依旧保留,当子啊次建立用户时,会报错
解决:删除残留权限,使用flush privileges ,或使用drop user 同时删除用户及权限vim

重命名
rename user oldname to newname
重命名后密码及权限不会发生改变centos

修改密码
mysqladmin -uroot -p123 password 33333
set password for "user"@'ip host' =passwpord('password')
update mysql.user set password=password(""), where lclause ;
update mysql.user set password =password(' sss') where user='' and host="";缓存

drop user 'xx'@'loaclhost '
密码忘记
mysql_safe --skip-grant-tables &
更改密码后flush privileges ;
重启安全

受权服务器

GRANT ALL [PRIVILEGES] ON db.tbl TO 'username'@'host' IDENTIFIED BY 'password';
grant all on zsythink. to zsy@127.0.0.1 identified  by  'zsythink'; 省略 privileges
grant all privileges on zsythink.
 to zsy@'192.168.%.%' identified  by  'zsythink'; 缩小权限
flush privileges ;网络

字段受权
grant select (name,age) on  xxx.students to cccc@localhost;
grant execute on function zsythink.test to zsy@'192.168.%.%';执行函数权限受权
procedure 过程
用户可否将已有权限受权给其余人取决于用户是否有grant 权限
grant select on zsythink.* to zsy@'192.168.%.%'  with grant option;

查看受权
show grants for user;
show grants for zzz@'iphost';
select * from mysql.db where Db="你要查看的数据库"\G;

移除权限
revoke "要移除的权限" on 数据库.表 from 用户@host;

if not exists :不存在时才建立
show caharacter set ;
show collation ;
create database if not exists testdb default character set utf16;

show create databses testdb ;

修改

删除

drop [database | schema] [if exists ] db_name

表管理
show table satus \G;
like ' ttttt'

表结构
desc table_name
show create table table_name

源码编译乱

rm -rf .[^.]* 删除隐藏文件,由于建立家目录时复制了/etc/skel模板 隐藏文件,不要使用userad -m
启动, 二进制安装 ,包带有架构名称x86_64(源码不带) ,使用service

设置安全脚本 mysql_secure_installation

mysqladmin password centos

mysqladmin -u root -p psw passwdord centos
mysqladmin -u root -pcentos ping 检测数据库是否存活
mysqladmin -u root -p pswor shutdown

源码编译

装必须包
建立用户,useradd –r –s /sbin/nologin –d /data/mysql/ mysq
使用-m 会在家目录复制模板文件到-d 指定的目录
数据目录,
目录更改属组主,解压cmke
1,修改PATH变量

生成数据库 /scripts /mysql_install_db 在上一层目录执行
复制my.cnf
添加 datadir=

源码编译

maraidb  源码编译  
报错openssl 
yum  -u install openssl-devel
编译选项 

cmake . -DCMAKE_INSTALL_PREFIX=/app/mysql -DMYSQL_DATADIR=/data/mysql/ -DSYSCONFDIR=/etc/mysql -DMYSQL_USER=mysql -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITHOUT_MROONGA_STORAGE_ENGINE=1 -DWITH_DEBUG=0 -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_ZLIB=system -DWITH_LIBWRAP=0 -DENABLED_LOCAL_INFILE=1 -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci

make

make install
  308  cd  /app/mysql/
  309  ll
  310  scripts/mysql_install_db   --datadir=/data/mysql  --user=mysql
  311  PATH=/app/mysql/bin:$PATH
  312  cp  support-files/mysql.server   /etc/init.d/mysqld 
  313  ls  -al  /etc/init.d/mysqld 
  314  rm  /etc/init.d/mysqld
  315  cp  support-files/mysql.server   /etc/init.d/mysqld 
  316  ls  /etc/init.d/mysqld
  317  ls   -al  /etc/init.d/mysqld
  318  cp  support-files/my-huge.cnf   /etc/my.cnf
  319  vim /etc/my.cnf
    添加数据目录datadir=/data/mysql

  320  echo $PATH 
  321  ll
  322  chkconfig  --add   mysqld
  323  service  mysqld  start
  324  mysql 
  325  history

cp /app/mysql/support-files/my-huge.cnf /etc/mysql/my.cnf ppt 错误

多实例数据库;一个物理机上装一个软件多个实例或多版本并存(测试环境使用)
yum安装下多实例
多实例多端口)
此架构可多版本多实例
rm -rf /var/lib/mysql/* (yum安装默认用户数据库,清除口令文件目录)
mkdir /mysql/{3306,3307,3308}/{data,etc,socket,bin,log,pid} -pv 生成独立目录
chown -R mysql.mysql /mysql
生成数据库
mysql_install_db --user=mysql --datadir=/mysql/3306/data

复制配置文件 my.cnf 修改
datadir=
socket=。。。。 /socket/mysql.socksq
port=
日志文件

启动服务脚本(本身编写的)放入bin下加执行权限

链接使用端口号
mysql -uroot -p -P 3306 -S /mysql/3306/socket/mysql.sock

建立数据库后查看
system ls /mysql/3306/data
! ls -l /mysql/3307/data
关闭服务 脚本 stop 脚本使用mysqladmin 要求密码关闭

当以 localhost 链接时(不指定-h时默认为localhost),MySQL 是经过 Unix Socket(而不是 TCP) 链接。此时指定的端口被忽略
修改配置文件
vim /etc/my.cnf
[client]
protocol = TCP
或指定sock 链接
mysqladmin -S /mysql/3306/socket/mysql.sock -uroot password centos (启动服务下修改)
启动脚本/mysql/bin/mysqld 修改口令,关闭服务/启动不须要密码

mysqd_multi 多实例(同一版本下
二进制安装多实例

删除匿名用户 mysql_secure_install

搜索 表名区分为大小写,字段不区分

修改字符集 排序规则 set charavter utf8mb4
建表 字符差异大 使用vchar

数据老版本默认存放 idbdata
高版本 表名.ibd 数据
表名.frm 表结构 ?????

删除表 drop table
show table status like "table" \G ; 表结构竖着显示
show table status from databasename \G ;

复合主键 prinmary key (id , name )

参考现有表结构建立表
克隆表结构 create table lll like base.table

show warning ;
show create table table;看字符集
alter table tab character set (表改了可是字符段字符集未改变)
建立数据库时指定字符集

在实例级别指定字符集
/etc/3308/etc/mysql.cnf
character-set-server=utf8mb4
客户端
mysql -uroot -p -S --defaule-character-set =utg8mb4 -U
加 U 安全更改模式,更新时没有where不成功
修改/etc/mysql.d/mysql.clinet.cnf 加入 --safe-updates

导入
insert db1,tab select * from db2.table

truncate table 清除表内容,表结构还在 同时删除了日志

查询不用正则

count 查询非空的,使用 *

select 后接 分组 或聚合函数
先分组再过滤
select gender 性别 ,count(*) 数量 from students group by gender having gender = "M" ;

where 后在group

左右链接

视图隐藏信息

会话变量 当前有效
函数体局部变量 declare

远程客户端登录慢是由于对ip作名称解析,应关闭
配置文件添加
skip_name_reslove=1
show variables like "skip_name_resolve" \G;
并发链接数
show variables like "max_con%" \G;
ariable_name: max_connections
Value: 151
set globel max_connections =1111;

show status like "com_sele%" \G;
*************************** 1. row ***************************
Variable_name: Com_select
Value: 3

口令
set password for ''@'' =password('');
update user set password=passowrd('') where user= "";
改表用户口令不能当即生效, flush privileges;

忘记密码
my.conf
[mysqld]
skip-grant-tables
skip-networking
重启登录(此时其余用户无限制可登录)

设置权限后退出从新登录

存储引擎区别面试
myisam centos6 默认
修改默认值 配置文件
show variables like "%engin%" \G;
Variable_name: default_storage_engine
Value: InnoDB

innodb, 5.6 5.7 版本默认引擎

建立表时指定存储引擎

show table status from mysql \G;

mvcc :多个用户并发访问同时不干扰
以事件id为基础

备份mysql数据库

mysqld -- 选项
变量使用show variables

变量修改永久保存

提高查询效率 缓存起来
select 执行命令hash运算储存起来,占内存
多个空格缓存失效,

验证工做:

索引 查看索引是否生效,查询时间
btree

dml可撤销
ddl直接提交,没法撤销
修改非自动提交
set autocommit=off

事务隔离级别
选项与变量
可重复读,缓存(实验下)
幻读

show processlist; (某人启用写锁,致使其余人没法查看)
kill 3 (用户id)

日志存放在其余位置(io较好)
调整日志大小
配置文件中变量和选项 区别

慢查询 !开启
阈值
不利用索引就记录log_queries_not_using_indexes=ON

bin -log 记录格式 基于 语句/行
建议行 至少mixed

二进制不会被自动删除,只记录提交的事务。
分库 innodb_file_per_table 10版本以上默认开启
sql_log_bin=ON 会话级别 服务器不停服启用,须要中止二进制日志记录时能够关闭该变量
log_bin=/path/to/logbin 服务器选项在配置文件内修改 ,
max_binlog_size=250M
sync_binlog=0 =1
#控制数据库的binlog刷到磁盘上去,
#默认,sync_binlog=0,表示MySQL不控制binlog的刷新,由文件系统本身控制它的缓存的刷新。这时候的性能是最好的,可是风险也是最大的。由于一旦系统Crash,在binlog_cache中的全部binlog信息都会被丢失。
若是sync_binlog>0,表示每sync_binlog次事务提交,MySQL调用文件系统的刷新操做将缓存刷下去。最安全的就是sync_binlog=1了,表示每次事务提交,MySQL都会把binlog刷下去,是最安全可是性能损耗最大的设置。这样的话,在数据库所在的主机操做系统损坏或者忽然掉电的状况下,系统才有可能丢失1个事务的数据。可是binlog虽然是顺序IO,可是设置sync_binlog=1,多个事务同时提交,一样很大的影响MySQL和IO性能。虽然能够经过group commit的补丁缓解,可是刷新的频率太高对IO的影响也很是大。对于高并发事务的系统来讲,“sync_binlog”设置为0和设置为1的系统写入性能差距可能高达5倍甚至更多。
因此不少MySQL DBA设置的sync_binlog并非最安全的1,而是100或者是0。这样牺牲必定的一致性,能够得到更高的并发和性能

expire_logs_days=N 自动删除日志的天数

备份以后先测试还原:还原备份步骤及策略:
测试:打包压缩时是否能够操作
备份单库的表,而后导入测试
mysqldump -B 备份数据库结构(数据库结构及表结构)
还原日志
清除日志 reset master
set sql_log_bin=off
--master-data[=#] 区别实验:没有主从复制设置为2,有设置为

分别备份每一个库到每一个文件

不要加flush tables with read lock ,从库无发复制
主从结构,start slave 后,从机关闭后,再开启时子线程自动开启(io线程及sql线程)
reset slave 许要先中止线程,stop slave

从库启动异常,reset slave all 从新开始复:查看主库二进制目前位置,从新配置链接信息
因为主键冲突致使报错,能够跳过错误 (数据可继续复制,主键不一样)
set global sql_slave_skip_counter=

提高从服务器为主节点
肯定从服务器更新的最新:
Master_Log_File: master-bin.000007
Read_Master_Log_Pos: 764
Exec_Master_Log_Pos: 764
操作(选择的从服务器):
开启二进制日志 (基于行):log_bin =
节点建立用户,
另外一从节点:新主节点建立彻底备份,从节点清除数据,从新恢复数据,配置链接信息

级联复制(中间服务器)
log_bin =
log_slave_updates (将写入中继日志的语句同时写入到bin日志中

主主复制
半同步复制:

超时时长:同步未成功

数据操做

DDL: Data Defination Language 数据定义语言CREATE,DROP,ALTER
DML: Data Manipulation Language 数据操纵语言INSERT,DELETE,UPDATE
DCL:Data Control Language 数据控制语言GRANT,REVOKE,COMMIT,ROLLBACK
DQL:Data Query Language 数据查询语言SELECT

建立数据库:
CREATE DATABASE|SCHEMA [IF NOT EXISTS] 'DB_NAME';
CHARACTER SET 'character set name’ COLLATE 'collate name'
show create database test ;查看字符集
ALTER DATABASE DB_NAME character set utf8;
DROP DATABASE|SCHEMA [IF EXISTS] 'DB_NAME';
show character set ;
show collation ; 排序规则

CREATE DATABASE zabbix CHARACTER SET utf8;
show create database test ;

建立表:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name[(create_definition,...)] [table_options][partition_options] select_statement
查询现存表建立;新表插入查询数据,可是目录结构有关选项不会继承。
create table t12 select * from toc ;
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name { LIKE old_tbl_name | (LIKE old_tbl_name) }
复制现有表的表结构:
create table t13 like coc ;
查看建立的表的数据引擎及字符集
show create table t13;

CREATE TABLE [IF NOT EXISTS] ‘tbl_name’
(col1 type1 修饰符, col2type2 修饰符, ...)

show create table coc ;
CREATE TABLE coc (
ID int(10) unsigned NOT NULL AUTO_INCREMENT,
ClassID tinyint(3) unsigned NOT NULL,
CourseID smallint(5) unsigned DEFAULT NULL,
PRIMARY KEY (ID)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8

字段信息:
• col type1
• PRIMARY KEY(col1,...)
• INDEX(col1, ...)
• UNIQUE KEY(col1, ...)

列名 数据类型 修饰符
修饰符 全部类型适用:
• NULL 数据列可包含NULL值
• NOT NULL 数据列不容许包含NULL值
• DEFAULT 默认值
• PRIMARY KEY 主键
• UNIQUE KEY 惟一键
• CHARACTER SET name 指定一个字符集

适用于数值型
• AUTO_INCREMENT 自动递增,适用于整数类型
• UNSIGNED 无符号

示例:
CREATE TABLE students (id int UNSIGNED NOT NULL PRIMARY
KEY,name VARCHAR(20)NOT NULL,age tinyint UNSIGNED);
CREATE TABLE students2 (id int UNSIGNED NOT NULL ,name
VARCHAR(20) NOT NULL,age tinyint UNSIGNED,PRIMARY KEY(id,name));

表操做:
SHOW ENGINES
SHOW TABLES [FROM db_name]
DESC [db_name.]tb_name
SHOW COLUMNS FROM [db_name.]tb_name
DROP TABLE [IF EXISTS] tb_name
show table status like 'coc' \G; (表状态查询)
SHOW TABLE STATUS FROM db_name (数据库中全部表的状态)

修改表:
ALTER TABLE 'tbl_name'
字段:
添加字段:add
ADD col1 data_type [FIRST|AFTER col_name]
删除字段:drop
修改字段:
alter(默认值), change(字段名), modify(字段属性)
索引:
添加索引:add index
删除索引:drop index

查看表上索引: SHOW INDEXES FROM 666[db_name.]tbl_name;

示例: 
    ALTER TABLE students RENAME s1;
    ALTER TABLE s1 ADD phone varchar(11) AFTER name;
    ALTER TABLE s1 MODIFY phone int;
    ALTER TABLE s1 CHANGE COLUMN phone mobile char(11);
    ALTER TABLE s1 DROP COLUMN mobile;
    ALTER TABLE s1 character set utf8;
    ALTER TABLE s1 change name name varchar(20) character set utf8;
    ALTER TABLE students ADD gender ENUM('m','f')
    ALETR TABLE students CHANGE id sid int UNSIGNED NOT NULL
    PRIMARY KEY;
    ALTER TABLE students drop primary key ;
    ALTER TABLE students ADD UNIQUE KEY(name);
    ALTER TABLE students ADD INDEX(age);
    ALTER TABLE students drop primary key ;
    DESC students;
    SHOW INDEXES FROM students;
    ALTER TABLE students DROP age;

DML: insert delete update
insert
INSERT tbl_name [(col1,...)] VALUES (val1,...), (val21,...)
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
update : 要添加限制条件
UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]

delete: 限制条件,否则删除全部 :limit  where
  DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
     [WHERE where_condition]
     [ORDER BY ...]
     [LIMIT row_count]

DQL
select 语句

Select    以后是逗号分隔列或星号(*)的列表,表示要返回全部列。
From     指定要查询数据的表或视图。
Join     根据某些链接条件从其余表中获取数据。
Where    筛选条件,过滤结果集中的行。
Group By  将一组行组合成小分组,并对每一个小分组应用聚合函数。
Having   过滤器基于Group By子句定义的小分组。
Order By  指定用于排序的列的列表。
Limit    限制返回行的数量。
字段使用别名 cols AS alias col2 as alias
where 过滤选项与条件

过滤条件:布尔型表达式
算术操做符:+, -, *, /, %
比较操做符:=,<=>(相等或都为空), <>, !=(非标准SQL), >, >=, <, <=
BETWEEN min_num AND max_num
IN (element1, element2, ...)
IS NULL
IS NOT NULL
like
% 任意长度任意字符
_ 任意单个字符
逻辑操做符
NOT
AND
OR
XOR

GROUP:根据指定的条件把查询结果进行“分组”以用于作“聚合”运算
  avg(), max(), min(), count(), sum()
HAVING: 对分组聚合运算后的结果指定过滤条件
ORDER BY: 根据指定的字段对查询结果进行排序升序:ASC降序:DESC
LIMIT [[offset,]row_count]:对查询的结果进行输出行数数量限制

对查询结果中的数据请求施加“锁”
FOR UPDATE: 写锁,独占或排它锁,只有一个读和写
LOCK IN SHARE MODE: 读锁,共享锁,同时多个读

多表查询; union 子查询

例子:

select * from students order by name asc /desc ;(以某一列降序或升序)

select * from classes join students using (classid) ;
select * from classes join students using (classid) where teacherid is not null ;
select * from employees where birth_date > '1957-05-23' order by birth_date limit 30 ;
select * from employees where month(birth_date)=7 limit 30 ;( 函数to_days )
select * from employees order by rand() limit 30 ; 随机取记录
select distinct title from titles limit 10 ; 清除重复记录
count () :
count(*)计算全部,NULL也要
count(数据列名称),NULL值不计算在内

视图: 虚表 ,保存现有实表的查询
CREATE VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]
SHOW CREATE VIEW view_name
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]
视图中的数据事实上存储于“基表”中,所以,其修改操做也会针对基表实现;
其修改操做受基表限制

自定义函数:
存储过程:
触发器:

用户权限管理: 元数据表 MySQL
建立用户,默认有usage 权限
CREATE USER 'USERNAME'@'HOST' [IDENTIFIED BY 'password'];
RENAME USER old_user_name TO new_user_name;
DROP USER 'USERNAME'@'HOST‘
DROP USER ''@'localhost'; 删除空帐号

修改密码的方法:
mysql>SET PASSWORD FOR 'user'@'host' = PASSWORD(‘password');
mysql>UPDATE mysql.user SET password=PASSWORD('password')
WHERE clause; 需flush privileges 生效

忘记管理员密码:
启动mysqld 时
配置文件里添加以下,重启服务
skip-grant-tables
skip-networking

管理类权限:
CREATE TEMPORARY TABLES
CREATE USER
FILE
SUPER
SHOW DATABASES
RELOAD
SHUTDOWN
REPLICATION SLAVE
REPLICATION CLIENT
LOCK TABLES
PROCESS
程序类权限: FUNCTION、PROCEDURE、TRIGGER
CREATE
ALTER
DROP
EXCUTE
库和表级别:DATABASE、TABLE
ALTER
CREATE
CREATE VIEW
DROP
INDEX
SHOW VIEW
GRANT OPTION:能将本身得到的权限转赠给其余用户

数据操作
SELECT
INSERT
DELETE
UPDATE

字段级别
SELECT(col1,col2,...)
UPDATE(col1,col2,...)
INSERT(col1,col2,...)
全部权限
ALL PRIVILEGES 或 ALL
受权:
GRANT priv_type [(column_list)],... ON [object_type] priv_level TO 'user'@'host'
[IDENTIFIED BY 'password'] [WITH GRANT OPTION];
with_option: GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count

回收: REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level FROM user [, user] ... flush privileges 刷新权限

相关文章
相关标签/搜索