MySQL的SQL操作

SQL分类

DDL语句: 数据定义语言,这些语句定义了不同的数据段,数据库,表,列,索引等数据库对象,常用的语句关键字包括create,drop,alter

DML语句: 数据操纵语句,用于添加,删除,更新和查询数据库记录,检查数据完整性,常用的语句关键字包括insert,delete, update和select等

DCL语句:  数据控制语句, 用于控制吧冉的数据段的许可和访问级别语句,定义了数据库,表,字段,用户的访问权限和安全级别,主要语句有grant,revoke等

DDL数据定义语言,对数据库内部对象进行创建,删除,修改等操作

1. 创建数据库
mysql> create database test1;

如果要操作数据库,需要先选择
mysql>use test1

查看test1数据库中创建所有数据库
mysql>show tables;

删除数据库
mysql> drop database test1;
Query OK, 0 rows affected (0.12 sec)

创建表
在数据库创建表的语法
column_name是列的名字, column_type是列的数据类型,constraints是列的约束条件
create table tablename(column_name_1 column_type_1 constraints,column_name_2 column_type_2 constraints ...column_name_n column_type_n constraints

实例
create table emp(id int(11),ename varchar(10),hirdate date,separated date,job varchar(30),store_id int(11));

查看表的定义
desc tablename
mysql> desc emp;
+-----------+-------------+------+-----+------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+------------+-------+
| id | int(11) | NO | | NULL | |
| ename | varchar(30) | YES | | NULL | |
| hired | date | NO | | 1970-01-01 | |
| separated | date | NO | | 9999-12-31 | |
| job | varchar(30) | NO | | NULL | |
| store_id | int(11) | NO | | NULL | |
+-----------+-------------+------+-----+------------+-------+

====================================================================
查看创建表的语句
mysql> show create table emp\G;
*************************** 1. row ***************************
Table: emp
Create Table: CREATE TABLE `emp` (
`id` int(11) NOT NULL,
`ename` varchar(30) DEFAULT NULL,
`hired` date NOT NULL DEFAULT '1970-01-01',
`separated` date NOT NULL DEFAULT '9999-12-31',
`job` varchar(30) NOT NULL,
`store_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE (store_id)
(PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN (20) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (30) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */

============================================================================================
删除表
mysql>drop table emp;

===============================================

修改表
(1) 修改表类型
alter table tablename modify [column] column_defintion [first | after col_name]

实例:
将emp表的ename字段定义,将varchar(10)改为varchar(20)
mysql> alter table emp modify ename varchar(20);
Query OK, 1 row affected (0.13 sec)

(2) 增加表字段
alter table tablename add [column] colunm_defintion [first | after col_name]
将emp表新增加字段age,类型为int(3)
mysql> alter table emp add column age int(3);

(3) 删除表字段
mysql> alter table emp drop column age;

(4) 字段改名
mysql> alter table emp change age age1 int(4);

(5)修改字段排列顺序
将新增加的字段birth date加在ename后
mysql>alter table emp add birth date after ename
修改字段age,将它放在最前面
mysql>alter table emp modify age int(3) first

(6)更改表明
alter table tablename rename [TO] new_tablename
将表emp改名为emp1
mysql>alter table emp rename emp1

DML
DML操作时对数据库中的表记录操作,包括表记录的插入(insert),更新(update),删除(delete)和查询(select)

插入记录
mysql> insert into emp(id,ename,hired,separated,job,store_id)values('1','tom','1993-01-01','9999-12-32','engineer','1');

可以不执行字段名称,但是values后面的顺序要和字段排列顺序一样
mysql>insert into emp values ('1','tom','1993-01-01','9999-12-32','engineer','1');

在含空字段,非空但是含有默认值的字段,自增字段,可以不用在insert后字段列表出现,values只写对应字段的名称的value,没写的字段可以自动设置为null,默认值,自增的下一个数字,减少SQL语句复杂性
mysql>insert into emp (ename,sal) values ('tom',1000);

更新记录
表中的记录可以通过update命令更改
语法
update tablename set filed=value,filed2=value2.... filedn-valuen[where condition]

实例
将emp表的ename 为tom的hired时间改为1992-10-10
mysql> select * from emp;
+------+--------+------------+------------+----------+----------+------+
| id | ename | hired | separated | job | store_id | age1 |
+------+--------+------------+------------+----------+----------+------+
| 1 | tom | 1993-01-01 | 0000-00-00 | engineer | 1 | NULL |
| 7934 | MILLER | 1982-01-23 | 9999-12-31 | CLERK | 50 | NULL |

mysql> update emp set hired='1992-10-10' where ename='tom';

mysql> select * from emp;
+------+--------+------------+------------+----------+----------+------+
| id | ename | hired | separated | job | store_id | age1 |
+------+--------+------------+------------+----------+----------+------+
| 1 | tom | 1992-10-10 | 0000-00-00 | engineer | 1 | NULL |
| 7934 | MILLER | 1982-01-23 | 9999-12-31 | CLERK | 50 | NULL |


mysql> update emp a set a.hired='1991-10-1' where ename='tom';


=============================================================
删除记录
语法
delete from tablename [where condition]
实例
mysql> delete from emp where ename ='MILLER';

一次删除多个表记录
delete t1,t2...tn from t1.t2...tn [where condition]
实例
同时删除emp表和dept表的deptno等于3的记录
delete a,b from emp a, dept b where a.deptno=b.deptno and a.deptno=3

***不管单表还是多表,不加where条件将会把标的所有记录删除,所以操作一定要小心

====================================================================

查询记录
* 是将所有记录都选出来,可以用逗号分隔所有字段来代替
mysql> select * from emp;
mysql> select ename,hiredate,sal,deptno from emp;

(1)查询不重复记录
select distinct deptno from emp;

(2) 条件查询
select * from emp where deptno=1

where条件时一个字段有=,>、<、<=、!=比较运算符,多个条件还可以用or,and等逻辑运算多条件联合查询
select * from emp where deptno=1 and sal<3000

(3)排序和限制
select * from tablename [where condition] [order by field [desc|asc],filed[desc|asc]...filedn[desc|asc]]
DESC和ASC是排序关键字,DESC表示按字段降序排列,ASC是升序排序

实例
将emp表的记录按照工资高低进行显示
select * from emp order by sal;
对于排序后的记录,如果只希望显示一部分,而不是全部,可以用limit关键字来实现
显示emp表中按照sal排序后的前3条记录
select * from emp order by sal limit 3

(4)聚合
需要做汇总操作,比如统计整个公司的人数或者统计每个部门的人数
having和where区别在于,having是对聚合后的结果进行条件过滤,而where是在聚合前对记录进行过滤
实例
在emp表统计公司总人数
select count(*) from emp;

统计各个部门的人数
select deptno,count(*) from emp group by deptno

统计人数大于1人的部门
select deptno,count(*) from emp group by deptno having count(*)>1

统计公司所有员工的薪水总额,最高和最低薪水
select sum(sal),max(sal),min(sal) from emp


=========================================================================
表连接
内连接和外连接
内连接是选出两张表相互匹配的记录,外连接是选出其他不匹配的记录,常用的是内连接
实例
查询出所有雇员的名字和所在部门名称,因为雇员名称和部门分别存放在表emp和dept中,使用表连接来查询
select ename,deptname from emp,dept where emp.deptno=dept.deptno

外连接:分为左连接和右连接
左连接:包含所有的左边表的记录甚至右边表中没有和它匹配的记录
右连接:包含所有的右边表的记录甚至左边表中没有和它匹配的记录

实例:
select ename,deptname from emp left join dept on emp.deptno=dept.deptno

右连接

 

子查询

查询的时候,需要的条件时另外一个select语句的结果,用到子查询,用于子查询的关键字有in,not in、=,!=,exists,not exists




记录联合
将两个表的数据按照一定的查询条件出来后,将结果合并在一起显示出来,需要用union和union all关键字来实现
union和union all区别是union all把结果集直接合并一起,union是将union all进行一次distinct,去除重复记录
select deptno from emp union all select deptno from dept

将结果去除重复记录
select deptno from emp union select deptno from dept

DCL语句

用于管理系统的中的对象权限时使用

分配select,insert 权限给zhangsan用户,密码设置为123

mysql> grant select,insert on *.* to 'zhangsan'@'localhost' identified by '123';

回收insert 的权限

mysql> revoke insert on *.* from 'zhangsan'@'localhost';

猜你喜欢

转载自www.cnblogs.com/kubernets/p/9012762.html