MySQL基本操作
MySQL之基本操作
数据库操作
- 创建数据库
create database db1; create database db1 default charset gbk; create database if not exists db1 default character set utf8;
- 显示创建信息
show create database db1;
- 修改数据库默认的字符格式
alter database db1 default character set gbk;
- 删除数据库
drop database db1;
区别:delete、truncate、drop
- delete:删除数据
1、数据操作语言(DML)在事务控制里,DML语句是需要commit,不提交的话可以rollback;删除大量记录速度慢,只删除数据不回收高水位线
2、可以带条件删除 - truncate:删除数据
1、数据定义语言(DDL)清大量数据速度快,高水位线(high water mark)下降
2、不能带条件truncate - drop:对象表、库、用户等;数据定义语言
数据查询语句:select
通配符:
-
% 匹配0个或任意多个字符 _ 匹配一个字符
= 精确匹配
like 模糊匹配 regexp (. 任意单个字符 *前导字符出现0次或连续多次 .* 任意长度字符.....) 使用正则表达式来匹配
排序:
-
order by 排序,默认升序 asc 升序排列结果 desc 降序排列结果 group by 聚合 distinct 去除重复的行
常用函数
查看mysql支持字符加密函数:
select password('123'); select md5('123'); select sha1('123'); select encrypt('123'); 基本上不用了
使用select来调度mysql中的常见函数:
select version(); 当前数据库版本
select current_user(); 当前用户
select current_time(); 当前时间
select current_date(); 当前日期
select now(); 当前日期时间
MySQL表操作
表是数据库存储数据的基本单位,由若干个字段组成,主要用来存储数据记录。表的操作
包括创建表、查看表、修改表和删除表。
语法:
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
)[存储引擎 字符集];
说明:
auto_increment表示自增长
primary key表示主键
not null表示不为空
==在同一张表中,字段名是不能相同 ==宽度和约束条件可选 ==字段名和类型是必须的
创建表
表school.student1
表school.student1 字段 字段 字段 id name sex age 1 tom male 23 记录 2 jack male 21 记录 3 alice female 19 记录 mysql> CREATE DATABASE school; //创建数据库school mysql> use school; mysql> create table student1( -> id int, -> name varchar(50), -> sex enum('m','f'), -> age int -> ); Query OK, 0 rows affected (0.03 sec)
mysql> show tables; //查看表(当前所在库) +------------------+ | Tables_in_school | +------------------+ | student1 | +------------------+ 1 row in set (0.00 sec)
mysql> select * from student1; //查询表中所有字段的值 Empty set (0.00 sec) mysql> select name,age from student1; //查询表中指定字段的值 Empty set (0.00 sec)
向表中插入内容
语法:
insert into 表名(字段1,字段2...) values(字段值列表...);
表school.student2
字段名 数据类型 编号 id int 姓名 name varchar(50) 出生年份 born_year year 生日 birthday date 上课时间 class_time time 注册时间 reg_time datetime mysql> create table student2( -> id int, -> name varchar(50), -> born_year year, -> birthday date, -> class_time time, -> reg_time datetime -> ); mysql> desc student2; mysql> insert into student2 values(1,'tom',now(),now(),now(),now()); mysql> insert into student2 values(2,'jack',1982,19821120,123000,20140415162545);
表school.student3
id id int 姓名 name varchar(50) 性别 sex enum('male','female') 爱好 hobby set('music','book','game','disc') mysql> create table student3( -> id int, -> name varchar(50), -> sex enum('male','female'), -> hobby set('music','book','game','disc') -> ); mysql> desc student3; mysql> show create table student3\G mysql> insert into student3 values (1,'tom','male','book,game'); mysql> insert into student3 values (2,'jack','male','film'); mysql> select * from student3;
查看表结构
DESCRIBE查看表结构
DESCRIBE 表名;
DESC 表名;
SHOW CREATE TABLE查看表详细结构
SHOW CREATE TABLE 表名;
表完整性约束
作用:用于保证数据的完整性和一致性
约束条件 说明 PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录,不可以为空 UNIQUE + NOT NULL FOREIGN KEY (FK) 标识该字段为该表的外键,实现表与表(父表主键/子表1外键/子表2外键)之间的关联 NOT NULL 标识该字段不能为空 UNIQUE KEY (UK) 标识该字段的值是唯一的,可以为空,一个表中可以有多个UNIQUE KEY AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键) DEFAULT 为该字段设置默认值 UNSIGNED 无符号,正数 ZEROFILL 使用0填充,例如0000001 说明: 1. 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值 2. 字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值 sex enum('male','female') not null default 'male' age int unsigned NOT NULL default 20 必须为正值(无符号) 不允许为空 默认是20 3. 是否是key 主键 primary key 外键 forengn key 索引 (index,unique...)
DEFAULT、NOT NULL
表school.student4
mysql> create table school.student4( -> id int not null, -> name varchar(50) not null, -> sex enum('m','f') default 'm' not null, -> age int unsigned default 18 not null, hobby set('music','disc','dance','book') default 'book,dance');
mysql> insert into student4 values(1,'jack','m',20,'book'); Query OK, 1 row affected (0.00 sec) mysql> insert into student4(id,name) values(2,'robin'); Query OK, 1 row affected (0.00 sec)
设置唯一约束 UNIQUE
表company.department
mysql> create table company.department( -> dept_id int, -> dept_name varchar(30) unique, -> comment varchar(50));
设置主键约束 PRIMARY KEY
primary key 字段的值是不允许重复,且不允许不NULL(UNIQUE + NOT NULL)
单列做主键
多列做主键(复合主键)
单列做主键
表school.student6 方法一
mysql> create table student6( -> id int primary key not null auto_increment, -> name varchar(50) not null, -> sex enum('male','female') not null default 'male', -> age int not null default 18); Query OK, 0 rows affected (0.20 sec) mysql> insert into student6 values (1,'alice','female',22); mysql> insert into student6(name,sex,age) values -> ('jack','male',19), -> ('tom','male',23); mysql> select * from student6; +----+-------+--------+-----+ | id | name | sex | age | +----+-------+--------+-----+ | 1 | alice | female | 22 | | 2 | jack | male | 19 | | 3 | tom | male | 23 | +----+-------+--------+-----+ 3 rows in set (0.00 sec)
表school.student7 方法二
mysql> create table student7( -> id int auto_increment not null, -> name varchar(50) not null, -> sex enum('male','female') not null default 'male', -> age int not null default 18, -> primary key(id)); Query OK, 0 rows affected (0.21 sec)
复合主键
表school.service
host_ip 存储主机IP service_name 服务名 port 服务对应的端口 allow(Y,N) 服务是否允许访问 主键: host_ip + port = primary key mysql> create table service( -> host_ip varchar(15) not null, -> service_name varchar(10) not null, -> port varchar(5) not null, -> allow enum('Y','N') default 'N', -> primary key(host_ip,port) -> ); Query OK, 0 rows affected (0.00 sec)
mysql> insert into service values ('192.168.2.168','ftp','21','Y'); Query OK, 1 row affected (0.09 sec) mysql> insert into service values ('192.168.2.168','httpd','80','Y'); Query OK, 1 row affected (0.03 sec)
设置字段值增 AUTO_INCREMENT
表company.department3
CREATE TABLE department3 ( dept_id INT PRIMARY KEY AUTO_INCREMENT, dept_name VARCHAR(30), comment VARCHAR(50) );
设置外键约束 FOREIGN KEY
父表company.employees
mysql> create table employees( -> name varchar(50) not null, -> mail varchar(20), -> primary key(name)) engine=innodb;
子表company.payroll
mysql> create table payroll( -> id int not null auto_increment, -> name varchar(50) not null, -> payroll float(10,2) not null, -> primary key(id), -> foreign key(name) -> references employees(name) -> on update cascade -> on delete cascade -> )engine=innodb;
mysql> select * from employees; +------+--------------+ | name | mail | +------+--------------+ | tom | 11111@qq.com | +------+--------------+ 1 row in set (0.00 sec) mysql> select * from payroll; +----+------+---------+ | id | name | payroll | +----+------+---------+ | 1 | tom | 11.00 | +----+------+---------+ 1 row in set (0.00 sec) mysql> update employees set name='tomaaa' where name='tom'; Query OK, 1 row affected (0.04 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from payroll; +----+--------+---------+ | id | name | payroll | +----+--------+---------+ | 1 | tomaaa | 11.00 | +----+--------+---------+ 1 row in set (0.00 sec) mysql> select * from employees; +--------+--------------+ | name | mail | +--------+--------------+ | tomaaa | 11111@qq.com | +--------+--------------+ 1 row in set (0.00 sec) mysql> delete from employees where name='tomaaa'; Query OK, 1 row affected (0.04 sec) mysql> select * from employees; Empty set (0.00 sec) mysql> select * from payroll; Empty set (0.00 sec)
mysql> update employees set name='tomaaa' where name='tom'; mysql> delete from employees where name='alice';
结论:
当父表中某个员工的记录修改时,子表也会同步修改
当父表中删除某个员工的记录,子表也会同步删除
修改表ALTER TABLE
语法:
- 修改表名
ALTER TABLE 表名 RENAME 新表名;
- 增加字段
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…], ADD 字段名 数据类型 [完整性约束条件…];
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST;
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名 - 删除字段
ALTER TABLE 表名 DROP 字段名;
- 修改字段
ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…]; ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…]; ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];
实例:
1. 修改存储引擎 mysql> alter table service -> engine=innodb; //engine=myisam|memore|.... 2. 添加字段 mysql> create table student10 (id int); mysql> alter table student10 -> add name varchar(20) not null, -> add age int not null default 22; mysql> alter table student10 -> add stu_num int not null after name; //添加name字段之后 mysql> alter table student10 -> add sex enum('male','female') default 'male' first; //添加到最前面 3. 删除字段 mysql> alter table student10 -> drop sex; mysql> alter table service -> drop mac; 4. 修改字段类型modify mysql> alter table student10 -> modify age tinyint; mysql> alter table student10 -> modify id int not null primary key ; //修改字段类型、约束、主键 5. 增加约束(针对已有的主键增加auto_increment) mysql> alter table student10 modify id int not null primary key auto_increment; //错误,该字段已经是primary key ERROR 1068 (42000): Multiple primary key defined mysql> alter table student10 modify id int not null auto_increment; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 6. 增加复合主键 mysql> alter table service2 -> add primary key(host_ip,port); 7. 增加主键 mysql> alter table student1 -> add primary key(id); 8. 增加主键和自动增长 mysql> alter table student1 -> modify id int not null primary key auto_increment; 9. 删除主键[primary key auto_increment] a. 删除自增约束 mysql> alter table student10 modify id int not null; b. 删除主键 mysql> alter table student10 -> drop primary key;
复制表
- 复制表结构+记录 (key不会复制: 主键、外键和索引)
mysql> create table new_service select * from service;
- 只复制表结构
mysql> create table new1_service select * from service where 1=2; //条件为假,查不到任何记录
- 复制表结构,包括Key
mysql> create table t4 like employees;
人生是条无名的河,是浅是深都要过;
人生是杯无色的茶,是苦是甜都要喝;
人生是首无畏的歌,是高是低都要唱。