欢迎光临散文网 会员登陆 & 注册

MySQL的常见SQL语句

2020-10-08 02:33 作者:开源开发者  | 我要投稿

DDL 数据库定义语言


查看当前数据库

SELECT DATABASE();


退出数据库

QUIT[;]


显示数据库列表

SHOW DATABASES;

SHOW SCHEMAS;


显示数据库版本

SELECT VERSION();


当前登录数据库的用户

SELECT USER();


显示当前时间

SELECT NOW();


数据库帮助

HELP CREATE DATABASE

? CREATE

\H CREATE


取消执行SQL

SELECT USER()\c


创建数据库

CREATE DATABASE test1;

CREATE SCHEMA test1;


转义反引号关键字

CREATE DATABASE `database`;



创建检查数据库是否存在

CREATE DATABASE IF NOT EXISTS test1;


查看警告

SHOW WARNINGS;


创建数据库指定编码

CREATE DATABASE test IF NOT EXISTS DEFAULTER CHARACTER SET = 'UTF8';


查看创建的编码方式

SHOW CREATE DATABASE test;


查看表

SHOW TABLES;


SHOW FULL TABLES FROM mysql;


查看键表信息

SHOW CREATE TABLE imooc_user;


查看表结构

DESC test;

DESCRIBE test;

SHOW COLUMNS FROM test;


打开数据库

USE test;


ALTER

改变编码方式

ALTER DATABASE test DEFAULTER CHARACTER SET = 'UTF8';


添加字段

ALTER TABLE user1 ADD username VARCHAR(20);


添加字段在某个字段的后面

ALTER TABLE user 

ADD email VARCHAR(50) NOT NULL UNIQUE KEY AFTER username;


添加字段在首位

ALTER TABLE user1

ADD test TINYINT(1) NOT NULL DEFAULT 0 FIRST;


删除字段

ALTER TABLE user1

 DROP test;


添加删除组合使用

ALTER TABLE user1

 ADD age TINYINT UNSIGNED NOT NULL DEFAULT 18,

 ADD addr VARCHAR(100) NOT NULL DEFAULT '北京',

 DROP email;



存在基础上修改字段添加默认值SET

ALTER TABLE user2 

 ALTER email SET DEFAULT 'imooc@qq.com';


存在基础上修改字段删除默认值

ALTER TABLE user2

 ALTER age DROP DEFAULT;



修改字段名称

 ALTER TABLE user3

 CHANGE username user VARCHAR(20) NOT NULL;




修改字段的类型 NOT NULL要加上

 ALTER TABLE user3

 MODIFY username VARCHAR(20) NOT NULL ;


修改字段的类型 并放在首位

 ALTER  TABLE user3

 MODIFY email VARCHAR(50)  NOT NULL FIRST;


去掉AUTO_INCREMENT

ALTER TABLE user5

 MODIFY id INT UNSIGNED;


添加唯一性索引

 ALTER TABLE user6

 ADD UNIQUE KEY(username);



删除唯一性索引

ALTER TABLE user6

 DROP INDEX username;


添加唯一性索引并指定索引名称

ALTER TABLE user6 ADD UNIQUE INDEX uni_email(email);



添加主键

ALTER TABLE user4

 ADD PRIMARY KEY(id);



修改表名称

ALTER TABLE user6 

 RENAME TO user666;

ALTER TABLE user666

 RENAME AS user6;

RENAME TABLE user6 TO user666;


删除外键

ALTER TABLE news

 DROP FOREIGN KEY cateId_fk_newsCate;



添加外键

 ALTER TABLE news

 ADD CONSTRAINT cateId_fk_newsCate FOREIGN KEY(cateId) 

 REFERENCES news_cate(id); ALTER TABLE news

 ADD CONSTRAINT cateId_fk_newsCate FOREIGN KEY(cateId) 

 REFERENCES news_cate(id);



DROP

删除数据库

DROP DATABASE  IF EXISTS  test;


删除表

DROP TABLE IF EXISTS imooc_user;

注释

#

--




插入数据

