zoukankan      html  css  js  c++  java
  • 一些常用的mysql语句实例-以后照写

    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;

    关于语法:

    1. 表的字段之间, 用逗号来分割, 同一字段内部 用 空格 分割 而不是 用 逗号分割.
    2. 表的外部,末尾, 用等号来定义 属性, 如: 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...

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

    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字段:

  • 相关阅读:
    oracle索引学习
    (转载)Windows下手动完全卸载Oracle
    Funsion Charts 学习(二)
    Funsion Charts 学习(一)
    集合操作
    文件操作
    字典操作
    字符串操作
    列表操作
    python基本运算
  • 原文地址:https://www.cnblogs.com/bkylee/p/7782955.html
Copyright © 2011-2022 走看看