一、 什么是SQL
SQL(structured query language),中文意思是结构化查询语言,它是一种对关系型数据库中的数据进行定义和操作的语言方法,是大多数关系型数据库管理系统所支持的语言。

二、SQL的分类

SQL结构化查询语言分为6个部分。

  • 2.1. 数据查询语言(DQL);

    DQL全称(data query language),即“数据检索语句”,用来从表中获得数据,确定数据怎样在应用程序中显示。保留字SELECT是DQL中用的最多的动词。DQL常用的保留字有WHERE(查询条件)、ORDER BY(排序)、GROUP BY和HAVING。这些保留字常与其他类型的SQL语言一起使用。例如:
    select user,host from mysql.user oder by user;
    oder by user desc 按照字母倒序排列
    oder by user asc 按照字母顺序排列

  • 2.2数据库操作语言(DML)
    DML全称(data manipulation language),其语句包括动词INSERT,UPDATE和DELETE。他们分别用于添加,修改和删除表中的行数据。也称为动作查询语句。具体例句:
    delete from mysql.user where user=‘root’;

  • 2.3事务处理语言(TPL)
    它的语句能确保被DML语句影响的标的所有行及时的已更新。TPL语句包括DEGIN TRANSACTION,COMMIT和ROLLBACK。

  • 2.4数据控制语言(DCL)

    DCL全称(data control language),他的语句通过GRANT(授权)或REVOKE(收回授权)获得许可,确定单个用户和用户组对数据对象的访问。

  • 2.5数据定义语言(DDL)

    DDL全称(data definition language),其语句包含动词CREATE和DROP。在数据库中创建表或者删除表(create table 或drop table)
    2.6指针控制语言(CCL)
    CCL全称(CURSOR control language),它的语句,例如DECLARE CURSOR,FEICH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。