INSERT INTO imooc_user()VALUES(); INTO可以省略



INSERT INTO imooc_user(id,username,password,email,age,card,tel,salary,married,addr,sex)

VALUES(1,'king','king','382771946@qq.com',24,'230112197809871234',18635579617,888888.68,0,'北京','男');



function

CONCAT()

SELECT CONCAT('*',a,'*'),CONCAT('*',b,'*') FROM test_str;

NOW()

INSERT test_time(a) VALUES(NOW());

INSERT test_time(a) VALUES(CURRENT_TIME());

当前日期时间

SELECT NOW()

当前时间

SELECT CURRENT_TIME();

当前时间

SELECT CURTIME();


CURRENT_DATE()

INSERT INTO test_date(a) VALUES(CURRENT_DATE());

当前日期

CURRENT_DATE()


CURRENT_TIMEStamP

INSERT test_timestamp(a) VALUES(CURRENT_TIMEStamP);



当前日期和时间

CURRENT_TIMEStamP


进一取整

SELECT CEIL(1.2);


去掉小数

SELECT FLOOR(2.9);


四舍五入 取两位小数

SELECT ROUND(3.567,2);


取小数3位部分

SELECT TRUNCATE(3.456789,3);


取余数

SELECT MOD(5,2);


取绝对值

SELECT ABS(-12);


幂运算

SELECT POWER(2,3);


得到PI

SELECT PI();


随机数0-1之间

SELECT RAND();

定给参数会变成一个标识

比如SELECT RAND(1);



取符号 0为0 -n(取n)>0为-1   +n>0为+1

SELECT SIGN(-23);



e的几次方

SELECT EXP(2);


得到字符长度以占位符来区分

SELECT CHAR_LENGTH('你好啊');



真正字符串长度

SELECT LENGTH('abc');


合并字符串 如果有null最终结果是null

SELECT CONCAT('a','b','c',null);



以指定的分隔符拼接字符串,分隔符是null就是null,其他地方是null没影响

CONCAT_WS('-','A','B','C')

CONCAT_WS('-','A','B','C',null)

CONCAT_WS(null,'A','B','C')


大小写转换 UPPER('hello king') UCASE('hello imooc') LOWER('HELLO ADMIN') LCASE('HELLO EVERYBODY');

SELECT UPPER('hello king'),UCASE('hello imooc'),LOWER('HELLO ADMIN'),LCASE('HELLO EVVERYBODY');


字符串反转函数

SELECT REVERSE('abc');


得到前2个或者后2个字符

SELECT LEFT('hello',2),RIGHT('hello',2);


用字符串填充到指定长度

SELECT LPAD('abc',10,'?');

SELECT RPAD('abc',10,'!');


去掉空格

SELECT CONCAT('*',TRIM(' abc '),'*'),CONCAT('*',LTRIM(' abc '),'*'),CONCAT('*',RTRIM(' abc '),'*');


字符串替换

SELECT REPLACE('hello king','king','queen');


重复字符数

SELECT REPEAT('hello',3);




截取字符串

SELECT SUBSTRING('abcdef',1,3);



比较字符串 相等为0 第一个字符串大于第二个字符串返回是正1  第一个字符串小于第二个字符串返回是-1

SELECT STRCMP('a','a');



返回当前日期

SELECT CURDATE(),CURRENT_DATE();


返回当前时间

SELECT CURTIME(),CURRENT_TIME();


返回当前的日期时间

SELECT NOW(),CURRENT_TIMEStamP(),SYSDATE();


返回日期中的月和月份名称

SELECT MONTH('2017-02-19');

SELECT MONTH(CURDATE()),MONTHNAME(CURDATE());


返回星期几的名称

SELECT DAYNAME(NOW());


返回一周内的第几天

SELECT DAYOFWEEK(NOW());


返回第几个星期了

SELECT WEEK(NOW());


返回年份 月份 号 小时 分钟 秒

SELECT YEAR(NOW()),MONTH(NOW()),DAY(NOW()),HOUR(NOW()),MINUTE(NOW()),SECOND(NOW());


