SQL结构化查询语言
一、 什么是SQLSQL(structured query language),中文意思是结构化查询语言,它是一种对关系型数据库中的数据进行定义和操作的语言方法,是大多数关系型数据库管理系统所支持的语言。二、SQL的分类SQL结构化查询语言分为6个部分。2.1. 数据查询语言(DQL);DQL全称(data query language),即“数据检索语句”,用来从表中获得数据,确定...
一、 什么是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 ROUTINE | Alters or drops stored routines. |
ALTER | Allows use of ALTER TABLE. |
CREATE | Allows use of CREATE TABLE. |
CREATE ROUTINE | Creates stored routines. |
CREATE TEMPORARY TABLE | Allows use of CREATE TEMPORARY TABLE. |
CREATE USER | Allows use of CREATE USER, DROP USER, RENAME USER, and REVOKE ALL PRIVILEGES. |
CREATE VIEW | Allows use of CREATE VIEW. |
DELETE | Allows use of DELETE. |
DROP | Allows use of DROP TABLE. |
EXECUTE | Allows the user to run stored routines. |
FILE | Allows use of SELECT… INTO OUTFILE and LOAD DATA INFILE. |
INDEX | Allows use of CREATE INDEX and DROP INDEX. |
INSERT | Allows use of INSERT. |
LOCK TABLES | Allows use of LOCK TABLES on tables for which the user also has SELECT privileges. |
PROCESS | Allows use of SHOW FULL PROCESSLIST. |
RELOAD | Allows use of FLUSH. |
REPLICATION | Allows the user to ask where slave or master |
CLIENT | servers are. |
REPLICATION SLAVE | Needed for replication slaves. |
SELECT | Allows use of SELECT. |
SHOW DATABASES | Allows use of SHOW DATABASES. |
SHOW VIEW | Allows use of SHOW CREATE VIEW. |
SHUTDOWN | Allows use of mysqladmin shutdown. |
SUPER | Allows 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. |
UPDATE | Allows use of UPDATE. |
USAGE | Allows 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字符集数据库
更多推荐
所有评论(0)