三、mysql数据库常见管理

  • 3.1创建数据库的方法
    命令语法:create database<数据库名称>,数据库名不能数字开头。
    例如:创建一个名为data_default的数据库

     create database data_default ;# 创建
     show databases like 'data%';  # 查看
      show create database data_default\G  #查看建库语句,默认字符集为拉丁
      cerate database  data_gbk DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci  #建立一个名为data_gbk的GBK字符集数据库,即简体中文
      cerate database  data_utf8 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci  #建立一个名为data_utf8的utf-8字符集数据库
    
  • 3.2显示数据库的方法
    命令:show databases;

     show databases;               #显示库
     show databases like 'roo%';  #显示某一个库
     select  database();   #显示当前链接的数据库
     select version(); #查看数据库版本
     select user();  #查看当前用户
     select now(): #查看当前的时间
     show grants for root@'localhost';#查看root用户权限
     use root; #进入root数据库
    
  • 3.3删除数据库
    命令:drop database<数据库名>
    可看帮助:help drop database
    例如,删除名为root的数据库

         drop database root;  #删除root数据库
    
  • 3.4创建表
    语法:create table <表名>(
    <字段名 1><类型 1>,

    <字段名n><类型n>,
    );
    其中create table 是关键字,不能更改,不区分大小写。
    例子:
    1.人工写法设计的建表语句,表名为student。默认字符集是拉丁字符集,与库的默认字符集一样

     create table student(    #表名为student
     id int(4) not null,    #学号列,类型为整型,不允许为空
     name char(20) not null, #名字列,类型为字符型,不允许为空
     age tinyint(2)  NOT NULL default '0',#年龄列,类型为整型,默认是0
     dept varchar(16)  default NULL #系别列,变长字符型,长度为16,默认为空
     ); 
    
  • 3.5查看建立的表结构

    两种方法:
    desc <表名>;
    show columns from <表名>;
    例如:

     desc student;
     show columns from student;
    
  • 3.6查看已建表的语句

     show create table student \G #G表示以垂直的方式显示
    
  • 3.7查看当前数据库包含的表信息

    切到数据库里面查看

     show tables;
     show tables like 'user';
     show tables from data_gbk;  #查看指定库中的表
     show tables in data_gbk;查看指定库中的表
    
  • 3.8为表的字段创建索引
    索引就像书的目录一样,如果在字段上建立了索引,那么以索引列为查询条件可以加快查询数据的速度。
    创建主键索引
    查询数据库,按主键查询最快,每个表只能有一个主键列,但是可以有多个普通索引列。主键列要求列的所有内容必须唯一,而普通索引列不要求内容必须唯一。
    创建主键索引的方法:
    1.在建表时,可以增加建立主键索引的语句如下

     create table student(    #表名为student
     id int(4) not null  AUTO_INCREMENT,    #学号列,类型为整型,不允许为空,AUTO_INCREMENT,表示自增。
     name char(20) not null, #名字列,类型为字符型,不允许为空
     age tinyint(2)  NOT NULL default '0',#年龄列,类型为整型,默认是0
     dept varchar(16)  default NULL, #系别列,变长字符型,长度为16,默认为空
     primary key(id), #id为主键
     KEY index_name(name)#name 字段普通索引
     ); 
    

    2.建表后通过alter命令增加主键索引
    主键列不能重复创建,必须删除已经创建的主键。

     alter table student drop primary key;#删除主键
    

    利用alter命令修改id列为自增主键列

     alter table student change id id int primary key auto_increment;
    

    创建普通索引
    1.在建表时,可以增加建立普通索引的语句如下

      create table student(    #表名为student
     id int(4) not null  AUTO_INCREMENT,    #学号列,类型为整型,不允许为空,AUTO_INCREMENT,表示自增。
     name char(20) not null, #名字列,类型为字符型,不允许为空
     age tinyint(2)  NOT NULL default '0',#年龄列,类型为整型,默认是0
     dept varchar(16)  default NULL, #系别列,变长字符型,长度为16,默认为空
     primary key(id), #id为主键
     KEY index_name(name)#name 字段普通索引
     ); 
    

    2.建表后利用alter增加普通索引
    删除创建表时创建的index_name索引,

     alter table student drop index index_name;
    

    在name列上添加索引,索引名为index_name

     alter table student add index index_name(name);
    

    3.指定前n个字符创建索引
    当遇到表中比较大的列时,列内容的前n个字符在所有内容中已经接近唯一时,这时可以对列的前n个字符建立索引,而无需对整个列建立索引,这样可以节省创建索引占用的系统空间。
    对字段的前n个字符创建普通索引的语法:

     create index index_dept on student(dept(8));
      # create index表示创建索引,index_dept索引名称 ,student代表表名称哪个表上,dept(8)表示在哪个列上
    
     show index from student\G  #查看索引
    

    为多列的前n个字符创建联合索引,联合索引有前缀生效特性。

     create index ind_name_dept on student(name(8),dept(10));
    create index index_name on student(name); #在student表中的那么字段中创建名为 index_name的普通索引。
    

    创建唯一非主键索引

     create unique index index_age on student(age);
    

    创建索引注意事项:
    索引虽然可以加快查询速度,但是如果给所有列创建索反而速度变慢。因为索引不但占用系统空间而且更新数据库时还需要维护索引数据。
    例如在select user,host from mysql.user where host=…,中索引一定要创建在where这个条件列。且尽量选择在唯一多的大表上建立索引。

  • 3.9 DML语句insert命令介绍

    往表中插入数据
    命令语法:
    insert into<表名>[(<字段名1>…<字段名n>)] values [(值1)…(值n)]
    例如:
    创建一个表名为test的表,然后往表中插入数据。
    创建test表:

    create table student(    #表名为student
     id int(4) not null  AUTO_INCREMENT,    
     name char(20) not null, 
     age tinyint(2)  NOT NULL default '0',
     primary key(id), #id为主键
     KEY index_name(name)#name 字段普通索引
     ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
    

    向表里插入数据方法:
    1.指定所有列名(字段),并且每列都插入值

      insert into test(id,name) values(1,'missli');
      select * from test;  #查看
    

    2.由于id列为自增,所以可以只在name列插入值(id,name 都是字段)

      insert into test(name) values('missli');
      select * from test;  #查看
    

    3.如果不指定列,就要按照顺序为每列都插入恰当的值。

      insert into test values(3,'lily');
    

    4.批量插入数据方法

      insert into test values(3,'lily'),(4,‘kkg’),(5,'hhh');
    

    删除表里插入的数据的方法
    方法一:用delete
    delete from student where name=miss and id=2 ;

    delete from student where id=2;
    

    方法二:用turncate命令
    语法:turncate table 表名;

       turncate table student;#清空表中所有内容。
    

    区别:delete是一行一行删,逻辑删除,可以恢复
    turncate 物理删除,删除速度块,不可恢复。

  • 3.10增删表的字段方法
    增加表列的命令语法:
    alter table 表名 add 字段 类型 其他;
    例如:

    alter table test add sex char(2) ;#在test表中添加sex字段,类型为char(2)
    alter table test add age int(4) after name;#指定添加年龄列到name列后面的位置
    alter table test add qq varchar(15) first;#在第一列添加qq字段
    alter table test modify age char(4) after name;   #修改字段类型
    alter table test change age hisage char(4) after name; #修改字段名称
    
  • 3.11更改表名方法

    用rename命令:
    语法:
    rename table 原表名 to 新表名;
    例如:

     show tables;
     rename table test to test1;#将表名test改为test1
    

    用alter命令:
    语法:
    alter table 原表名 rename to 新表名;
    例如:

      alter table test1 rename to test;
    
  • 3.12 删除表的方法
    使用drop命令
    语法:
    drop table <表名>;
    例如:

     drop table test;删除test表
    
  • 3.13 DML语句中UPDATE命令

    如果我们需要修改或更新 MySQL 中的数据,我们可以使用 SQL UPDATE 命令来操作。
    以下是 UPDATE 命令修改 MySQL 数据表数据的通用 SQL 语法。
    UPDATE table_name SET field1=new-value1, field2=new-value2
    [WHERE Clause]
    它可以同时更新一个或多个字段,在 WHERE 子句中指定任何条件。
    你可以在一个单独表中同时更新数据。当你需要更新数据表中指定行的数据时 WHERE 子句是非常有用的。
    例子:
    更新数据表中 runoob_id 为 3 的 runoob_title 字段值:

    UPDATE runoob_tbl SET runoob_title='学习 C++' WHERE runoob_id=3;
    SELECT * from runoob_tbl WHERE runoob_id=3; #查看
    
  • 3.14查询数据DQL中select命令

    select命令语法:
    select<字段1,字段2,…>from<表名>where <表达式>。
    其中select,from,where不能随便改,大小写一样。
    例如:
    进入指定库中查询

    use  data_default;进入data_default库
    select * from student;   #*表示所有字段
    select id,name from student; #指定id和name字段
    select id,name from student where name='missli';   #用where指定条件
    select id,name from student where name='missli' and id=2;# and前后条件都要满足。
    select id,name from student where id>1 and id<5;#id 大于1小于5
    select id,name from student order by id desc;   #按照id降序排列
    select id,name from student order by id asc;  #按照id升序排列
    

查询表 hr.customers中 c_zip列数据的平均值

  mysql> select *  from hr.customers order by c_zip desc;
                +-------+----------+---------------------+---------+--------+-----------+-------------------+
| c_id  | c_name   | c_address           | c_city  | c_zip  | c_contact | c_email             |
+-------+----------+---------------------+---------+--------+-----------+-------------------+
| 10005 | qefdsx   | 67 sun place        | qingdao | 106888 | xuli      | jerry@hotmail.com 
| 10004 | joto     | 829 riverside drive | haikuo  | 570000 | yangshan  | sam@hotmail.com   |
| 10001 | redhook  | 200 street          | tianjin | 300000 | liming    | lming@163.com     |
| 10003 | netbhood | 1 sunny place       | qingdao | 266000 | luocong   | NULL              |
| 10002 | stars    | 333 fromage lane    | dalian  | 116000 | zhaobo    | jerry@hotmail.com |
+-------+----------+---------------------+---------+--------+-----------+-------------------+
4 rows in set (0.00 sec)
 mysql> select AVG(c_zip) from hr.customers;  
 +------------+
 | AVG(c_zip) |
 +------------+
 |     313000 |
 +------------+
 1 row in set (0.00 sec)

统计有多少条c_id记录,显示最终统计个数

    mysql> select count(c_id) from hr.customers;
    +-------------+
    | count(c_id) |
    +-------------+
    |           5 |
    +-------------+
    1 row in set (0.00 sec)

如果有多条相同email,DISTINCT可以去除重复记录

  mysql> select distinct(c_email)  from  hr.customers;
  +-------------------+
  | c_email           |
  +-------------------+
  | lming@163.com     |
  | jerry@hotmail.com |
  | NULL              |
  | sam@hotmail.com   |
  +-------------------+
   4 rows in set (0.00 sec)

限制仅显示数据记录中的前两行记录

mysql> select * from hr.customers limit 2;
+-------+---------+------------------+---------+--------+-----------+-------------------+
| c_id  | c_name  | c_address        | c_city  | c_zip  | c_contact | c_email           |
+-------+---------+------------------+---------+--------+-----------+-------------------+
| 10001 | redhook | 200 street       | tianjin | 300000 | liming    | lming@163.com     |
| 10002 | stars   | 333 fromage lane | dalian  | 116000 | zhaobo    | jerry@hotmail.com |
+-------+---------+------------------+---------+--------+-----------+-------------------+
2 rows in set (0.00 sec)=

IN关键字范围查询
例如查询范s_id围在101到102的值
select s_id,f_name,f_price from fruits where s_id IN (101,102) order by f_name;

带like字符的匹配查询
例如查找以b字母开头的水果
select f_id,f_name from fruits where f_name like ‘b%’;
例如查询以b开头以y结尾的水果名称
select f_name from fruits where f_name like ‘b%y’;

查询空值
select c_id,c_name from customers where c_name IS NULL;

带AND的多条件查询,查询s_id为101并且价格大于等于5的
select f_id,f_price,f_name from fruits where s_id=‘101’ and f_price>=5;

带or的多条件查询,与IN效果一样
or表示只需满足其中一个条件记录即可
例如查询s_id为101或者s_id为102的水果供应商
select s_id,f_name,f_price from fruits where s_id=101 or s_id=102;
结果同select s_id,f_name,f_price from fruits where s_id IN(101,102);

分组查询
group by 关键字通常和集合函数一起使用,例如MAX(),MIN(),COUNT(),SUM(),AVG()。例如,要返回每个水果供应商提供的水果种类,这时就要在分组过程中用到count()函数,把数据分为多个逻辑组,并对每个组进行集合计算。
首先建表:

use shiyan;
CREATE TABLE fruits
(
f_id char(10)  NOT NULL,
s_id INT       NOT NULL,
f_name char(255) NOT NULL,
f_price DECIMAL(8,2)  NOT NULL,
PRIMARY KEY(f_id)
);
出现如下结果创建成功
[SQL]CREATE TABLE fruits
(
f_id char(10)  NOT NULL,
s_id INT       NOT NULL,
f_name char(255) NOT NULL,
f_price DECIMAL(8,2)  NOT NULL,
PRIMARY KEY(f_id)
);
受影响的行: 0
时间: 0.067s
插入数据
INSERT INTO fruits (f_id,s_id,f_name,f_price)
VALUES('a1',101,'apple',5.2),
('b1',101,'blackberry',10.2),
('bs1',102,'orange',11.2),
('bs2',105,'melon',8.2),
('t1',102,'banana',10.3),
('t2',102,'grape',5.3),
('o2',103,'coconut',9.2),
('co',101,'cherry',3.2),
('a2',103,'apricot',2.2),
('l2',104,'lemon',6.4),
('b2',104,'berry',7.6),
('m1',106,'mango',15.7),('m2','105','xbaby',2.6),('t4',107,'xbababa',3.6),
('m3',105,'xxtt',11.6),
('b5',107,'xxxx',3.6);

查看

mysql> select * from shiyan.fruits;
+------+------+------------+---------+
| f_id | s_id | f_name     | f_price |
+------+------+------------+---------+
| a1   |  101 | apple      |    5.20 |
| a2   |  103 | apricot    |    2.20 |
| b1   |  101 | blackberry |   10.20 |
| b2   |  104 | berry      |    7.60 |
| b5   |  107 | xxxx       |    3.60 |
| bs1  |  102 | orange     |   11.20 |
| bs2  |  105 | melon      |    8.20 |
| co   |  101 | cherry     |    3.20 |
| l2   |  104 | lemon      |    6.40 |
| m1   |  106 | mango      |   15.70 |
| m2   |  105 | xbaby      |    2.60 |
| m3   |  105 | xxtt       |   11.60 |
| o2   |  103 | coconut    |    9.20 |
| t1   |  102 | banana     |   10.30 |
| t2   |  102 | grape      |    5.30 |
| t4   |  107 | xbababa    |    3.60 |
+------+------+------------+---------+
16 rows in set (0.00 sec)

mysql> select count(*) from shiyan.fruits;
+----------+
| count(*) |
+----------+
|       16 |
+----------+
1 row in set (0.00 sec)

mysql> select count(f_id) from shiyan.fruits; 
+-------------+
| count(f_id) |
+-------------+
|          16 |
+-------------+
1 row in set (0.00 sec)

mysql> select count(s_id) from shiyan.fruits;    
+-------------+
| count(s_id) |
+-------------+
|          16 |
+-------------+
1 row in set (0.00 sec)

mysql> select distinct(s_id) from shiyan.fruits;     
+------+
| s_id |
+------+
|  101 |
|  103 |
|  104 |
|  107 |
|  102 |
|  105 |
|  106 |
+------+
7 rows in set (0.00 sec)

例如根据s_id对fruits表中的数据进行分组,sql语句如下:

mysql> select s_id, count(*) as total from fruits group by s_id;
+------+-------+
| s_id | total |
+------+-------+
|  101 |     3 |
|  102 |     3 |
|  103 |     2 |
|  104 |     2 |
|  105 |     3 |
|  106 |     1 |
|  107 |     2 |
+------+-------+
7 rows in set (0.00 sec)

如果要查看每个供应商提供水果种类名称,可以使用group_concat()函数

mysql> select s_id,group_concat(f_name) as names from fruits group by s_id;       
+------+-------------------------+
| s_id | names                   |
+------+-------------------------+
|  101 | apple,blackberry,cherry |
|  102 | grape,banana,orange     |
|  103 | apricot,coconut         |
|  104 | lemon,berry             |
|  105 | xbaby,xxtt,melon        |
|  106 | mango                   |
|  107 | xxxx,xbababa            |
+------+-------------------------+
7 rows in set (0.00 sec)

使用having过滤分组,例如显示水果种类大于1的分组

mysql> select s_id,group_concat(f_name) as names from fruits group by s_id having count(f_name)>1;
+------+-------------------------+
| s_id | names                   |
+------+-------------------------+
|  101 | apple,blackberry,cherry |
|  102 | grape,banana,orange     |
|  103 | apricot,coconut         |
|  104 | lemon,berry             |
|  105 | xbaby,xxtt,melon        |
|  107 | xxxx,xbababa            |
+------+-------------------------+
6 rows in set (0.00 sec)

group by 子句中使用with rollup计算查询出的分组所有记录的总和

mysql> select s_id,count(*) as total from fruits group by s_id with rollup;
+------+-------+
| s_id | total |
+------+-------+
|  101 |     3 |
|  102 |     3 |
|  103 |     2 |
|  104 |     2 |
|  105 |     3 |
|  106 |     1 |
|  107 |     2 |
| NULL |    16 |
+------+-------+
8 rows in set (0.00 sec)

在这里插入图片描述

多表连表查询:
语法:
select 表1.内容,表2.内容 , 表3.内容 , …from 表1,表2,表3, … where 条件
连接查询
连接查询是关系数据库中最主要的查询,主要包括内连接、外连接等。通过连接运算符可以实现多个表查询。当两个或者多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查询。
内连接查询
内连接(inner join)使用比较运算符进行表间某些列数据的比较操作,并列出这些表中与连接条件相匹配的数据行,组合成新纪录,也就是说在内连接查询中,只有满足条件的记录才能出现在结果关系中。
为了演示需要,创建suppliers表。sql语句如下:

CREATE TABLE suppliers
(
s_id INT NOT NULL auto_increment,
s_name CHAR(50) NOT NULL,
s_city CHAR(50) NULL,
s_zip CHAR(10) NULL,
s_call CHAR(50) NOT NULL,
PRIMARY KEY (s_id)
);

插入需要演示的数据

INSERT INTO suppliers(s_id,s_name,s_city,s_zip,s_call)
VALUES(101,'FastFruit Inc.','Tianjin','300000','48075'),
(102,'LT Supplies','Chongqing','400000','44333'),
(103,'ACME','shanghai','200000','90046'),
(104,'FNK Inc.','Zhongshan','528437','11111'),
(105,'Good Set','Taiyuang','030000','22222'),
(106,'Just Eat Ours','Beijing','010','45678'),
(107,'DK Inc.','Zhengzhou','450000','33332');

例如在fruits表和suppliers表之间使用内连接查询。
查询之前先看两个表的结构

mysql> DESCRIBE fruits;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| f_id    | char(10)     | NO   | PRI | NULL    |       |
| s_id    | int(11)      | NO   |     | NULL    |       |
| f_name  | char(255)    | NO   |     | NULL    |       |
| f_price | decimal(8,2) | NO   |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> DESCRIBE suppliers;
+--------+----------+------+-----+---------+----------------+
| Field  | Type     | Null | Key | Default | Extra          |
+--------+----------+------+-----+---------+----------------+
| s_id   | int(11)  | NO   | PRI | NULL    | auto_increment |
| s_name | char(50) | NO   |     | NULL    |                |
| s_city | char(50) | YES  |     | NULL    |                |
| s_zip  | char(10) | YES  |     | NULL    |                |
| s_call | char(50) | NO   |     | NULL    |                |
+--------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

由上述结果可以看到fruits表和suppliers表都有相同数据类型字段s_id。两个表通过s_id字段建立联系。
例如从fruits表中查询f_name,f_price字段,从suppliers表中查询s_id,s_name,sql语句如下

mysql> select suppliers.s_id,s_name,f_name,f_price from fruits,suppliers where fruits.s_id=suppliers.s_id;
+------+----------------+------------+---------+
| s_id | s_name         | f_name     | f_price |
+------+----------------+------------+---------+
|  101 | FastFruit Inc. | apple      |    5.20 |
|  103 | ACME           | apricot    |    2.20 |
|  101 | FastFruit Inc. | blackberry |   10.20 |
|  104 | FNK Inc.       | berry      |    7.60 |
|  107 | DK Inc.        | xxxx       |    3.60 |
|  102 | LT Supplies    | orange     |   11.20 |
|  105 | Good Set       | melon      |    8.20 |
|  101 | FastFruit Inc. | cherry     |    3.20 |
|  104 | FNK Inc.       | lemon      |    6.40 |
|  106 | Just Eat Ours  | mango      |   15.70 |
|  105 | Good Set       | xbaby      |    2.60 |
|  105 | Good Set       | xxtt       |   11.60 |
|  103 | ACME           | coconut    |    9.20 |
|  102 | LT Supplies    | banana     |   10.30 |
|  102 | LT Supplies    | grape      |    5.30 |
|  107 | DK Inc.        | xbababa    |    3.60 |
+------+----------------+------------+---------+
16 rows in set (0.00 sec)
mysql> select suppliers.s_id,s_name,f_name,f_price from fruits,suppliers ;
+------+----------------+------------+---------+
| s_id | s_name         | f_name     | f_price |
+------+----------------+------------+---------+
|  101 | FastFruit Inc. | apple      |    5.20 |
|  102 | LT Supplies    | apple      |    5.20 |
|  103 | ACME           | apple      |    5.20 |
|  104 | FNK Inc.       | apple      |    5.20 |
|  105 | Good Set       | apple      |    5.20 |
|  106 | Just Eat Ours  | apple      |    5.20 |
|  107 | DK Inc.        | apple      |    5.20 |
|  101 | FastFruit Inc. | apricot    |    2.20 |
|  102 | LT Supplies    | apricot    |    2.20 |
|  103 | ACME           | apricot    |    2.20 |
|  104 | FNK Inc.       | apricot    |    2.20 |
|  105 | Good Set       | apricot    |    2.20 |
|  106 | Just Eat Ours  | apricot    |    2.20 |
|  107 | DK Inc.        | apricot    |    2.20 |
|  101 | FastFruit Inc. | blackberry |   10.20 |
|  102 | LT Supplies    | blackberry |   10.20 |
|  103 | ACME           | blackberry |   10.20 |
|  104 | FNK Inc.       | blackberry |   10.20 |
|  105 | Good Set       | blackberry |   10.20 |
|  106 | Just Eat Ours  | blackberry |   10.20 |
|  107 | DK Inc.        | blackberry |   10.20 |
|  101 | FastFruit Inc. | berry      |    7.60 |
|  102 | LT Supplies    | berry      |    7.60 |
|  103 | ACME           | berry      |    7.60 |
|  104 | FNK Inc.       | berry      |    7.60 |
|  105 | Good Set       | berry      |    7.60 |
|  106 | Just Eat Ours  | berry      |    7.60 |
|  107 | DK Inc.        | berry      |    7.60 |
|  101 | FastFruit Inc. | xxxx       |    3.60 |
|  102 | LT Supplies    | xxxx       |    3.60 |
|  103 | ACME           | xxxx       |    3.60 |
|  104 | FNK Inc.       | xxxx       |    3.60 |
|  105 | Good Set       | xxxx       |    3.60 |
|  106 | Just Eat Ours  | xxxx       |    3.60 |
|  107 | DK Inc.        | xxxx       |    3.60 |
|  101 | FastFruit Inc. | orange     |   11.20 |
|  102 | LT Supplies    | orange     |   11.20 |
|  103 | ACME           | orange     |   11.20 |
|  104 | FNK Inc.       | orange     |   11.20 |
|  105 | Good Set       | orange     |   11.20 |
|  106 | Just Eat Ours  | orange     |   11.20 |
|  107 | DK Inc.        | orange     |   11.20 |
|  101 | FastFruit Inc. | melon      |    8.20 |
|  102 | LT Supplies    | melon      |    8.20 |
|  103 | ACME           | melon      |    8.20 |
|  104 | FNK Inc.       | melon      |    8.20 |
|  105 | Good Set       | melon      |    8.20 |
|  106 | Just Eat Ours  | melon      |    8.20 |
|  107 | DK Inc.        | melon      |    8.20 |
|  101 | FastFruit Inc. | cherry     |    3.20 |
|  102 | LT Supplies    | cherry     |    3.20 |
|  103 | ACME           | cherry     |    3.20 |
|  104 | FNK Inc.       | cherry     |    3.20 |
|  105 | Good Set       | cherry     |    3.20 |
|  106 | Just Eat Ours  | cherry     |    3.20 |
|  107 | DK Inc.        | cherry     |    3.20 |
|  101 | FastFruit Inc. | lemon      |    6.40 |
|  102 | LT Supplies    | lemon      |    6.40 |
|  103 | ACME           | lemon      |    6.40 |
|  104 | FNK Inc.       | lemon      |    6.40 |
|  105 | Good Set       | lemon      |    6.40 |
|  106 | Just Eat Ours  | lemon      |    6.40 |
|  107 | DK Inc.        | lemon      |    6.40 |
|  101 | FastFruit Inc. | mango      |   15.70 |
|  102 | LT Supplies    | mango      |   15.70 |
|  103 | ACME           | mango      |   15.70 |
|  104 | FNK Inc.       | mango      |   15.70 |
|  105 | Good Set       | mango      |   15.70 |
|  106 | Just Eat Ours  | mango      |   15.70 |
|  107 | DK Inc.        | mango      |   15.70 |
|  101 | FastFruit Inc. | xbaby      |    2.60 |
|  102 | LT Supplies    | xbaby      |    2.60 |
|  103 | ACME           | xbaby      |    2.60 |
|  104 | FNK Inc.       | xbaby      |    2.60 |
|  105 | Good Set       | xbaby      |    2.60 |
|  106 | Just Eat Ours  | xbaby      |    2.60 |
|  107 | DK Inc.        | xbaby      |    2.60 |
|  101 | FastFruit Inc. | xxtt       |   11.60 |
|  102 | LT Supplies    | xxtt       |   11.60 |
|  103 | ACME           | xxtt       |   11.60 |
|  104 | FNK Inc.       | xxtt       |   11.60 |
|  105 | Good Set       | xxtt       |   11.60 |
|  106 | Just Eat Ours  | xxtt       |   11.60 |
|  107 | DK Inc.        | xxtt       |   11.60 |
|  101 | FastFruit Inc. | coconut    |    9.20 |
|  102 | LT Supplies    | coconut    |    9.20 |
|  103 | ACME           | coconut    |    9.20 |
|  104 | FNK Inc.       | coconut    |    9.20 |
|  105 | Good Set       | coconut    |    9.20 |
|  106 | Just Eat Ours  | coconut    |    9.20 |
|  107 | DK Inc.        | coconut    |    9.20 |
|  101 | FastFruit Inc. | banana     |   10.30 |
|  102 | LT Supplies    | banana     |   10.30 |
|  103 | ACME           | banana     |   10.30 |
|  104 | FNK Inc.       | banana     |   10.30 |
|  105 | Good Set       | banana     |   10.30 |
|  106 | Just Eat Ours  | banana     |   10.30 |
|  107 | DK Inc.        | banana     |   10.30 |
|  101 | FastFruit Inc. | grape      |    5.30 |
|  102 | LT Supplies    | grape      |    5.30 |
|  103 | ACME           | grape      |    5.30 |
|  104 | FNK Inc.       | grape      |    5.30 |
|  105 | Good Set       | grape      |    5.30 |
|  106 | Just Eat Ours  | grape      |    5.30 |
|  107 | DK Inc.        | grape      |    5.30 |
|  101 | FastFruit Inc. | xbababa    |    3.60 |
|  102 | LT Supplies    | xbababa    |    3.60 |
|  103 | ACME           | xbababa    |    3.60 |
|  104 | FNK Inc.       | xbababa    |    3.60 |
|  105 | Good Set       | xbababa    |    3.60 |
|  106 | Just Eat Ours  | xbababa    |    3.60 |
|  107 | DK Inc.        | xbababa    |    3.60 |
+------+----------------+------------+---------+
112 rows in set (0.00 sec)

注意看区别
下面用inner join语法进行内连接查询,查询结果与上面的一样

mysql> select suppliers.s_id,s_name,f_name,f_price from fruits inner join suppliers on fruits.s_id=suppliers.s_id;
+------+----------------+------------+---------+
| s_id | s_name         | f_name     | f_price |
+------+----------------+------------+---------+
|  101 | FastFruit Inc. | apple      |    5.20 |
|  103 | ACME           | apricot    |    2.20 |
|  101 | FastFruit Inc. | blackberry |   10.20 |
|  104 | FNK Inc.       | berry      |    7.60 |
|  107 | DK Inc.        | xxxx       |    3.60 |
|  102 | LT Supplies    | orange     |   11.20 |
|  105 | Good Set       | melon      |    8.20 |
|  101 | FastFruit Inc. | cherry     |    3.20 |
|  104 | FNK Inc.       | lemon      |    6.40 |
|  106 | Just Eat Ours  | mango      |   15.70 |
|  105 | Good Set       | xbaby      |    2.60 |
|  105 | Good Set       | xxtt       |   11.60 |
|  103 | ACME           | coconut    |    9.20 |
|  102 | LT Supplies    | banana     |   10.30 |
|  102 | LT Supplies    | grape      |    5.30 |
|  107 | DK Inc.        | xbababa    |    3.60 |
+------+----------------+------------+---------+
16 rows in set (0.00 sec)

外连接查询
外连接查询将查询多个表中相关联的行,内连接时,返回查询结果集合中的仅是符合查询条件和连接条件的行。但有时需要包含没有关联的行中数据,即返回结果中不仅包含符合条件的行,而且还包括左表(左外连接或左连接)、右表(右外连接或右连接)或两个连接表(全外连接)中所有的数据行。
left join(左连接):返回包括左表中的所有记录和右表中连接字段相等的记录
right join(右连接):返回包括右表中的所有记录和左表中连接字段相等的记录
left join(左连接)
如果左表的某一行在右表中没有匹配行,则在相关连的结果行中,右表的所有选择列表列均为空值。
创建演示表orders,sql语句如下:

CREATE TABLE orders
(
o_num INT NOT NULL auto_increment,
o_date datetime  NOT NULL,
c_id INT NOT NULL,
PRIMARY KEY (o_num)
);

插入需要演示的数据,sql语句如下:

INSERT INTO orders (o_num,o_date,c_id)
VALUES(30001,'2008-09-01',10001),
(30002,'2008-09-12',10003),
(30003,'2008-09-30',10004),
(30004,'2008-10-03',10005),
(30005,'2008-10-08',10001);

创建customers表

CREATE TABLE customers
(
c_id int NOT NULL auto_increment,
c_name CHAR(50) NOT NULL,
c_address char(50) NULL,
c_city char(50) NULL,
c_zip char(10) NULL,
c_contact CHAR(50) NULL,
c_email CHAR(255) NULL,
PRIMARY KEY (c_id)
);

插入数据

```bash
INSERT INTO customers(c_id,c_name,c_address,c_city,c_zip,c_contact,c_email)
VALUES (10001,'RedHook','200 street','tianjin','300000','LiMing','Liming@163.com'),
(10002,'stars','333 fromage lane','dalian','116000','zhangbo','jerry@hotmail.com'),
(10003,'netbhood','1 sunny place','qingdao','266000','luocong','null'),
(10004,'joto','829 riverside drive','haikou','570000','yangshan','sam@hotmail.com');
INSERT INTO customers(c_id,c_name,c_address,c_city,c_zip,c_contact,c_email)
VALUES (10001,'RedHook','200 street','tianjin','300000','LiMing','Liming@163.com'),
(10002,'stars','333 fromage lane','dalian','116000','zhangbo','jerry@hotmail.com'),
(10003,'netbhood','1 sunny place','qingdao','266000','luocong','null'),
(10004,'joto','829 riverside drive','haikou','570000','yangshan','sam@hotmail.com');

例如在customers表和orders表中,查询所有客户,包括没有订单的客户,sql语句如下

mysql> select customers.c_id,orders.o_num from customers left outer join orders on customers.c_id =orders.c_id;
+-------+-------+
| c_id  | o_num |
+-------+-------+
| 10001 | 30001 |
| 10003 | 30002 |
| 10004 | 30003 |
| 10001 | 30005 |
| 10002 |  NULL |
+-------+-------+
5 rows in set (0.00 sec)

结果显示了5条记录,id等于10002的客户目前没有下单。
right join 右连接
右连接是左连接的反向链接,将返回右表的所有行。如果右表的某行在左表中没有匹配行,左表将返回空值。

mysql> select customers.c_id,orders.o_num from customers right outer join orders on customers.c_id =orders.c_id;    
+-------+-------+
| c_id  | o_num |
+-------+-------+
| 10001 | 30001 |
| 10003 | 30002 |
| 10004 | 30003 |
|  NULL | 30004 |
| 10001 | 30005 |
+-------+-------+
5 rows in set (0.00 sec)

复合条件链接查询
复合条件链接查询是在链接查询的过程中。通过添加过滤条件,限制查询的结果,使查询结果更加准确。
例如查询10001的客户的订单信息,sql语句如下

mysql> select customers.c_id,orders.o_num from customers inner join orders on customers.c_id =orders.c_id and customers.c_id=10001; 
+-------+-------+
| c_id  | o_num |
+-------+-------+
| 10001 | 30001 |
| 10001 | 30005 |
+-------+-------+
2 rows in set (0.00 sec)

子查询
子查询指一个查询语句嵌套在另一个查询语句内部的查询。在select子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。子查询中常用的操作符有ANY(SOME),ALL,IN,EXISTS。子查询可以添加到select,update和delete语句中。
1.带ANY、SOME关键字的子查询
ANY和SOME关键字是同义词,表示满足其中任一条件,它们允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询条件。
创建演示表tb1和tb2:

CREATE TABLE tbl1(num1 INT NOT NULL);
CREATE TABLE tbl2(num2 INT NOT NULL);

分别向表中插入数据

INSERT INTO tbl1 VALUES(1),(5),(13),(27);
INSERT INTO tbl2 VALUES(6),(14),(11),(20);

any关键字接在一个比较操作符的后面,表示若与子查询返回的任何值比较为true,则返回ture
例如返回tbl2表的所有num2列,然后将tbl1中的num1的值与之进行比较,只要大于num2的任何1个值,即为符合查询条件结果。

mysql> select num1 from tbl1 where num1>any(select num2 from tbl2);
+------+
| num1 |
+------+
|   13 |
|   27 |
+------+
2 rows in set (0.00 sec)

带ALL关键字的子查询
all关键字与any和some不同,使用all时需要同时满足所有内层查询的条件。例如

mysql> select num1 from tbl1 where num1>all(select num2 from tbl2);   
+------+
| num1 |
+------+
|   27 |
+------+
1 row in set (0.00 sec)

带exists关键字的子查询
exists关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断他是否返回行,如果至少返回一行,那么exists的结果为true,此时外层查询语句将进行查询;如果子查询没有返回行,那么exists返回的结果为false,此时外层语句将不进行查询。
例如查询表中是否存在s_id=107的供应商,如果存在则查询fruits表中的记录,sql语句如下

mysql> select * from fruits where exists (select s_name from suppliers where s_id=107);
+------+------+------------+---------+
| f_id | s_id | f_name     | f_price |
+------+------+------------+---------+
| a1   |  101 | apple      |    5.20 |
| a2   |  103 | apricot    |    2.20 |
| b1   |  101 | blackberry |   10.20 |
| b2   |  104 | berry      |    7.60 |
| b5   |  107 | xxxx       |    3.60 |
| bs1  |  102 | orange     |   11.20 |
| bs2  |  105 | melon      |    8.20 |
| co   |  101 | cherry     |    3.20 |
| l2   |  104 | lemon      |    6.40 |
| m1   |  106 | mango      |   15.70 |
| m2   |  105 | xbaby      |    2.60 |
| m3   |  105 | xxtt       |   11.60 |
| o2   |  103 | coconut    |    9.20 |
| t1   |  102 | banana     |   10.30 |
| t2   |  102 | grape      |    5.30 |
| t4   |  107 | xbababa    |    3.60 |
+------+------+------------+---------+
16 rows in set (0.00 sec)

mysql> select * from fruits ;
+------+------+------------+---------+
| f_id | s_id | f_name     | f_price |
+------+------+------------+---------+
| a1   |  101 | apple      |    5.20 |
| a2   |  103 | apricot    |    2.20 |
| b1   |  101 | blackberry |   10.20 |
| b2   |  104 | berry      |    7.60 |
| b5   |  107 | xxxx       |    3.60 |
| bs1  |  102 | orange     |   11.20 |
| bs2  |  105 | melon      |    8.20 |
| co   |  101 | cherry     |    3.20 |
| l2   |  104 | lemon      |    6.40 |
| m1   |  106 | mango      |   15.70 |
| m2   |  105 | xbaby      |    2.60 |
| m3   |  105 | xxtt       |   11.60 |
| o2   |  103 | coconut    |    9.20 |
| t1   |  102 | banana     |   10.30 |
| t2   |  102 | grape      |    5.30 |
| t4   |  107 | xbababa    |    3.60 |
+------+------+------------+---------+
16 rows in set (0.00 sec)

mysql> select * from fruits where exists (select s_name from suppliers where s_id=108);
Empty set (0.00 sec)

mysql> select * from fruits where f_price>10.20 and exists (select s_name from suppliers where s_id=107);
+------+------+--------+---------+
| f_id | s_id | f_name | f_price |
+------+------+--------+---------+
| bs1  |  102 | orange |   11.20 |
| m1   |  106 | mango  |   15.70 |
| m3   |  105 | xxtt   |   11.60 |
| t1   |  102 | banana |   10.30 |
+------+------+--------+---------+
4 rows in set (0.00 sec)
注意比较四者区别

创建orderitems表

CREATE TABLE orderitems 
(
o_num int NOT NULL,
o_item INT NOT NULL,
f_id char(10) NOT NULL,
item_price DECIMAL(8,2) not NULL,
PRIMARY KEY(o_num,o_item)
);

mysql> desc orderitems;
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| o_num      | int(11)      | NO   | PRI | NULL    |       |
| o_item     | int(11)      | NO   | PRI | NULL    |       |
| f_id       | char(10)     | NO   |     | NULL    |       |
| item_price | decimal(8,2) | NO   |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> alter table orderitems add quantity int not null after f_id;
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc orderitems;
+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| o_num      | int(11)      | NO   | PRI | NULL    |       |
| o_item     | int(11)      | NO   | PRI | NULL    |       |
| f_id       | char(10)     | NO   |     | NULL    |       |
| quantity   | int(11)      | NO   |     | NULL    |       |
| item_price | decimal(8,2) | NO   |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
插入数据
INSERT INTO orderitems(o_num,o_item,f_id,quantity,item_price)
VALUES (30001,1,'a1',10,5.2),
(30001,2,'b2',3,7.6),
(30001,3,'bs1',5,11.2),
(30001,4,'bs2',15,9.2),
(30002,1,'b3',2,20.0),
(30003,1,'c0',100,10),
(30004,1,'o2',50,2.50),
(30005,1,'c0',5,10),
(30005,2,'b1',10,8.99),
(30005,3,'a2',10,2.2),
(30005,4,'m1',5,14.99);

带in关键字子查询
IN关键字子查询时候,内层查询语句仅仅返回一个数据列,这个数据列里的值将提供给外层查询语句进行比较操作。
例如在orderitmes表中查询f_id为c0的订单号,并根据订单号查询具有订单号的客户c_id,sql语句如下

mysql> select c_id from orders where o_num IN (select o_num from orderitems where f_id = 'c0');
+-------+
| c_id  |
+-------+
| 10004 |
| 10001 |
+-------+
2 rows in set (0.00 sec)
  • 3.15删除MySQL系统多余的账号

    语法:drop user “user”@“主机域” 可是双引号或者单引号。
    例如:

     drop user 'root'@'data';
     drop user ' '@'data';
     drop user ' '@'localhost';  #没有的部分用两个单引号替代
    

    如果是大写或者特殊字符用drop删除不了,可以用以下方式删除

      delete from mysql.user where user='root' and host='localhost';
      flush privileges;
    
  • 3.16创建MySQL用户及赋予用户权限
    通过grant命令授权。

    help grant
    CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';#创建用户
    GRANT ALL ON db1.* TO 'jeffrey'@'localhost';  #授权jeffrey这个本地主机用户对db1库下的所有表有全部权限。
    GRANT SELECT ON db2.invoice TO 'jeffrey'@'localhost';  #授权jeffrey这个本地用户对db2库下的invoice这个表有查找(select)的权限
    GRANT USAGE ON *.* TO 'jeffrey'@'localhost' WITH MAX_QUERIES_PER_HOUR 90;
    

    由上面的例子可以看到,创建用户并授权有两种方法:
    第一种:
    先用cerate命令创建用户再用grant授权。
    创建用户:
    命令:CREATE USER ‘username’@‘localhost’ IDENTIFIED BY ‘password’;

    说明:username - 你将创建的用户名, host - 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost, 如果想让该用户可以从任意远程主机登陆,可以使用通配符%。password - 该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器.
    例如:

     CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
     CREATE USER 'pig'@'%' IDENTIFIED BY '123456'; #远程主机
     CREATE USER 'pig'@'%' IDENTIFIED BY ''; 
    

    授权:
    命令:GRANT privileges ON databasename.tablename TO ‘username’@‘host’

    说明: privileges - 用户的操作权限,如SELECT , INSERT , UPDATE 等.如果要授予所的权限则使用ALL.;databasename - 数据库名,tablename-表名,如果要授予该用户对所有数据库和表的相应操作权限则可用*表示
    例如:

     GRANT ALL ON db1.* TO 'jeffrey'@'localhost'; #授权jeffrey这个本地用户对db1库下的所有表有全部权限。
     GRANT ALL ON *.* TO 'pig'@'%';    #远程主机用户pig对所有数据库和表有所有权限,但是不能给其他用户授权
     GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;   #这个命令授权的用户可以给其他用户授权
    

    第二种
    使用grant命令在创建用户的同时授权,常用。

      GRANT ALL ON db1.* TO 'jeffrey'@'localhost' IDENTIFIED BY 'password';
    

    上面的命令相当于下面两条命令:

      CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'password';
       GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
    

    授权局域网内的主机链接数据库
    根据grant语法,‘jeffrey’@‘localhost’ 位置为授权访问数据库的主机。localhost可以用域名,ip或者段来代替。授权局域网内的主机可以通过如下方法实现:
    a.百分号匹配法

    GRANT ALL ON *.* TO 'jeffrey'@'192.168.0.%' IDENTIFIED BY 'password';   #授权局域网内192.168.0.0这个网段主机有所有权限
    grant select,insert,update,delete,create,drop on blog.* to 'jeffrey'@'192.168.0.%'  identified by 'password' #博客数据库的权限设置
    

    b.子网掩码匹配法

    GRANT ALL ON *.* TO 'jeffrey'@'192.168.0.0/255.255.255.0' IDENTIFIED BY 'password';   #授权局域网内192.168.0.0这个网段主机有所有权限
    

    要远程连接数据库192.168.0.1的方法为
    linux上远程连接方法:

    mysql -u jeffrey -p'password' -h 192.168.0.1
    

    PHP服务器远程连接mysql的方法:

     <?php
              //$link_id=mysql_connect('主机名','用户','密码');  #语法
               $link_id=mysql_connect('192.168.0.1','jeffrey','password') or mysql_error();
     if ($link_id) {
           echo 'mysql successful by jeffry !';
    } else{
           echo mysql_error();
    }
    ?>
    

第三种
如果你需要添加 MySQL 用户,你只需要在 mysql 数据库中的 user 表添加新用户即可。

以下为添加用户的的实例,用户名为guest,密码为guest123,并授权用户可进行 SELECT, INSERT 和 UPDATE操作权限:

root@host# mysql -u root -p
Enter password:*******
mysql> use mysql;
Database changed

mysql> INSERT INTO user 
          (host, user, password, 
           select_priv, insert_priv, update_priv) 
           VALUES ('localhost', 'guest', 
           PASSWORD('guest123'), 'Y', 'Y', 'Y');
Query OK, 1 row affected (0.20 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 1 row affected (0.01 sec)

mysql> SELECT host, user, password FROM user WHERE user = 'guest';
+-----------+---------+------------------+
| host      | user    | password         |
+-----------+---------+------------------+
| localhost | guest | 6f8c114b58f2ce9e |
+-----------+---------+------------------+
1 row in set (0.00 sec)
撤销用户权限
命令: REVOKE privilege ON databasename.tablename FROM 'username'@'host'; 
说明: privilege, databasename, tablename - 同授权部分。
例如:

      REVOKE SELECT ON *.* FROM 'Jeffrey'@'%'; 
      
注意: 假如你在给用户'Jeffrey'@'%'授权的时候是这样的(或类似的):GRANT SELECT ON test.user TO 'pig'@'%', 则在使用REVOKE SELECT ON *.* FROM 'Jeffrey'@'%';命令并不能撤销该用户对test数据库中user表的SELECT 操作.相反,如果授权使用的是GRANT SELECT ON *.* TO 'Jeffrey'@'%';则REVOKE SELECT ON test.user FROM 'Jeffrey
'@'%';命令也不能撤销该用户对test数据库中user表的Select 权限. 

设置与更改用户密码
命令:SET PASSWORD FOR ‘username’@‘host’ = PASSWORD(‘newpassword’);如果是当前登陆用户用SET PASSWORD = PASSWORD(“newpassword”);
例如:

   SET PASSWORD FOR 'Jeffrey'@'%' = PASSWORD("123456");

附表:
在MySQL中的操作权限

命令权限说明
ALTER ROUTINEAlters or drops stored routines.
ALTERAllows use of ALTER TABLE.
CREATEAllows use of CREATE TABLE.
CREATE ROUTINECreates stored routines.
CREATE TEMPORARY TABLEAllows use of CREATE TEMPORARY TABLE.
CREATE USERAllows use of CREATE USER, DROP USER, RENAME USER, and REVOKE ALL PRIVILEGES.
CREATE VIEWAllows use of CREATE VIEW.
DELETEAllows use of DELETE.
DROPAllows use of DROP TABLE.
EXECUTEAllows the user to run stored routines.
FILEAllows use of SELECT… INTO OUTFILE and LOAD DATA INFILE.
INDEXAllows use of CREATE INDEX and DROP INDEX.
INSERTAllows use of INSERT.
LOCK TABLESAllows use of LOCK TABLES on tables for which the user also has SELECT privileges.
PROCESSAllows use of SHOW FULL PROCESSLIST.
RELOADAllows use of FLUSH.
REPLICATIONAllows the user to ask where slave or master
CLIENTservers are.
REPLICATION SLAVENeeded for replication slaves.
SELECTAllows use of SELECT.
SHOW DATABASESAllows use of SHOW DATABASES.
SHOW VIEWAllows use of SHOW CREATE VIEW.
SHUTDOWNAllows use of mysqladmin shutdown.
SUPERAllows use of CHANGE MASTER, KILL, PURGE MASTER LOGS, and SET GLOBAL SQL statements. Allows mysqladmin debug command. Allows one extra connection to be made if maximum connections are reached.
UPDATEAllows use of UPDATE.
USAGEAllows connection without any specific privileges.
  • 3.17指定字符集建库
    在未指定字符集的情况下直接建库,则使用默认的拉丁字符集。例如:

    create  database data;
    show create  database data\G;
    Create database: CREATE DATABASE 'data'/*!40100 DEFAULT CHARACTER SET latinl */  #这里是拉丁字符集。
    

    指定字符集建库方法:

     cerate database  data_gbk DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci  #建立一个名为data_gbk的GBK字符集数据库,即简体中文
      cerate database  data_utf8 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci  #建立一个名为data_utf8的utf-8字符集数据库
    
Logo

快速构建 Web 应用程序

更多推荐