计算两个日期相差的天数

SELECT DATEDIFF('2017-03-06','2017-03-02');



其他常用函数


获得版本

SELECT VERSION();


当前连接数

SELECT CONNECTION_ID();


获得当前的数据库名

SELECT DATABASE(),SCHEMA();



当前登录的用户

SELECT USER(),CURRENT_USER(),SYSTEM_USER(),SESSION_USER();



得到上一次auto_increment的值

SELECT LAST_INSERT_ID();



MD5加密

SELECT MD5('king');


密码加密算法

SELECT PASSWORD('root');


查询root密码

SELECT * FROM mysql.user WHERE user='root';


查看表状态

SHOW TABLE STATUS LIKE 'myisam_1';



设置定长格式

CREATE TABLE myisam_2(

 a VARCHAR(30),

 id INT

 )ENGINE=MYISAM ROW_FORMAT=FIXED;


检查表

CHECK TABLE test_innodb;


修复表

REPAIR TABLE test_innodb;





插入数据省略

INSERT user VALUE(1,'king',24,'382771946@qq.com');

INSERT user VALUES(1,'king',24,'382771946@qq.com');


一次插入多条记录

INSERT user VALUES(NULL,'A',DEFAULT,DEFAULT),

(NULL,'b',56,'b@qq.com'),

(NULL,'c',14,'c@qq.com');


INSERT SET形式

INSERT user SET username='d',age=45,email='d@qq.com';


UPDATE SET

UPDATE user SET username='socialpg',age=18 ,email='qq@com' WHERE id=3;



重置AUTO_INCREMENT

ALTER TABLE user AUTO_INCREMENT=1;


彻底删除数据表

TRUNCATE user;



查询指定库中的表

SELECT * FROM imooc.user1;



字段起别名

SELECT id AS '编号',username AS '用户名' , sex AS '性别'FROM user1;



数据库起别名

SELECT id,username FROM user1 AS u;



表名.字段名

SELECT user1.id,user1.username FROM user1;



<=>检测NULL值

SELECT id,username,age,userDesc FROM user1 

WHERE userDesc <=> NULL;


IS NULL

SELECT id,username,age,userDesc FROM user1 

WHERE userDesc IS NULL ;


IS NOT NULL 取反

SELECT id,username,age,userDesc FROM user1 

WHERE userDesc IS NOT NULL ;




BETWEEN AND

SELECT id,username,age,userDesc FROM user1 

WHERE age BETWEEN 18 AND 30;


NOT BETWEEN AND 

SELECT id,username,age,salary FROM user1

 WHERE salary NOT BETWEEN 18 AND 30; 


IN指定集合范围

SELECT id,username,age FROM user1 WHERE id IN(1,3,5,7,9,29,45,78);


NOT IN 不在指定集合范围

SELECT id,username,age FROM user1 WHERE id NOT IN(1,3,5,7,9,29,45,78);



BETWEEN AND AND AND

SELECT id,username,age,sex,salary addr FROM user1

 WHERE salary BETWEEN 60000 AND 100000 AND sex='男' AND addr='北京';


LIKE 模糊查询 字符串  LIKE不区分大小写的

 SELECT id,username,age FROM user1 WHERE username LIKE 'king';


LIKE %% 任意一个字符

 SELECT id,username,age,sex FROM user1 WHERE username LIKE '%三%';


LIKE ___ 一个字符 限定位数

SELECT id,username,age,sex FROM user1 WHERE username LIKE '___';


GROUP BY hash算法 过滤掉相同的,只保留一条第一次检索出来的数据作为代表,不同的记录成为不同的一个组,多的数据会第一显示出来,这是默认情况下,但可以通过函数显示出这个组中的详细的各个记录的信息,一组查该组的所有记录,会派出一个sex代表出来

SELECT id,username,age,sex FROM user1 GROUP BY sex;



GROUP BY 和 GROUP_CONCAT函数

SELECT GROUP_CONCAT(username),age,sex,addr FROM user1 GROUP  BY sex;


COUNT(*) 统计有多少条记录数 就是每条每条记录

