create database blog;php
create table blog_user
(
user_Name char(15) not null check(user_Name !=''),
user_Password char(15) not null,
user_emial varchar(20) not null unique,
primary key(user_Name) // 主键的规定 , 只有 auto_increment才是下划线连字 其余都是分开 的单词...html
)engine=innodb default charset=utf8 auto_increment=1;mysql
关于语法:算法
supplicant: 恳求, 祈求, supplicator: 请求者, 祈求者. 也能够作 "客户端" 的意思
因此 手机上的 wifi 万能钥匙的解码密码的查看 目录是 : /data/wifi/wpa_supplicant.conf 中.
须要安装两个软件, 一个是 : root权限软件; 另外一个是 RE: rootexplorer.sql
sql中的use, 表示的是 "选择" 至关于 select, 在表中, 选择, 适用 select, 而数据库的选择 使用 use.
即: use mysql; 表示的是 "选择" mysql数据库shell
要查看数据库和 数据表, 要使用show, 不能直接使用databases和 tables;数据库
在shell 控制台 界面, (不进入数据库的状况下), 管理数据库的命令是: mysqldump db.table
> dump.sql 和 导入数据库的命令: source dump.sql;
即: mysqldump 和 对应的 source 命令;
mysqldump 并不会导出"建立数据库 " 的语句, 因此 , 在 导入source脚本的时候, 要本身手动 先建立好数据库..编程
建立表/数据库时, 能够指定条件: if (not) exists db/table..
注意的是, 条件判断 和 前面的create语句 共用后面的 "表名称" ...
create table ---- if not exists --- table_name(....)数组
另外一个命令是: mysqladmin...服务器
建立表的方法, 除了常规的方法外, 还有两个:
适用 复制命令: create table foo select * from bar ; 这时候, bar表和 foo表的数据结构彻底一致, 并且 foo表中的数据 也被 复制给了 bar表;
可是 若是只是为了 想 复制表的 结构, 不复制数据, 要适用 条件: create table bar2 select * from foo where 1<>1 ;
凡是 在sql语句中, 在须要 一个表结构 / 或表的数据记录 的地方(场合), 均可以适用 子查询 来 代替: select * from bar [where...]
在输出语句中, select ??? 若是输出内容, 不带 引号, 这时,{ 数据库的引擎(就是myisam, innodb等)--管理存储, 查询, 输出, 事务等都是由它来负责的, (至关于php的zend引擎同样).会当作 字段 来看待 (字段就至关于 php中的 变量同样) , 很明显没有这样 的字段时, 就会报错, 而加上引号后, 就会 当作是一个普通的 字符串来 输出, 就是正确的
那就是: 凡是用来 输出 具体的 一个 值的 : 好比字符串, 数字, 好比函数的返回值,等的 就要用 select
凡是 用来 显示 信息的 , 用来显示 "描述/说明" 信息的, 用show.
在mysql中 可使用 help show; 来查看 show语句的用法.
因此 version(); database() -- 用来查看 当前数据库是哪一个数据库的 , 用 select 来表示 ....
mysql 控制台中, 命令能够 用后面相应的 ??? 来代替, 是同样的,好比: system == !
执行 外部的 shell command 用system, 好比: system pwd; system cd /etc等.
而执行sql脚本, 用 source命令, 注意这个source命令, 并非专门针对sql的什么 导入命令, 不是(sqlimport) , 而是能够执行任意的 sql脚本的.
甚至! 当你 关闭了 mariadb的链接, 关闭了 mariadb的服务, 而后你重启 mariadb的服务, 这些 历史命令的 记录 都还在 , 因此之后 能够 反复地适用 这些历史命令了.
可是 , 也不是说, 一点关系都没有, 那就是 , 当你在用 source 命令 执行 脚本的时候, 默认是在 你 当前 目录下(你 从哪里进入mysql的) 寻找 sql文件, 不然, 你 执行 sql脚本的时候 就要 指明 sql脚本文件的 整个完整的 路径...
=====================
source 命令和 . 命令执行脚本时, 若是 用 . 命令, 脚本最后面的 分号; 要跟 脚本文件名 之间 至少要 分割一个空格.....不然会把分号当作脚本文件名的一部分...
mysql的 单精度/双精度 数字是 用 decimal (5,2) 来表示的...
整数的类型 从小到大, 有5种: tinyint, smallint mediumint int bigint, unsigned 能够节约一位(用来表示和存储 正负号的), 扩大数据范围;
包括函数 也有 存储函数和 用户自定义函数, 存储函数, 叫 stored function, 是指 mysql系统自带的 , 系统内部预先给你定义好了的 函数, 叫作 存储函数.
udf: user-defined function. 即用户自定义 函数.
因此, 对于 过程而言, 也叫作 存储过程
delimiter $$ -- 这是一条语句 create procedure sp_echo_hello() begin select "hello world "; end$$ --- 这是一条语句 delimiter ; --- 这是一条语句
找到缘由了执行DROP TABLE后,全部的表数据和表定义会被取消,因此必须断开mysql链接,mysql_close();这样表数据才会刷新,而后从新链接就没问题了
**在sql中, 要给变量赋值, 有两种方式: 一种是用set是单独的. set a=b+1; 另外一种是在 查询 语句中, 用select, select的方式有两种, 主要 是用在查询语句中, select sum:=count(name) from user; 另外一种是用 select into... select count(*) into sum from user; **
并且在调用 函数 / 过程的时候, 一般适用的是 用户变量 : @param1,, @p2, @p3...
/* 自定义存储过程 */ create procedure sp_add(a int, b int, out sum int) set sum=a+b; -- 建立存储过程 的 特征子句 language sql not determi'nistic adj. 肯定性的, 必然的. 指存储过程的 输入和输出 的 结果是能预知的, 不会改变的.. comment 'this is a procedure for add' sql security definer : definer只是在建立时检查建立用胡的权限, invoker还会检查调用者的权限 create procedure sp_add( a int, b int) begin set @sum=0; set @sum = a +b; -- 赋值必须用set end; 执行存储过程 : call sp_add(10, 2); 而后 , select @sum;
drop function if exists add; create function test.add(a int unsigned , b int unsigned ) returns int begin if a is null then set a=0; end if; if b is null then //对于 定义了 b的 int 类型值, 是能够传递 null 实参的. set b=0; end if; return a+b; end; -- 调用 函数 set @a=10; set @b=20; select test.add(@a, @b) as Add; select test.add(10, 20) as Add2;
mysql 是 编译型语言, 若是是php传递字符串查询, 则每次都会编译一次, 而存储过程, 只会在 建立的第一次, 进行编译, 之后都直接执行编译后的 代码.. 使用 存储过程 可能 会提升访问查询速度.
只有在 要处理的 事务 比较复杂, 要使用 大量的 sql 语句的时候, 才使用 procedure, 而平时不是太复杂的查询, 就直接使用 字符串查询就行了!
**在用 php进行 存储过程的 执行时, 要 假设 当前的操做, 仍然在 mysql上, 包括 设置 "用户变量" 等, 都要用 mysql_query("set @sum=0"); 等等.
1 <?php 2 3 header('Content-type: text/html; charset=utf8'); 4 5 $conn = mysql_connect('localhost', 'root', '') or die('failed to connect!'.mysql_error()); 6 mysql_select_db('test', $conn); // 注意,这里的参数, 必定是'db'数据库名称 在前面, $c 7 8 try{ // 注意这里是用 大括号, 不是 小括号... 9 mysql_query('call test.sp_add(10, 20)'); 10 11 $res = mysql_query('select @sum'); 12 13 // $res 是一个resource, 返回的是id. 14 15 $ret = mysql_fetch_row($res); 16 17 echo "调用 sp_add(10, 20)的结果是: ". $ret[0]; // 全部的 正确处理代码都放在try{...} 里面 18 19 } catch(Exception $e){ /// 这里 是容许 这种用法的, 在$e前面有一个 类型 Exception 20 21 echo $e; 22 } 23
增删改查, 都是两个关键字,
select from
insert into
upate ... set (set是 mysql中很常见的一个关键字)
delete from ... where. 注意, delete删除的是一个记录一个记录的删除, 不可能只删除某一个字段的,
因此,delete后面, 就不能带、指定字段了。
注意, mysql的条件字句where, 天生就支持 like, not like in not in between 等模糊匹配符号,
而不是只有等号=
2.对mysql 的操做, 既能够直接在 shell 界面 操做, 也能够 先进入mysql控制台, 而后再进行操做。
mysql> set password for 'bar'=password('bar'); ERROR 1133 (42000): Can't find any matching row in the user table mysql> set password for 'bar'@'somehost' = password('bar'); -- 这里在指定用户的时候, 必定要显式地使用 ’user'@ 'host'的方式, 不然会说找不到。。。 Query OK, 0 rows affected (0.00 sec) mysql>
insert into mysql.user(host, user, password) values('%', user_name, password());
privileges; 来刷新权限才能生效。 privileges: vi为i, leges中间没有d, 且为复数。
要删除表中的数据, 有两种方法, 一是 常规的 delete from t; 二是使用truncate, 第二种truncate比
dlete的速度要快, 占用的内存和日志要少, 产生的rollback快、少??
字符集, latin1 就是iso8859-1. iso8859有多个字符集的子集, 其中latin1就是第一个子集
能够同时建立多个用户, 每一个用户用 user_specification来指定, 用户之间用逗号来分隔
mysql> create user 'foo'@'localhost' identified by 'foo', 'bar'@'somehost';Query OK, 0 rows affected (0.00 sec)
建立用户时指定密码, 经过identified by '明文字符串‘,若是要用password关键字, 则必须是 密码字符串的hash value。
字段的标准声明方式就是: fieldname int(10) unsigned not null default null.
mysql中操做数据和结构的语言主要有四种, 分别叫作, d?L: data ? language
?: 能够是查询:query, 即select: 叫作:dql
能够是m: manipulation, 即对数据自己的操做, 对表中的记录进行操做... dml
能够是:表和数据库的结构, 即定义语言,define。 叫: ddl, 如: create, drop,add, change.等
能够是: 对表和数据的控制,control, 叫dcl,包括grant受权, 事务transaction 和回滚等。
dml和ddl的区别是: 一样的增删改查: dml由于是对数据/记录的操做, 因此是: insert into, update set, delete where, 而ddl因为是对表结构自己的操做,因此是: add, drop, change 等
在mysql控制台, 提供了很是强大/详细的 help, 经过help key1, 或者help key1 key2能够查看到不少详细的信息...
set password: [for user] = password/old_password('明文字符串');
for user 能够不指定, 那就是默认的对当前登陆用户进行设置密码.
若是不用 password/old..函数, 等号后面的密码字符串就必须是通过password加密后的 hash字符串值.
任何 非匿名用户均可觉得本身修改密码. any nonanonymous account can change the password for that account.
你能够在命令行 显式的用 '' 匿名帐户登陆mysql, 可是你没有权限去修改这个匿名用户的密码的: you are using mysql as an anonymous user, and anonymous accounts are not allowed to change passwords.
匿名用户不容许修改密码! nonanonymous account...
use mysql; update user set password=password('new_password') where user="root"; flush privileges;
password [new-password] Change old password to new-password in current format 适用 新的 长哈希hash 密码值, 从4.1版本后适用 password(..)函数. 获得的是41位的... old-password [new-password] Change old password to new-password in old format 适用 旧的老的 加密格式: old_password('123'), 加密出来的是 16位: 兼容 4.1 以前的版本.
如今的 加密算法不少, 好比: md5, des(数据加密标准data, encryption standard, ibm公司提出的), aes, sha等等. des在pos机, 加油卡, 购物卡等非机密机构的应用中使用.
mysql中提供的加密算法包括: md5, password, old_password. aes_encrypt等.
它自己提供/ 支持 aes加密( aes"啊饿死'), 两个函数 aes_encrypt, 和 aes_decrypt, 须要辅助的 输入 key来加密和解密:
MariaDB [(none)]> select aes_decrypt(aes_encrypt('123', 'abc'), 'abc') as '加密解密'; // 单独的加密出来的 是 乱码!! +--------------+ | 加密解密 | +--------------+ | 123 | +--------------+ 1 row in set (0.00 sec) MariaDB [(none)]>
可是 mysql提供的 password加密方法, 加密函数, 又是 另一种加密方法, 它加密出来的字符串老是 以星号开头的, 并且是41位的.
而mysql中 也有 /也提供/支持md5 加密的, 它加密出来的长度 是 32位.
在mysql中, 计算字符串长度用 length(...) 函数. 要显示 mysql加密函数 加密后的 结果, 直接用 select输出
mysql也支持 old_password加密算法, 加密出来的是 16位长度.
MariaDB [(none)]> select old_password('123') as 'old加密' , length(old_password('123')) as 'old加密长度'; +------------------+-----------------+ | old加密 | old加密长度 | +------------------+-----------------+ | 773359240eb9a1d9 | 16 | +------------------+-----------------+ 1 row in set (0.00 sec) MariaDB [(none)]>
mysqladmin -uroot password '123'
没必要使用 password函数加密, 会自动加密;mysqladmin -uroot -p password ['123']
新的 密码能够直接输入[foo@localhost ~]$ mysqladmin -uroot -p 'root' password Enter password: mysqladmin: Unknown command: 'root' // 旧密码不能直接输入! [foo@localhost ~]$ mysqladmin -uroot password mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'root'@'localhost' (using password: NO)' // 提示没有使用密码, 即要加 -p [foo@localhost ~]$ mysqladmin -uroot -p password 'root2' Enter password: [foo@localhost ~]$ mysqladmin -uroot -p password Enter password: New password: ### 凡是: 提示: Enter password的, 表示 要输入: 旧的, 原来的密码; ### 只有在 : New password的时候, 才是 要你 输入 新的密码 Confirm new password: [foo@localhost ~]$