SQL语言基础

什么是SQL

SQL是Structured Quevy Language(结构化查询语言)的缩写。 ​ SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。 ​ 在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。


sql功能分类

DDL:数据定义语言(结构)Definition ​ 用来定义数据库对象:创建库,表,列等。

DML:数据操作语言(Manipulation) ​ 用来操作数据库表中的记录

DQL:数据查询语言(Querry) ​ 用来查询数据

DCL:数据控制语言(control) ​ 用来定义访问权限和安全级别


SQL数据类型

char 类型 char(10)"abc " ,七个是空格

int(11) 括号里面是补多少个零

MySQL中定义数据字段的类型对你数据库的优化是非常重要的。

MySQL支持所有标准SQL数值数据类型。

MySQL支持多种类型,大致可以分为三类 ​ 数值类型

image

字符串类型

image

日期和时间类型

image

常用数据类型

double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;

char:固定长度字符串类型; char(10) 'abc '

varchar:可变长度字符串类型;varchar(10) 'abc'

text:字符串类型;

blob:二进制类型;

date:日期类型,格式为:yyyy-MM-dd;

time:时间类型,格式为:hh:mm:ss

datetime:日期时间类型 yyyy-MM-dd hh:mm:ss

在mysql中,字符串类型和日期类型都要用单引号括起来。'Myxq' '2020-01-01'


DDL

创建数据库

create database 数据库名 character set utf8;

修改数据库

alter database 数据库名 charactor set gbk;

创建学生表

image

image

添加一列

ALTER TABLE 表名 ADD 列名 数据类型;

查看表的字段信息

DESC 表名;

修改一个表的字段类型

ALTER TABLE 表名 MODIFY 字段名 数据类型;

删除一列

ALTER TABLE 表名 DROP 字段名;

修改表名

RENAME TABLE 原始表名 TO 要修改的表名;

查看表的创建细节

SHOW CREATE TABLE 表名;

修改表的字符集为gbk

ALTER TABLE 表名 CHARACTER SET 字符集名称;

修改表的列名

ALTER TABLE 表名 CHANGE 原始列名 新列名 数据类型;

删除表

DROP TABLE 表名;


DML

查询表中的所有数据

SELECT * FROM 表名;

DML是对表中的数据进行增、删、改的操作

插入操作

INSERT INTO 表名(列名1,列名2 ...)VALUE (列值1,列值2...);

注意事项 ​ 列名与列值的类型、个数、顺序要一一对应。 ​ 值不要超出列定义的长度。 ​ 插入的日期和字符一样,都使用引号括起来。

批量插入 ​ INSERT INTO 表名(列名1,列名2 ...)VALUES (列值1,列值2...),(列值1,列值2...);

更新操作

UPDATE 表名 SET 列名1=列值1,列名2=列值2 。。。 WHERE 列名=值

把所有学生的分数改为90 ​ update students set score=90

把姓名为zs的学生分数改为60 ​ update student set score=60 where name='zs';

把姓名为李四的年龄改为20和分数改为70 ​ update student set age=20,score=70 where name='ls';

把wc的年龄在原来基础上加1岁 ​ update students set age=age+1 where name='wc';

修改数据库密码 ​ use mysql; ​ update user set password=password('abc') WHERE User='root'; ​ update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost'; ​ flush privileges;刷新MySQL的系统权限相关表重要

mysqladmin -u root -p password 123456

删除操作

DELETE FROM 表名 【WHERE 列名=值】 ​ TRUNCATE TABLE 表名;

DELETED 与TRUNCATE的区别 ​ DELETE 删除表中的数据,表结构还在;删除后的数据可以找回 ​ TRUNCATE 删除是把表直接DROP掉,然后再创建一个同样的新表。 ​ 删除的数据不能找回。执行速度比DELETE快。


DQL

查询所有列

SELECT * FROM 表名;

结果集

数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。

结果集 ​ 通过查询语句查询出来的数据以表的形式展示我们称这个表为虚拟结果集。存放在内存中。 ​ 查询返回的结果集是一张虚拟表。

查询指定列的数据

SELECT 列名1,列表2... FROM 表名;

条件查询

条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用一些运算符及关键字:

条件查询运行符及关键字 ​ =(等于)、!=(不等于)、<>(不等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于); ​ BETWEEN…AND;值在什么范围 ​ IN(set);固定的范围值 ​ IS NULL;(为空) IS NOT NULL(不为空) ​ AND;与 ​ OR;或 ​ NOT; 非

使用

查询性别为男,并且年龄为20的学生记录 ​ SELECT * FROM students WHERE gender='男' AND age=20;

查询学号为1001 或者 名为zs的记录** ​ SELECT * FROM students WHERE id ='1001' OR name='zs';

查询学号为1001,1002,1003的记录 ​ SELECT * FROM students WHERE id='1001' OR id='1002' OR 1001='1003'; ​ SELECT * FROM students WHERE id IN('1001','1002','1003'); ​ SELECT * FROM students WHERE id NOT IN ('1001','1002','1003');

查询年龄为null的记录 ​ SELECT * FROM students WHERE age IS NULL;