SELECT COUNT(*) AS total_users FROM user1;


COUNT(字段)在统计字段,如果字段值为空就不记录出来

SELECT COUNT(userDesc) FROM user1;



CONUT(*)配合GROUP BY 使用的时候 COUNT(*) 统计的是 GROUP BY 分组中的记录数

SELECT  sex,GROUP_CONCAT(username) AS usersDetail ,COUNT(*) AS toalUsers FROM user1 GROUP BY sex;



GROUP BY 是配合聚合函数使用的 聚合函数受GROUP BY 影响

SELECT addr,

 GROUP_CONCAT(username) AS usersDetail,

 COUNT(*) AS totalUsers,

 SUM(age) AS sum_age,

 MAX(age) AS max_age,

 MIN(age) AS min_age,

 AVG(age) AS avg_age

 FROM user1

 GROUP BY addr;



WITH ROLLUP 会在最后一条记录加上各个分组合和聚合函数统计的结果相加到一起

SELECT GROUP_CONCAT(username) AS usersDetail,COUNT(*) AS totalUsers FROM user1 GROUP BY sex WITH ROLLUP;


POSITION 按照SELECT的顺序字段位置分

SELECT addr,

 GROUP_CONCAT(username) AS usersDetail,

 COUNT(*) AS totalUsers,

 SUM(age) AS sum_age,

 MAX(age) AS max_age,

 MIN(age) AS min_age,

 AVG(age) AS avg_age

 FROM user1

 GROUP BY 1;


Having是二次 是对分组的结果 受分组影响 可以加 聚合函数 select查询的列

SELECT addr,

 GROUP_CONCAT(username) AS userDetail,

 COUNT(*) AS totalUsers

 FROM user1

 GROUP BY addr HAVING COUNT(*);


Having可通过别名

SELECT addr,

 GROUP_CONCAT(username) AS userDetail,

 COUNT(*) AS totalUsers

 FROM user1

 GROUP BY addr HAVING totalUsers

>=3;


ORDER BY DESC 降序 ASC升序

SELECT id,username,age FROM user1 ORDER BY id DESC;


多个ORDER BY,一个ORDER BY 不能满足可通过多个

SELECT id,username,age FROM user1 ORDER BY age ASC,id ASC;


RAND() 返回[0-1) 随机排序

SELECT id,username,age FROM user1 ORDER BY RAND();


LIMIT显示5条记录

SELECT id,username,age,sex FROM user1 LIMIT 5;


LIMIT从指定显示记录

SELECT id,username,age,sex FROM user1 LIMIT 0,5;


 

LIMIT分页实现 从第4条开始显示3条也就是到6条 包括4本身 LIMIT受ORDER BY影响

SELECT id,username,age,sex FROM user1 LIMIT 3,3;



综合练习

SELECT addr,

 GROUP_CONCAT(username) AS usersDetail,

 COUNT(*) AS totalUsers,

 SUM(age) AS sum_age,

 MAX(age) AS min_age,

 AVG(age) AS avg_age

 FROM user1

 WHERE id>=2

 GROUP BY addr 

 HAVING totalUsers>=2

 ORDER BY totalUsers ASC 

 LIMIT 0,1;



笛卡尔积 相等于二层循环 第一个记录数*第二个表记录数

SELECT emp.id,emp.username,emp.age,dep.depName FROM emp,dep;


一对一 内连接 INNER JOIN ON 条件 交集共有

SELECT e.id,e.username,e.age,d.depName FROM  emp AS e INNER JOIN dep AS d on e.depId = d.id;




左连接 LEFT OUTER JOIN 显示左表所有记录 以ON为条件 右边符合的显示 不符合的右表以NULL形式显示

SELECT e.id,e.username,e.age,d.depName,d.depDesc

 FROM emp AS e 

 LEFT OUTER JOIN dep AS d

 ON e.depId=d.id;


右连接 RIGHT OUTER JOIN 显示右表所有记录 以ON为条件 左表符合的显示 不符合的右表以NULL形式显示

