Linux 开源数据库Mysql-4
SQL结构化查询语言
DDL语句数据库定义语言:数据库、表、视图、索引、存储过程,例如CREATE、DROP、ALTER
DML语句数据库操纵语言:插入数据INSERT、删除数据DELETE、更新数据UPDATE
DQL语句数据库查询语句:查询数据SELECT
DCL语句数据库控制语句语言:例如控制用户得访问权限GRANT、REVOKE
表:数据库存储数据得基本单位,表由若干个字列组成
,主要用来存储数据记录
字段:字段名。字段类型(长度),字段约束组成(可选)
类型:字符。数字,日期
约束:不能为空,自动增长
DDL
定义库:
创建数据库:CREATE DATABASE 数据库名;
例如:CERATE DATABASE discuz;
查看所有数据库:show databases ;
选择/进入数据库: use discuz
select database();
删除数据库:drop discuz ;
系统中得位置
/var/lib/mysql
数据类型
数值类型:整数型int
浮点数类型float 小数
字符串类型:
CHAR系列 CHAR VARCHAR
TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT
BLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB
BINARY系列 BINARY VARBINARY
枚举类型: ENUM
集合类型: SET
时间和日期类型:DATE TIME DATETIME TIMESTAMP YEAR
例1:
创建表 表名t1 (列名id,类型int)
mysql> create table t1(id int);
查看表结构
desc t1;
查询表
show tables;
插入数据:
inster into t1 vlaues (1);
删除表
drop table t1;
向表中插入内容
语法:
inster into 表明(字段1,字段2) values(字段值列表);
例:
表school.student2
字段名 数据类型
编号 id int
姓名 name varchar(50)
出生年份 born_year year
生日 birthday date
上课时间 class_time time
注册时间 reg_time datetime
创建表
create table student2(id int,name varchar(50),born_year year,birthday date,class_time time,reg_time datetime );
插入数据
insert into student2 values(2,'jack',1982,19821120,123000,20140415162545);
表完整性约束
作用:用于保证数据的完整性和一致性
约束条件 说明
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
说明:
- 是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值
- 字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值
sex enum(‘male’,‘female’) not null default ‘male’
age int unsigned NOT NULL default 20 必须为正值(无符号) 不允许为空 默认是20 - 是否是key
主键 primary key
外键 forengn key
索引 (index,unique…)
修改表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 旧字段名 新字段名 新数据类型 [完整性约束条件…];
MySQL单表查询 SELECT
例子
表company.employee5
雇员编号 id int
雇员姓名 name varchar(30)
雇员性别 sex enum
雇用时期 hire_date date
职位 post varchar(50)
职位描述 job_description varchar(100)
薪水 salary double(15,2)
办公室 office int
部门编号 dep_id int
创建表
插入数据
简单查询
查询全部数据
SELECT * FROM employee5;
查询名字、薪水、部门
SELECT name, salary, dep_id FROM employee5;
通过四则运算查询
查询每个人得年薪
SELECT name, salary, salary*14 FROM employee5;
定义显示格式
CONCAT() 函数用于连接字符串
SELECT CONCAT(name, ' annual salary: ', salary*14) AS Annual_salary FROM employee5;
单条件查询
查询职位是HR得人
SELECT name,post FROM employee5 WHERE post='hr';
多条件查询 AND
查询职位是HR得且薪水大于600得
SELECT name,salary FROM employee5 WHERE post='hr' AND salary>600;
关键字BETWEEN AND
查询薪水在5000到15000之间得人
SELECT name,salary FROM employee5 WHERE salary BETWEEN 5000 AND 15000;
不在5000至15000得人
SELECT name,salary FROM employee5 WHERE salary NOT BETWEEN 5000 AND 15000;
关键字IS NULL
查询职位描述是空得人
SELECT name,job_description FROM employee5 WHERE job_description IS NULL;
查询职位描述不是空得人
SELECT name,job_description FROM employee5 WHERE job_description IS NOT NULL;
关键字IN集合查询
查询薪水等于4000或5000或6000或9000得人
SELECT name, salary FROM employee5 WHERE salary=4000 OR salary=5000 OR salary=6000 OR salary=9000 ;
查询薪水等于4000或5000或6000或9000得人
SELECT name, salary FROM employee5 WHERE salary IN (4000,5000,6000,9000) ;
查询薪水不等于4000或5000或6000或9000得人
SELECT name, salary FROM employee5 WHERE salary not IN (4000,5000,6000,9000) ;
关键字LIKE模糊查询
通配符’%’
查询名字以al开头得人
SELECT * FROM employee5 WHERE name LIKE 'al%';
查询排序
按单列排序
按照薪水排列
SELECT * FROM employee5 ORDER BY salary;
按照薪水正序排列
SELECT name, salary FROM employee5 ORDER BY salary ASC;
按照薪水倒叙排列
SELECT name, salary FROM employee5 ORDER BY salary DESC;
按多列排序
先按入职时间,再按薪水排序
SELECT * FROM employee5 ORDER BY hire_date DESC, salary DESC;
使用集合函数查询
统计所有
SELECT COUNT(*) FROM employee5;
统计所有部门为101得
SELECT COUNT(*) FROM employee5 WHERE dep_id=101;
薪水最多得
SELECT MAX(salary) FROM employee5;
薪水最少得
SELECT MIN(salary) FROM employee5;
所有人薪水得平均数
SELECT AVG(salary) FROM employee5;
所有人薪水得和
SELECT SUM(salary) FROM employee5;
101部门人得薪水得和
SELECT SUM(salary) FROM employee5 WHERE dep_id=101;
分组查询
GROUP BY和GROUP_CONCAT()函数一起使用
按照部门代码进行分组
SELECT dep_id,GROUP_CONCAT(name) FROM employee5 GROUP BY dep_id;