一些经常使用的mysql语句实例-之后照写

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

关于语法:算法

  1. 表的字段之间, 用逗号来分割, 同一字段内部 用 空格 分割 而不是 用 逗号分割.
  2. 表的外部,末尾, 用等号来定义 属性, 如: engine=innodb 字符集: default charset=utf8 ...

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...服务器

建立表的方法, 除了常规的方法外, 还有两个:

  1. 使用 like. create table foo like bar; 这时 foo表的结构就跟bar 的结构 彻底一致了..
  2. 适用 复制命令: create table foo select * from bar ; 这时候, bar表和 foo表的数据结构彻底一致, 并且 foo表中的数据 也被 复制给了 bar表;
    可是 若是只是为了 想 复制表的 结构, 不复制数据, 要适用 条件: create table bar2 select * from foo where 1<>1 ;

  3. 凡是 在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

  1. 掌握两个mysql的日期函数就能够了: date_format, str_to_date('日期', 格式字符串);
  2. 增删改查, 都是两个关键字,
    select from
    insert into
    upate ... set (set是 mysql中很常见的一个关键字)
    delete from ... where. 注意, delete删除的是一个记录一个记录的删除, 不可能只删除某一个字段的,
    因此,delete后面, 就不能带、指定字段了。

  3. 注意, mysql的条件字句where, 天生就支持 like, not like in not in between 等模糊匹配符号,
    而不是只有等号=

2.对mysql 的操做, 既能够直接在 shell 界面 操做, 也能够 先进入mysql控制台, 而后再进行操做。

  1. 对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, 且为复数。

  1. 要删除表中的数据, 有两种方法, 一是 常规的 delete from t; 二是使用truncate, 第二种truncate比
    dlete的速度要快, 占用的内存和日志要少, 产生的rollback快、少??

  2. 字符集, 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。


  1. 字段的标准声明方式就是: 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 等

  2. 在mysql控制台, 提供了很是强大/详细的 help, 经过help key1, 或者help key1 key2能够查看到不少详细的信息...

  3. 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中的加密函数和加密方法?

  1. 如今的 加密算法不少, 好比: md5, des(数据加密标准data, encryption standard, ibm公司提出的), aes, sha等等. des在pos机, 加油卡, 购物卡等非机密机构的应用中使用.
    mysql中提供的加密算法包括: md5, password, old_password. aes_encrypt等.

  2. 它自己提供/ 支持 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)]>
  1. 可是 mysql提供的 password加密方法, 加密函数, 又是 另一种加密方法, 它加密出来的字符串老是 以星号开头的, 并且是41位的.
    而mysql中 也有 /也提供/支持md5 加密的, 它加密出来的长度 是 32位.
    在mysql中, 计算字符串长度用 length(...) 函数. 要显示 mysql加密函数 加密后的 结果, 直接用 select输出

  2. 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 命令来修改 用户密码的命令使用 问题

  1. 使用mysqladmin这个命令的时候, 必定要 指明: -uroot, -p : 第一, 若是不指定 -p参数, 会直接提示你没有使用密码, 第二, 可是又不能直接在命令中指定 输入密码 ,常识: 密码老是在tty以星号的方式来输入.
  2. 若是是 第一次, 首次设置密码, 即原来没有密码的话, 直接 用 : mysqladmin -uroot password '123' 没必要使用 password函数加密, 会自动加密;
  3. 可是 若是已经设置了密码, 你要修改, 那么就必须 指定 -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的密码:

  1. 在select句子中, 若是字符序列 不加引号的话, 会被看作是 : field, column字段:
相关文章
相关标签/搜索