SELECT e.id,e.username,e.age,d.depName,d.depDesc FROM  emp AS e RIGHT OUTER JOIN  dep AS d   ON e.depId=d.id;




三表复合多表连查单表关系  缺点性能不好

SELECT p.id,p.productName,p.price,c.cateName,a.username,a.email

 FROM products AS p JOIN admin AS a ON p.adminId = a.id

 JOIN cate AS c ON p.cateId=c.id WHERE p.price<1000

 ORDER BY p.price DESC LIMIT 0,2;

四表

SELECT p.id,p.productName,p.price,c.cateName,a.username,a.email

 FROM products AS p JOIN admin AS a ON p.adminId = a.id

 JOIN cate AS c ON p.cateId=c.id WHERE p.price<1000

 ORDER BY p.price DESC LIMIT 0,2;



级联操作

 ALTER TABLE news

 ADD FOREIGN KEY(cateId) REFERENCES news_cate(id)

 ON DELETE CASCADE ON UPDATE CASCADE;



子查询

IN 在集合中查询

SELECT * FROM emp WHERE id IN (1,2,3,4);


SELECT * FROM emp WHERE depId IN (SELECT id FROM dep);


NOT IN 不在集合中查询


SELECT * FROM emp WHERE depId NOT IN (SELECT id FROM dep);



>= 子查询

SELECT id,username,score FROM stu WHERE score>=

(SELECT score FROM level WHERE id=1);



EXISTS 子查询 true || false

SELECT * FROM emp WHERE EXISTS (SELECT * FROM dep WHERE id=1);



>= any最小值  all最大值


SELECT * FROM stu WHERE score >= ANY(SELECT score FROM level);





= ANY等于任意值 存在ANY中的任意值才返回

SELECT * FROM stu 

WHERE score = ANY(SELECT score FROM level);


!= <> ALL不等于任意值 不存在ALL中的任意值都会返回

SELECT * FROM stu

WHERE score != ALL(SELECT score FROM level);



<= any最大值  all最小值

SELECT * FROM stu

 WHERE score < ALL(SELECT score FROM level);


CREATE根据select创建表 

CREATE TABLE user1(

id TINYINT AUTO_INCREMENT KEY,

    username VARCHAR(20)

)SELECT id,username FROM user;



INSERT根据select创建表

INSERT INTO user1(username) SELECT username FROM user;


INSERT不指定字段直接通过select创建表

INSERT user2 SELECT * FROM user1;


INSERT SET 形式通过子查询插入数据



通过like创建一模一样的表 但是没数据

CREATE TABLE user2 LIKE user1;



DISTINCT去掉重复的列select查询

SELECT DISTINCT(username) FROM user2;



联合查询 UNION 合并重复数据  留下不重复针对多个表的,单个表就不用

SELECT * FROM user1 

UNION SELECT * FROM user2;



UNION ALL 简单的合并 两个表并在一起

SELECT * FROM user1 

UNION ALL SELECT * FROM user2;




自连接 无限极分类 虚拟出两种相同的表,只不过在创建表时的条件不一样 查询所有分类信息,并且得到父类

SELECT  s.id,s.cateName AS sCateName,p.cateName AS pCateName

 FROM cate AS s LEFT JOIN cate AS p ON s.pid=p.id;


自连接 无限极分类 虚拟出两种相同的表,只不过在创建表时的条件不一样 查询所有分类信息及其子分类

 SELECT  p.id,p.cateName AS pCateName,s.cateName AS sCateName

 FROM cate AS s RIGHT JOIN cate AS p ON p.id=s.pid;


自连接 分组 查询所有的分类及其子分类的数目

SELECT  p.id,p.cateName AS pCateName,COUNT(s.cateName) AS count

 FROM cate AS s 

 RIGHT JOIN cate AS p 

 ON p.id=s.pid 

 GROUP BY p.cateName ORDER BY id ASC;



全连接

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name

WHERE Table.id IS NULL OR TableB.id IS NULL


MySQL的常见SQL语句的评论 (共 条)

分享到微博请遵守国家法律