create database blog;
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才是下划线连字 其他都是分开 的单词...
)engine=innodb default charset=utf8 auto_increment=1;
关于语法:
- 表的字段之间, 用逗号来分割, 同一字段内部 用 空格 分割 而不是 用 逗号分割.
- 表的外部,末尾, 用等号来定义 属性, 如: engine=innodb 字符集: default charset=utf8 ...
supplicant: 恳求, 祈求, supplicator: 请求者, 祈求者. 也可以做 "客户端" 的意思
所以 手机上的 wifi 万能钥匙的解码密码的查看 目录是 : /data/wifi/wpa_supplicant.conf 中.
需要安装两个软件, 一个是 : root权限软件; 另一个是 RE: rootexplorer.
sql中的use, 表示的是 "选择" 相当于 select, 在表中, 选择, 适用 select, 而数据库的选择 使用 use.
即: use mysql; 表示的是 "选择" mysql数据库
要查看数据库和 数据表, 要使用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...
创建表的方法, 除了常规的方法外, 还有两个:
使用 like. create table foo like bar; 这时 foo表的结构就跟bar 的结构 完全一致了..
适用 复制命令: create table foo select * from bar ; 这时候, bar表和 foo表的数据结构完全一致, 而且 foo表中的数据 也被 复制给了 bar表;
但是 如果只是为了 想 复制表的 结构, 不复制数据, 要适用 条件: create table bar2 select * from foo where 1<>1 ;凡是 在sql语句中, 在需要 一个表结构 / 或表的数据记录 的地方(场合), 都可以适用 子查询 来 代替: select * from bar [where...]
对mysql的理解, 一是可以看做是一种 编程语言, (而且这种语言, 就类似于 php, c, basic等等, 语言本身提供了一些系统的内建的常用函数--方便初级用户使用, 任何一种语言, 如果不自带一些常用的函数库, 什么功能都要用户自己去写自己去实现, 恐怕很难活下去!! 而且, 用户还可以创建自己的过程和函数. 这些过程和函数, 跟任何一种编程语言如basic中的过程和 函数完全一样.. ) 这种语言的输出 /打印语句, 不是print, 也不是 echo, 而是 select. 这个select 后面 可以 输出任意的东西, 比如 字符串, slect "hllo world"; 比如数字, 等, 还可以输出mysql的内置函数. 比如 : select now(); 还可以输出 用户自己创建 的 过程 和 函数; 因此 在 mysql语句中, 不要把 select看桌是 选择, 而是要看做是 " 输出print, echo", 第二, 对 mysql的理解, 要把它看做是一个 存储系统, 可以存储数据库/表, 当然也可以存储用户自定义的表/ 临时表/ 索引/ 和 自定义 过程和函数.
在输出语句中, select ??? 如果输出内容, 不带 引号, 这时,{ 数据库的引擎(就是myisam, innodb等)--管理存储, 查询, 输出, 事务等都是由它来负责的, (相当于php的zend引擎一样).会当做 字段 来看待 (字段就相当于 php中的 变量一样) , 很明显没有这样 的字段时, 就会报错, 而加上引号后, 就会 当做是一个普通的 字符串来 输出, 就是正确的
mysql中 什么时候, 用 select, 什么时候用 show?
那就是: 凡是用来 输出 具体的 一个 值的 : 比如字符串, 数字, 比如函数的返回值,等的 就要用 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脚本的.
mysql 可能有一个 专门的 文件,(而且不是 用 内存 缓冲区), 来记录 在当次 机器登录期间的 所输入的命令, 你可以在 整个 所有 的 连接id之间 共有/共用 这些 历史命令, 即使你 关闭了 shell终端,这些历史命令都还在,
甚至! 当你 关闭了 mariadb的连接, 关闭了 mariadb的服务, 然后你重启 mariadb的服务, 这些 历史命令的 记录 都还在 , 所以以后 可以 反复地适用 这些历史命令了.
mysql的 控制台 终端, 没有什么所谓的 文件目录路径的概念的, 它是 mysql自己这个服务器 所存储的 系统 自身的 显示, 其实跟你 在shell中, 从什么位置 进入 mysql是没有关系的, 即使你用system命令 来改变目录, 这个也只是改变 的 shell的当前目录...跟mysql无关??? (而且 好像 适用 system cd 或 pushd命令没有效果: 即在 mysql控制台中, 并不能改变shell的当前目录???
但是 , 也不是说, 一点关系都没有, 那就是 , 当你在用 source 命令 执行 脚本的时候, 默认是在 你 当前 目录下(你 从哪里进入mysql的) 寻找 sql文件, 否则, 你 执行 sql脚本的时候 就要 指明 sql脚本文件的 整个完整的 路径...
=====================
source 命令和 . 命令执行脚本时, 如果 用 . 命令, 脚本最后面的 分号; 要跟 脚本文件名 之间 至少要 分割一个空格.....否则会把分号当做脚本文件名的一部分...
mysql中的 很多 对象, 包括 函数, 存储过程, 视图, 索引 等 都是 属于数据库的, 基于数据库的, 所以 在创建的时候, 就要 指明所属的 数据库, 如果不指定 默认就表示的是 当前数据库! 所以, 当你要执行 drop命令的时候, 你要 具有 'delete' privilege on some 数据库!
mysql的 单精度/双精度 数字是 用 decimal (5,2) 来表示的...
整数的类型 从小到大, 有5种: tinyint, smallint mediumint int bigint, unsigned 可以节约一位(用来表示和存储 正负号的), 扩大数据范围;
要记录mysql操作过程中的 输出结果, 输出文字和 输入命令等内容, 可以适用 tee命令, show是显示数据库的 中的变量
什么叫 /为什么 叫 存储过程?
包括函数 也有 存储函数和 用户自定义函数, 存储函数, 叫 stored function, 是指 mysql系统自带的 , 系统内部预先给你定义好了的 函数, 叫做 存储函数.
udf: user-defined function. 即用户自定义 函数.
所以, 对于 过程而言, 也叫做 存储过程
要清楚, 不管是 mysql客户端的控制台, 还是 sql脚本, 都是以 "单独的 一条一条的" 语句为 单位, 组合起来的, 因此, 语句的 结束都是以 分号 为结束的, 遇上 creat procedure/function 等 "语句"的时候, 因为中间可能包含 begin ... end中的 语句用分号, 所以 结束符就要 用其他的了, 不能再用 分号了, 所以, 通用 的写法是:
delimiter $$ -- 这是一条语句
create procedure sp_echo_hello()
begin
select "hello world ";
end$$ --- 这是一条语句
delimiter ; --- 这是一条语句
遇到 drop table/function NAME 居然会出错?? 找到原因了执行DROP TABLE后,所有的表数据和表定义会被取消,所以必须断开mysql连接,mysql_close();这样表数据才会刷新,然后重新连接就没问题了
mysql中 自定义函数 和 自定义 存储过程的语法??
**在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...
因为 function 和 procedure都是 例程/程序, 所以 , 都要必须 加 括号 ().
/*
自定义存储过程
*/
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;
在 存储过程 中, 的 routin_body中, 不能包含: ddl语句, 即: 操作数据库/表/过程/函数 等的 语句...
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;
sql脚本的 注释, 单行注释有: --, # , 注释符号 -- # 必须和后面的内容之间 至少隔一个空格, 多行注释是: / * ....*/
可以认为, 关于函数 和 过程, 只有 在 select 调用的 时候, 才 带 小括号, 其他操作, 比如: show 等的时候, 都不用 括号!!!
mariadb 的版本, 为什么在操作 函数/过程 等的时候 会报错?
-
查看函数/过程的, 有两个命令, 一是: show function/procedure status ; 会将所有的函数/过程都 显示出来, 如果 只是查看某一个具体的 , 用 like... where...
比如: show fucntion status like 'add'; 二是, show create function test.add; (注意必须带 test.数据库) - 在mariadb中, 函数和 过程 叫做: rou' tine (程序, 例程)
- 跟mysql不同, 在mariadb中, 操作函数/过程, 包括: create . drop, 和 select(调用)的时候, 必须显式的 指明 所在的 数据库, 注意即使 当前已经 选择了 例程所在的 数据库, 还要在使用
的代码中 指明 数据库. 如果不指定 数据库 就会报错~~
一般php在什么时候什么情况下, 使用 存储过程?
mysql 是 编译型语言, 如果是php传递字符串查询, 则每次都会编译一次, 而存储过程, 只会在 创建的第一次, 进行编译, 以后都直接执行编译后的 代码.. 使用 存储过程 可能 会提高访问查询速度.
只有在 要处理的 事务 比较复杂, 要使用 大量的 sql 语句的时候, 才使用 procedure, 而平时不是太复杂的查询, 就直接使用 字符串查询就好了!
**在用 php进行 存储过程的 执行时, 要 假设 当前的操作, 仍然在 mysql上, 包括 设置 "用户变量" 等, 都要用 mysql_query("set @sum=0"); 等等.
php 要引用 mysql中的 存储过程返回的值? 参考: http://www.php.cn/php-notebook-44169.html
- 使用 mysql_query('seletc @sum'); 使用 select语句返回的 query, 总是 一个 resource, 其资源id是递增的..
- 这个资源id 被看做是: mysql result 的类型,
- mysql_fetch_row(data), 参数是一个 mysql_query()查询返回的结果集, 每次获取* 一行, ** 返回一个数组! 或者false.
- 如果是mysql_query('select @sum'); 则返回的是 一行记录集, 这个一行记录集中只有一个字段...
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
掌握两个mysql的日期函数就可以了: date_format, str_to_date('日期', 格式字符串);
增删改查, 都是两个关键字,
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创建用户并设置密码, 有两种方法:
一是, 直接在shell中操作: mysqladmin -u user_name password '...'
二是, 先进入mysql, 然后:
set password [ for username] =password(...); -- 注意这里的密码 要用 password函数加密;
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());
在shell界面设置用户的密码后, 就会马上生效, 但是在mysql控制台, 设置密码后, 还要使用 flush
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)
一个用户的标准形式是, ‘user'@ 'localhost'. 如果不写localhost, 不指定host,则默认的就是 ’%’
创建用户时指定密码, 通过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. **
在mysql中, user和user_name是不同的: user_name仅仅只是名字, 但是由于同一个 username可以有多个 不同host的 账户, 因此, the user value should be given in user_name @ host_name format.
存储过程和函数的区别: 存储过程主要是用来处理比较复杂的业务逻辑的, 而函数, 仅仅是为了实现某个简单的逻辑功能/逻辑块的处理的
匿名用户不允许修改密码! nonanonymous account...
修改mysql 的root的密码的多种方法中, 推荐适用的是 : update 方法:
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 之前的版本.
mysql中的加密函数和加密方法?
现在的 加密算法很多, 比如: 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)]>
关于新旧密码, 有一个 会话变量: set old_passwords = on| off. 注意是 old_passwordS 加复数, 当开启 old_passwords后, 适用 password得到的加密长度就是16位了.
关于适用 mysqladmin 命令来修改 用户密码的命令使用 问题
- 使用mysqladmin这个命令的时候, 一定要 指明: -uroot, -p : 第一, 如果不指定 -p参数, 会直接提示你没有使用密码, 第二, 但是又不能直接在命令中指定 输入密码 ,常识: 密码总是在tty以星号的方式来输入.
- 如果是 第一次, 首次设置密码, 即原来没有密码的话, 直接 用 :
mysqladmin -uroot password '123'
不必使用 password函数加密, 会自动加密; - 但是 如果已经设置了密码, 你要修改, 那么就必须 指定 -p 选项: 即:
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 ~]$
当忘记普通用户的密码后, 以root用户登录, 可以 重置 普通用户foo的密码:
- 在select句子中, 如果字符序列 不加引号的话, 会被看做是 : field, column字段: