MySQL语句,需要知道一下~
总结的一些MySQL语句,仅供参考
创建数据库
create database mydb1;
create database if not exists mydb2 character set GBK; #(不为空,字符集)
create database mydb3 character set GBK collate gbk_chinese_ci;#(字符集,级别)
查看所有数据库
show databases;
查看前面创建的mydb2数据库的定义信息
show create database mydb2;
修改字符集
alter database mydb2 character set utf8;
删除数据库
drop database if exists mydb3;
查看当前使用的数据库
Select database(); #没有选择数据 null
切换使用数据库
USE mydb2;
退出数据库
quit;或exit;
SQL分类
1.DDL,数据定义语言
create:创建,alter:修改,drop:删除,rename:重命名,truncate:清空
删除现有表
drop table table_name;
修改表名为user
rename table student to user;
展示数据库中的所有表
show table;
查看表的字段信息
desc student;
查看表的创建细节
show create table user
修改表的字符集为gbk
alter table user character set gbk;
现表中增加一列
alter table student add image blob;
删除一列,一次只能删一列。
alter table student drop image;
修改列字段的长度
alter table student modify address varchar(60);
列名name修改为username
alter table user change name username varchar(100);
truncate删除
truncate table emp;#删除表,然后创建一个空表
delete #删除表中的数据,表结构还在;删除后的数据使用日志可以找回。
truncate #删除是把表直接DROP掉,然后再创建一个同样的新表。
truncate #删除的数据不能找回。执行速度比DELETE快。
2.DML,数据操作语言
insert:添加,delete:删除,update:修改,select:查询
插入操作insert
一次添加一条数据
INSERT INTO student(id,name,age,address) values (1,'xiaoliu',20,'山西太原');
INSERT INTO student(id,name,age,address) values (2,'xaioqiang',22,'陕西西安');
INSERT INTO student(id,name,age,address) values (3,'xiaohu',23,'湖北武汉');
一次添加多条数据
INSERT INTO student(id,name,age,address) values (1,'xiaoliu',20,'山西太原'),
(2,'xaioqiang',22,'陕西西安'),
(3,'xiaohu',23,'湖北武汉');
小知识
#查看数据库编码的具体信息
Show variables like ‘character%’;
#临时更改客户端和服务器结果集的编码
Set character_set_client=gbk;
Set character_set_results=gbk;
#或者
SET NAMES ‘gbk’; // client connection results
3.修改操作 · UPDATE:
update user set name="xaioqi",age=12,gender='男' where id=2;
将所有学生的年龄修改为25。
update student set age=25;
将id为’1’的地址修改为“河北保定”。
update student SET address='河北保定' WHERE id=1;
将所有学生的年龄加5岁。
update student SET age=age+5;
删除操作 · DELETE:
delete from user where id=2;
删除表中姓名为’zhangsan’的记录。
delete from student where name=‘zhangsan’;
删除表中所有记录。
delete from emp;
3.DCL,数据控制语言
commit:提交,rollback:回滚,savepoint:事物
(单独)DQL,数据查询语言
—— SELECT 列名 FROM 表名 【WHERE --> GROUP BY-->HAVING--> ORDER BY-->LIMIT】
查询所有列 *表示所有列
select * from stu;
查询指定列
select id,name,age from stu;
查询性别为女,并且年龄小于50的记录 ,用and;
select * from stu where gender='female' and age<50;
查询学号为S_1001,或者姓名为liSi的记录 ,用or;
SELECT * FROM stu WHERE sid =1 OR sname='liSi';
查询学号为S _ 1001 ,S _ 1002,S _ 1003的记录 ,用in或者or
SELECT * FROM stu WHERE sid in ('S_1001','S_1002','S_1003');
#等同于
SELECT * FROM stu WHERE sid='S_1001' or sid='S_1002' or sid='S_1003';
查询学号不是S_1001,S_1002,S_1003的记录 ,用not in
SELECT * FROM student WHERE sid NOT IN('S1001','S1002','S_1003');
查询年龄为null的记录 ,is null
SELECT * FROM stu WHERE age IS NULL;
查询年龄在20到40之间的学生记录 ,用>=,<=,或者between
SELECT * FROM stu WHERE age>=20 AND age<=40;
#或者
SELECT * FROM stu WHERE age between 20 AND 40;
查询性别非男的学生记录 ,用!=,<>,not
SELECT * FROM stu WHERE gender!='male';
#或者
SELECT * FROM stu WHERE gender<>'male';
#或者
SELECT * FROM stu WHERE NOT gender='male';
查询姓名不为null的学生记录 用is null
SELECT * FROM stu WHERE NOT sname IS NULL;
模糊
查询姓名由3个字符构成的学生记录,用"_",任意一个字符
SELECT * FROM stu WHERE sname LIKE '___';
查询姓名由5个字符构成,并且第5个字符为“i”的学生记录,用"_i"
SELECT * FROM stu WHERE sname LIKE '____i';
查询姓名以“z”开头的学生记录 ,用"z%",其中“%”匹配0~n个任何字符。
SELECT * FROM stu WHERE sname LIKE 'z%';
查询姓名中第2个字符为“i”的学生记录 ,用"_i%"
SELECT * FROM stu WHERE sname LIKE '_i%';
查询姓名中包含“a”字符的学生记录,用"%a%"
SELECT * FROM stu WHERE sname LIKE '%a%';
字段控制
去除重复记录,用distinct
select distinct sal FROM emp;
select distinct sal,comm FROM emp;
查看雇员的月薪与佣金之和 ,字符串相加concat
SELECT *,sal+comm FROM emp;
#字符串的合并不能使用+ ,使用concat(ename,'____',job);
select *,concat(ename,'______',job) from emp;
与null相加为null,将null转化成数值0的函数ifnull
select *,money+IFNULL(salary,0) from emp;
给列名添加别名 用as
select *,money+IFNULL(salary,0) as total from emp;
#可以不写,省略as
select *,money+IFNULL(salary,0) total from emp;
排序
查询所有学生记录,按年龄升序排序,用order by,asc
select * from stu ORDER BY age ASC;#asc升序
#或者
select * from stu ORDER BY age;
查询所有学生记录,按年龄降序排序 ,用order by,desc
select * from stu ORDER BY age desc;#desc降序
查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序用order by,desc,asc
SELECT * FROM emp ORDER BY sal DESC,empno ASC;
聚合函数
聚合函数是用来做纵向运算的函数:
l COUNT():统计指定列不为NULL的记录行数;
l MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
l MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
l SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
l AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
查询emp表中记录数:用count()总数
SELECT COUNT(*) AS ‘cnt’ FROM emp;
查询emp表中有佣金的人数:
SELECT COUNT(name) ‘cnt’ FROM emp;
#因为count()函数中给出的是comm列,那么只统计comm列非NULL的行数。
查询emp表中月薪大于2500的人数:
SELECT COUNT(*) FROM emp WHERE sal > 2500;
统计月薪与佣金之和大于2500元的人数:
SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;
查询有佣金的人数,以及有领导的人数:
SELECT COUNT(comm), COUNT(mgr)FROM emp;
查询所有雇员月薪和:用sum()相加
SELECT SUM(sal) FROM emp;
查询所有雇员月薪和,以及所有雇员佣金和:
SELECT SUM(sal), SUM(comm) FROM emp;
查询所有雇员月薪+佣金和:
SELECT SUM(sal+IFNULL(comm,0))FROM emp;
统计所有员工平均工资:用avg()平均
SELECT AVG(sal) FROM emp;
查询最高工资和最低工资:用max()最大,min()最小
SELECT MAX(sal), MIN(sal) FROM emp;
查询每个部门的部门编号和每个部门的工资和:用group by分组
SELECT deptno, SUM(sal) FROM emp GROUP BY deptno;
查询每个部门的部门编号以及每个部门的人数:
SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;
查询每个部门的部门编号以及每个部门工资大于1500的人数:
SELECT deptno,COUNT(*) FROM emp WHERE sal>1500 GROUP BY deptno;
查询工资总和大于9000的部门编号以及工资和:用having子句
SELECT deptno, SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal) > 9000;
注:having与where的区别:
1.having是在分组后对数据进行过滤,where是在分组前对数据进行过滤
2.having后面可以使用分组函数(统计函数),where后面不可以使用分组函数。
查询前5行记录,起始行从0开始 用limit限制
SELECT * FROM emp LIMIT 0, 5;
日期函数
- 下一个星期 用next_day
select sysdate "当前日期",next_day(sysday,'星期一') 下周星期一 from emp;
- 最后一天 用next_day
--所在月份的最后一天
select ename , birthdate,last_day(birthdate) from emp;
- 最近日子 round
select sysdate 当时日期,
round(sysdate) 最近0点日期,
round(sysdate,'day') 最近星期日,
round(sysdate,'mouth') 最近月初,
round(sysdate,'q') 最近季初日期,
round(sysdate,'year') 最近年初日期
from numTable;
- 返回当前日期,只包含年月日
CURDATE(),CURRENT_DATE()
- 返回当前时间,只包含时分秒
CURTIME(),CURRENT_TIME()```
- 返回当前系统日期和时间
NOW()/SYSDATE()/CURRENT_TIMESTAMP()/LOCALTIME()/LOCALTIMESTAMP()
- 返回UTC(世界标准时间)日期
UTC_DATE()
- 返回UTC(世界标准时间)时间
UTC_TIME()
- 时间和时间戳的转换
SELECT UNIX_TIMESTAMP(‘2021-10-01 12:12:32’),FROM_UNIXTIME(1635173853) FORM DUAL;
- YEAR()返回年,MONTH()返回月,DAY()返回日,HOUR()返回时,MINUTE()返回分,SECOND()返回秒
- 返回月份,July
MONTHNAME(DATE)
- 返回星期几:MONDAY
DAYNAME(DATE)
- 返回周几:注意周1是0
WEEKDAY(DATE)
- 返回日期对应的季度,范围为1~4
QUARTER(date)
- 返回一年中的第几周
WEEK(DATE),WEEKOFYEAR(DATE)
- 返回日期是一年中的第几天
DAYOFYEAR(DATE)
- 返回日期位于所在月份的第几天
DAYOFMONTH(DATE)
- 返回time1减去time2的时间,当time2为数字时,代表为秒,可以为负数
SUBTIME(time1,time2)
- 返回date1-date2的日期间隔天数
DATEDIFF(date1-date2)
- 返回time1-time2的时间间隔
TIMEDIFF(time,time2)
- 返回0000年1月1日起,n天以后的日期
FROM_DAYS(N)
- 返回日期date距离0000年1月1日的天数
TO_DAY(date)
- 返回date所在月份的最后一天的日期
LAST_DAY (date)
- 将给定的小时、分钟和秒组合成时间并返回
MARKTIME(hour,minute,second)
- 返回time加上n后的时间
PERIOD_ADD(TIME,N)
总结
查询语句书写顺序:select 列 from 表 【where- group by- having- order by-limit】
查询语句执行顺序:from 表 where --> group by --> having --> select --> order by --> limit
主键约束
添加主键,primary key,添加方式
CREATE TABLE student(
id int primary key,
name varchar(50)
);
#或者
CREATE TABLE student(
id int,
name varchar(50),
primary key(id)
#此种方式优势在于,可以创建联合主键
);
CREATE TABLE student(
classid int,
stuid int,
name varchar(50),
primary key(classid,stuid)
);
#或者
CREATE TABLE student(
id int,
name varchar(50)
);
ALTER TABLE student ADD PRIMARY KEY (id);#不推荐
唯一约束
数据不可以重复,用unique,可以为null
CREATE TABLE student(
Id int primary key,
Name varchar(50) unique
);
自动增长,用auto_increment自增
CREATE TABLE student(
Id int primary key auto_increment,
Name varchar(50)
) auto_increment=100;
INSERT INTO student(name) values(‘tom’);
not null 非空
CREATE TABLE student(
Id int primary key,
Name varchar(50) not null,
Sex varchar(10)
);
insert into student values(1,’tom’,null);
default默认值
CREATE TABLE student(
Id int primary key,
Name varchar(50) not null,
Sex varchar(10) default '男'
);
insert intostudent1 values(1,'tom','女');
insert intostudent1 values(2,'jerry',default);
外键约束
外键约束:**FOREIGN KEY(foreign key) **
#学生表(主表)
CREATE TABLE student(
sid int primary key,
name varchar(50) not null,
sex varchar(10) default '男'
);
#成绩表(从表)
create table score(
id int, score int,
sid int ,
constraint fk_score_sid foreign key(sid) references student(sid)
);
-- 外键列的数据类型一定要与主键的类型一致.references参考,constraint约束
#或者
ALTER TABLE score ADD constraint fk_stu_score FOREIGN KEY(sid) references student(sid);
多表查询
l UNION:去除重复记录,例如:SELECT* FROM table1 UNION SELECT * FROM table2;
l UNION ALL:不去除重复记录,例如:SELECT * FROM table1 UNION ALL SELECT * FROM table2。
select * from table1,table2;
联表
SELECT table1.ename,table1.sal,table1.comm,user.dname FROM table1,user WHERE table1.deptno=user.deptno;
内连接
SELECT * FROM school s INNER JOIN class c ON s.deptno=c.deptno;
#注意:on后面 主外键关系
外连接
a.左外连接:以左表为主表,右表是从表
SELECT * FROM school s LEFT OUTER JOIN class c ON s.deptno=c.deptno;
左连接是先查询出左表(即以左表为主),然后查询右表,左表中满足条件和不满足条件都显示出来,
右边不满足条件的显示NULL。
**右外连接 **
SELECT * FROM school s RIGHT OUTER JOIN class c ON s.deptno=c.deptno;
右连接就是先把右表中所有记录都查询出来,然后左表满足条件的显示,不满足显示NULL。例如在dept
表中的某部门并不存在员工,但在右连接中,如果dept表为右表,那么还是会查出某部门,但相应的员
工信息为NULL。
子查询
子查询结果集的常见形式:
a. 单行单列(用于条件)
b. 多行单列(用于条件)
c. 多行多列(用于表)
示例
1.工资高于JONES的员工。
查询条件:工资>JONES工资,其中JONES工资需要一条子查询。
第一步:查询JONES的工资
第二步:查询高于JONES工资的员工
结果:
SELECT sal FROM emp WHERE ename='JONES';
SELECT * FROM emp WHERE sal > (第一步结果);
结果:
SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename='JONES');
2.查询与SCOTT同一个部门的员工。
子查询作为条件
子查询形式为单行单列
查询条件:部门=SCOTT的部门编号,其中SCOTT 的部门编号需要一条子查询。
第一步:查询SCOTT的部门编号
SELECT deptno FROM emp WHERE ename='SCOTT';
第二步:查询部门编号等于SCOTT的部门编号的员工
SELECT * FROM emp WHERE deptno = (SELECT deptno FROM emp WHERE ename='SCOTT');
3. 工资高于30号部门所有人的员工信息
分析:
SELECT * FROMemp WHERE sal>(SELECT MAX(sal)FROM emp WHERE deptno=30);
查询条件:工资高于30部门所有人工资,其中30部门所有人工资是子查询。高于所有需要使用all关键
字。
第一步:查询30部门所有人工资
SELECT sal FROM emp WHERE deptno=30;
第二步:查询高于30部门所有人工资的员工信息
SELECT * FROM emp WHERE sal > ALL (第一步)
结果:
SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno=30)
l 子查询作为条件
l 子查询形式为多行单列(当子查询结果集形式为多行单列时可以使用ALL或ANY关键字)
导出导入数据库
导出数据库表
mysqldump -u root -p 数据库名 > school.sql
导入数据库表
mysql -u root -p
mysql>use 数据库 #然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
mysql>source d:/dbname.sql
创建用户和授权
创建用户
CREATE USER `zhangsan` IDENTIFIED BY '123';
CREATE USER `zhangsan`@`localhost` IDENTIFIED BY '123';
CREATE USER `zhangsan`@`%` IDENTIFIED BY '123';
授权
GRANT ALL ON school.* TO `zhangsan`;
撤销权限
DROP USER `zhangsan`;
于30部门所有人工资的员工信息
SELECT * FROM emp WHERE sal > ALL (第一步)
结果:
SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno=30)
l 子查询作为条件
l 子查询形式为多行单列(当子查询结果集形式为多行单列时可以使用ALL或ANY关键字)
导出导入数据库
导出数据库表
mysqldump -u root -p 数据库名 > school.sql
导入数据库表
mysql -u root -p
mysql>use #数据库 然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
mysql>source d:/dbname.sql
创建用户和授权
创建用户
CREATE USER `zhangsan` IDENTIFIED BY '123';
CREATE USER `zhangsan`@`localhost` IDENTIFIED BY '123';
CREATE USER `zhangsan`@`%` IDENTIFIED BY '123';
授权
GRANT ALL ON school.* TO `zhangsan`;
撤销权限
DROP USER `zhangsan`;