查询年龄在18到20之间的学生记录 ​ SELECT * FROM students WHERE age>=18 AND age<=20; ​ SELECT * FROM students WHERE age BETWEEN 18 AND 20;

查询性别非男的学生记录 ​ SELECT * FROM students WHERE gender !='男';

查询姓名不为null的学生记录 ​ SELECT * FROM students WHERE name IS NOT NULL;

模糊查询

根据指定的关键进行查询

使用LIKE关键字后跟通配符

通配符

_ :任意一个字符 ​ %:任意0~n个字符

使用

查询姓名由5个字母构成的学生记录 ​ SELECT * FROM students WHERE name LIKE '_';

模糊查询必须使用LIKE关键字。其中 “”匹配任意一个字母,5个“”表示5个任意字母。**

查询姓名由5个字母构成,并且第5个字母为“s”的学生记录 ​ SELECT * FROM students WHERE name LIKE 's';

查询姓名以“m”开头的学生记录 ​ SELECT * FROM students WHERE name LIKE 'm%';

其中“%”匹配0~n个任何字母。

查询姓名中第2个字母为“u”的学生记录 ​ SELECT * FROM students WHERE name LIKE '_u%';

查询姓名中包含“s”字母的学生记录 ​ SELECT * FROM stu WHERE name LIKE '%s%';

字段控制查询

去除重复记录

SELECT DISTINCT name FROM students;

把查询字段的结果进行运算,必须都要是数据型

SELECT *,字段1+字段2 FROM 表名; ​ 列有很多记录的值为NULL, ​ 因为任何东西与NULL相加结果还是NULL,所以结算结果可能会出现NULL。

下面使用了把NULL转换成数值0的函数IFNULL: ​ SELECT *,age+IFNULL(score,0) FROM students;

对查询结果起别名 ​ 在上面查询中出现列名为sx+IFNULL(yw,0),这很不美观,现在我们给这一列给出一个别名,为total: ​ SELECT *, yw+IFNULL(sx,0) AS total FROM score; ​ 省略 AS SELECT *, yw+IFNULL(sx,0) total FROM score;

排序

创建表

CREATE TABLE employee ( id int(11) NOT NULL, name varchar(50) DEFAULT NULL, gender varchar(1) DEFAULT NULL,hire_date date DEFAULT NULL,salary decimal(10,0) DEFAULT NULL,performance double(255,0) DEFAULT NULL,manage double(255,0) DEFAULT NULL, department varchar(255) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO employee VALUES (1001, '张三', '男', '1991-7-25', 2000, 200, 500, '营销部'); INSERT INTO employee VALUES (1002, '李四', '男', '2017-7-5', 4000, 500, NULL, '营销部'); INSERT INTO employee VALUES (1003, '王五', '女', '2018-5-1', 6000, 100, 5000, '研发部'); INSERT INTO employee VALUES (1004, '赵六', '男', '1991-6-1', 1000, 3000, 4000, '财务部'); INSERT INTO employee VALUES (1005, '孙七', '女', '2018-3-23', 8000, 1000, NULL, '研发部'); INSERT INTO employee VALUES (1006, '周八', '男', '2010-9-8', 5000, 500, 1000, '人事部'); INSERT INTO employee VALUES (1007, '吴九', '女', '2017-7-5', 8000, 601, NULL, '研发部'); INSERT INTO employee VALUES (1008, '郑十', '女', '2014-4-6', 4000, 1801, NULL, '人事部');

对查询的结果进行排序

使用关键字ORDER BY

排序类型

升序ASC ​ 从小到大 默认

降序DESC ​ 从大到小

使用

对所有员工的薪水进行排序 ​ SELECT *FROM employee ORDER BY age ASC;

查询所有学生记录,按年龄降序排序 ​ SELECT * FROM employee ORDER BY age DESC;

查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序 ​ SELECT * FROM employee ORDER BY salary DESC, id ASC;

聚合函数

对查询的结果进行统计计算

常用聚合函数

COUNT():统计指定列不为NULL的记录行数; ​ MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算; ​ MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算; ​ SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0; ​ AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

使用

COUNT查询employee表中记录数: ​ SELECT COUNT() AS total_record FROM employee;

查询员工表中有绩效的人数 ​ SELECT COUNT(performance) FROM employee;

查询员工表中月薪大于2500的人数: ​ SELECT COUNT() FROM employee WHERE salary > 2500;

统计月薪与绩效之和大于5000元的人数: ​ SELECT COUNT(*) FROM employee WHERE salary+IFNULL(performance,0) > 5000;

查询有绩效的人数,和有管理费的人数: ​ SELECT COUNT(performance), COUNT(manage) FROM employee;

SUM和AVG查询所有雇员月薪和: ​ SELECT SUM(salary) FROM employee;

查询所有雇员月薪和,以及所有雇员绩效和 ​ SELECT SUM(salary), SUM(performance) FROM employee;

查询所有雇员月薪+绩效和: ​ SELECT SUM(salary+IFNULL(performance,0)) FROM employee;

统计所有员工平均工资: ​ SELECT AVG(salary) FROM employee;

MAX和MIN查询最高工资和最低工资: ​ SELECT MAX(salary), MIN(salary) FROM employee;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335

推荐阅读更多精彩内容