mysql系列详解二:sql语句操作-技术流ken
1.简介
本篇博客将详细讲解mysql的一些常用sql语句操作,例如创建数据库,删除数据库,创建表,修改表,删除表,以及简单查询案例。
2.关于mysql数据中的SQL的大小写问题
1.不区分大小写
1. sql中的关键字函数名
2. 存储过程、促存储函数、调度器
2.区分大小写
1. 库名、表名(也可以不区分—修改配置文件或者环境变量)
2. 触发器
3. 视图
3.第一类语句:与数据库相关的语句
语句1:创建数据库
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification] …
说明:
IF NOT EXISTS:判断当前系统中是否有要创建的这个数据库,如果有的话,不再执行创建,而且不会报错
CHARACTER SET:指定当前数据库所采用字符类型(utf8)
COLLATE:指定排序规则
例子:
CREATE DATABASE IF NOT EXISTS jobs DEFAULT CHARACTER SET utf8
语句2:删除数据库
DROP DATABASE [IF EXISTS] db_name
例子:DROP DATABASE IF EXISTS test;
语句3:修改数据库
这里往往仅仅是修改数据库中的字符集类型和排序规则(不能修改修改数据库名)
ALTER DATABASE [db_name] alter_specification …
例子:修改test1的字符集为utf8
ALTER DATABASE test1 DEFAULT CHARACTER SET utf8;
修改数据库名称:
先对要修改名称的数据库做备份,然后新建一个数据库,库名就是新的名字,然后将备份的数据还原到这个新库中
语句4:更新数据字典
ALTER DATABASE db_name UPGRADE DATA DIRECTORY NAME
第二类语句:与表相关的语句
语句1:新建表
方法1:直接创建一张新表
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (create_definition,…) [table_options] [partition_options]
TEMPORARY:该选项表示所创建的是一张临时表,表是在内存
create_definition: <<创建定义
| PRIMARY KEY (col_name1, col_name1…) <<创建主键
| {INDEX|KEY} [index_name] [index_type] (index_col_name,…) [index_option] … <<创建索引
| [CONSTRAINT UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,…) [index_option] … <<创建唯一键
| [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,…) reference_definition <<定义约束
| CHECK (expr) <<定义check
例子:创建一张表,id为主键、name长度为30,age为整型
CREATE TABLE tb1 (id int PRIMARY KEY, name char(30), age int(3))
CREATE TABLE tb2 (id int, name char(30), age int(3), PRIMARY KEY(id))
例子:创建一张表,id和name构成联合主键、name长度为30,age为整型
CREATE TABLE tb2 (id int, name char(30), age int(3), PRIMARY KEY(id,name))
table_option:
AUTO_INCREMENT [=] value << 指定主键从几开始自增
| ENGINE [=] engine_name <<< 指定表所使用的存储引擎
| [DEFAULT] CHARACTER SET [=] charset_name <<< 指定当前表的字符集(不指定会继承)
| CHECKSUM [=] {0 | 1} <<< 指定是否对插入的数据做校验(可以保证数据一致,但是会带来额外的系统开销)
| [DEFAULT] COLLATE [=] collation_name <<< 指定当前表的排序规则(不指定会继承)
| COMMENT [=] ‘string’ <<< 指定当前表的描述说明信息
| DELAY_KEY_WRITE [=] {0 | 1} <<< 延迟键写入,推迟重建索引的间隔
| MAX_ROWS [=] value
| MIN_ROWS [=] value
| UNION [=] (tbl_name[,tbl_name]…) <<< 做表联合
|TABLESPACE tablespace_name [STORAGE {DISK|MEMORY|DEFAULT}] <<< 定义表空间
| ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT} <<< 定义表格式
例子:创建一张表,id为主键、name长度为30,要求id从10开始自增
CREATE TABLE tb8 (id int PRIMARY KEY, name char(30)) AUTO_INCREMENT 10;
或者
create table ken (id int,name char(30),primary key(id)) auto_increment 10; <<指定自增开始,需要放在外面
方法2:根据现有表创建新表,而且新表中的数据也是来自于现有表
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,…)]
[table_options]
[partition_options]
[IGNORE | REPLACE]
[AS] query_expression
例子:
create table ken1 as select * from mysql.user;
注意:如果使用这个命令需要把配置文件/etc/my.cnf中下面的这两行注释掉!
#gtid-mode = on
#enforce-gtid-consistency=1
方法3:根据现有表创建新表,但是仅仅有表结构
CREATE TABLE [IF NOT EXISTS] tbl_name LIKE old_tbl_name
例子:基于mysq.l.user创建新表
CREATE TABLE tb01 LIKE mysql.user;
创建表的三种方式
1. create table ken(id int,name char)
2. create table ken like old_table <<会继承old_table的表结构
3. create table ken AS select * from old_table <<继承表结构以及表中的数据
语句2:删除表
DROP TABLE [IF EXISTS] tbl_name [, tbl_name]… [CASCADE]
说明:
CASCADE:级联删除
语句3:修改表结构 alter(字段、属性、限制、约束、索引、键…)
ALTER TABLE tbl_name
[alter_specification [, alter_specification] …]
[partition_options]
1.添加字段
ADD col_name column_definition [FIRST | AFTER col_name]
例子:
# 在age字段后添加一个新的字段school
ALTER TABLE tb1 ADD school CHAR(10) AFTER age;
# 在最前面插入字段job
ALTER TABLE tb1 ADD job CHAR(20) NOT NULL FIRST;
# 在末尾添加一个新字段phone
ALTER TABLE tb1 ADD phone int(10);
2.删除表中的字段
DROP col_name
例子:删除age字段
ALTER TABLE tb1 DROP age;
生产环境建议
添加字段最好添加在末尾
最好不要删除无用的字段
3.修改表中的字段(修改字段的约束和属性,但是无法修改字段名)
MODIFY col_name column_definition [FIRST | AFTER col_name]
例子:ALTER TABLE tb1 MODIFY name varchar(50) NOT NULL DEFAULT ‘zx’;
4.修改字段的名称
CHANGE old_col_name new_col_name column_definition [FIRST|AFTER col_name]
例子: ALTER TABLE tb1 CHANGE job jobs char(30) not null;
5.添加删除索引
ADD index [索引类型] (字段1,字段2…) [options]
例子:将索引添加到 name字段上
ALTER TABLE tb1 ADD INDEX (name); 《《在添加索引的时候列明这里需要加上括号
查看表中的索引
SHOW INDEXES FROM tb1;
删除索引
alter table ken3 drop index id; <<删除索引的时候这里不需要加括号
注意:索引不是越多越好,会使得写入速度变慢
6.添加约束、删除约束
主键:
唯一:
| ADD [CONSTRAINT [symbol]] PRIMARY KEY
[index_type] (index_col_name,…) [index_option] …
| ADD [CONSTRAINT [symbol]]
UNIQUE [INDEX|KEY] [index_name]
[index_type] (index_col_name,…) [index_option] …
关于主键
DROP PRIMARY KEY
{DISABLE|ENABLE} KEYS
7.修改表名
RENAME [TO|AS] new_tbl_name
例子:
alter table ken3 rename to ken33;
8.指定表中的内容按照哪个字段进行排序
(如果表中有索引或者主键,那么无法按照指定的字段排序)
ORDER BY col_name [, col_name] …
9.修改表所使用的字符集类型
CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
语句4:删除表中的数据
DELETE FROM 表名 [条件]
delete from ken where age>=25; <<删除指定的行
delete from ken; <<删除表中的全部数据
truncate ken; <<删除表中的全部数据
说明:
如果没有条件,那么是删除表中的全部数据
表的截断:停止主键的自增
截断表的格式:TRUNCATE 表名 <<< 删除表中的数据,同时截断表
第三类语句:简单的查询
查询
简单查询
多表查询
联合查询
1.简单查询格式
SELECT 字段名… FROM 表名 [条件] [选项]
例子:查询t09中的全部数据
> SELECT * FROM t09;
例子:查询t09中的id
> SELECT id FROM t09;
例子:查看所有id大于5的记录
> SELECT * FROM t09 WHERE id>5
例子:查看所有id大于5的记录的中的name字段
> SELECT name FROM t09 WHERE id>5
4.条件的表达方式
=
>
<
>=
<=
!= <>
is null
is not null
in
between … and …
like:结合通配符
RLIKE:结合正则
组合条件
and
or
not
排序
order by 字段 [desc|asc]
限制输出的记录条数
limit n:仅仅显示n条记录
limit m,n:
几个查询案例
案例:将年龄在20-25的用户名和用户id显示出来
mysql> select name,stuid,age from students where age>=20 and age<=25;
mysql> select name,stuid,age from students where age between 20 and 25;
案例:将年龄在小于20,或者大于25的用户名和用户id显示出来
select stuid,name,age from students where age<20 or age>25;
案例:显示用户名是以S为开头的用户名和年龄
mysql> select name,age from students where name like ‘S%’;
案例:显示用户名是以Y为开头,且年龄是19的用户
mysql> select name,age from students where name like ‘Y%’ and age=19;
案例:显示用户名是以Y为开头,且年龄小于20的用户
mysql> select name,age from students where name like ‘Y%’ and age<20;
案例:显示所有用户的用户名和年龄
mysql> select name,age from students;
案例:显示所有用户的用户名和年龄,要求按照年龄排序(从大到小排)
mysql> select name,age from students order by age desc;
案例:显示所有用户的用户名和年龄,要求仅仅显示年龄最大的三个用户
mysql> select name,age from students order by age desc limit 3;
案例:统计students表有多少行
mysql> select count(*) from students;
案例:显示年龄最大的用户的年龄
mysql> select max(age) from students;
5.几个内置函数
user()
database()
count():统计记录的条数
max():
min()
使用select database();查看
6.补充
补充:数据库的默认字符集
继承
数据库的字符集会自动继承自mysql的字符集
表的字符集会自动继承当前这个数据库的字符集
表中的字段的字符集会自动集成表的字符集
避免乱码:保证字符集统一
1. 操作系统所采用的字符集
2. 当前终端的字符集
3. mysql客户端字符集
4. mysql服务器端字符集(mysql、数据库、表、字段)
7.小试身手
1. 创建数据库 test(字符集 utf8 ,要使用IF NOT EXISTS)
2. 在test库中创建一张表ken,字段如下
id 整型 主键 非空 非负 自增(从5开始)
name 字符类型 非空
gender 枚举ENUM(‘M’, ‘F’) 默认值是M
要求存储引擎用MyISAM
答案:
create database if not exists test default character set utf8;
create table if not exists ken (id int primary key not null, name char(30) not null, gender enum(“M”,”F”)) auto_increment 5 ENGINE=”MyISAM”;
8.总结
总而言之,sql语句操作起来还是比较简单的,只要熟练使用help contents,就能轻松驾驭各种sql语句,关键在于理解,比如什么是字段,什么是索引,什么是事务等,只要理解了这些概念性的东西,就可以使用sql来定向操作你需要的内容了。