2023年6月21日发(作者:)
sql数据库⽰例,适合初学者⼀、数据库概述数据库(DataBase,DB):指长期保存在计算机的存储设备上,按照⼀定规则组织起来,可以被各种⽤户或应⽤共享的数据集合。(⽂件系统)数据库管理系统(DataBase Management System,DBMS):指⼀种操作和管理数据库的⼤型软件,⽤于建⽴、使⽤和维护数据库,对数据库进⾏统⼀管理和控制,以保证数据库的安全性和完整性。⽤户通过数据库管理系统访问数据库中的数据。数据库软件应该为数据库管理系统,数据库是通过数据库管理系统创建和操作的。数据库:存储、维护和管理数据的集合。⼆、数据库的安装与配置* 安装* 参照图解* ⼀路下⼀步* 配置* 参照图解* 到选择字符集时停登录Mysql:mysql -u root -p abc* 卸载1.停⽌mysql服务net stop mysql 启动mysql服务net start mysql2.卸载mysql3.找到mysql 安装⽬录下的 datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"* 修改密码运⾏cmd* 安装成功了打开cmd --> mysql -uroot -p你的密码* 修改mysql root⽤户密码1) 停⽌mysql服务运⾏输⼊ 停⽌mysql服务或者cmd --> net stop mysql2) 在cmd下输⼊mysqld--skip-grant-tables 启动服务器光标不动(不要关闭该窗⼝)3) 新打开cmd 输⼊mysql -u root -p 不需要密码use mysql;update user set password=password('abc') WHERE User='root';4) 关闭两个cmd窗⼝在任务管理器结束mysqld 进程5) 在服务管理页⾯重启mysql 服务密码修改完成数据库中⼀⾏记录与对象之间的关系。列:字段⾏:⼀条记录(实体)public class User{private int id;private String name;private int age;}三、sql概述SQL:Structure Query Language。(结构化查询语⾔)SQL被美国国家标准局(ANSI)确定为关系型数据库语⾔的美国标准,后来被国际化标准组织(ISO)采纳为关系数据库语⾔的国际标准。各数据库⼚商都⽀持ISO的SQL标准。普通话各数据库⼚商在标准的基础上做了⾃⼰的扩展。⽅⾔四、Sql的分类DDL**(Data Definition Language):数据定义语⾔,⽤来定义数据库对象:库、表、列等;CREATE、ALTER、DROPDML***(Data Manipulation Language):数据操作语⾔,⽤来定义数据库记录(数据);INSERT、UPDA TE、DELETEDCL(Data Control Language):数据控制语⾔,⽤来定义访问权限和安全级别;DQL*****(Data Query Language):数据查询语⾔,⽤来查询记录(数据)。SELECT* 注意:sql语句以;结尾4.1 DDL:操作数据库、表、列等使⽤的关键字:CREATE、ALTER、DROP* 4.1.1操作数据库创建c reate database mydb1;Create database mydb2 character set gbk;Create database mydb3 character set gbk COLLATE gbk_chinese_ci;查询查看当前数据库服务器中的所有数据库show databases;查看前⾯创建的mydb2数据库的定义信息Show create database mydb2;删除前⾯创建的mydb3数据库Drop database mydb3;修改查看服务器中的数据库,并把mydb2的字符集修改为utf8;alter database mydb2 character set utf8;删除drop database mydb3;* 其他:查看当前使⽤的数据库select database();切换数据库use mydb2;* 4.1.2操作数据表* 语法:create table 表名(字段1 字段类型,字段2 字段类型,...字段n 字段类型);* 常⽤数据类型:int:整型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:sstimestamp:时间戳类型yyyy-MM-dd hh:mm:ss 会⾃动赋值datetime:⽇期时间类型yyyy-MM-dd hh:mm:ss当前数据库中的所有表SHOW TABLES;查看表的字段信息DESC employee;在上⾯员⼯表的基本上增加⼀个image列。ALTER TABLE employee ADD image blob;修改job列,使其长度为60。ALTER TABLE employee MODIFY job varchar(60);删除image列,⼀次只能删⼀列。ALTER TABLE employee DROP image;表名改为user。RENAME TABLE employee TO user;查看表格的创建细节SHOW CREATE TABLE user;修改表的字符集为gbkALTER TABLE user CHARACTER SET gbk;列名name修改为usernameALTER TABLE user CHANGE name username varchar(100);删除表DROP TABLE user ;4.2 DML操作(重要)查询表中的所有数据SELECT * FROM 表名;DML是对表中的数据进⾏增、删、改的操作。不要与DDL混淆了。INSERT 、UPDATE、DELETE⼩知识:在mysql中,字符串类型和⽇期类型都要⽤单引号括起来。'tom' '2015-09-04' 空值:null4.2.1插⼊操作:INSERT:语法:INSERT INTO 表名(列名1,列名2 ...)V ALUES(列值1,列值2...);注意:列名与列值的类型、个数、顺序要⼀⼀对应。可以把列名当做java中的形参,把列值当做实参。值不要超出列定义的长度。如果插⼊空值,请使⽤null插⼊的⽇期和字符⼀样,都使⽤引号括起来。练习:create table emp(id int,name varchar(100),gender varchar(10),birthday date,salary float(10,2),entry_date date,resume text);INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)V ALUES(1,'zhangsan','female','1990-5-10',10000,'2015-5-5-','good girl');INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)V ALUES(2,'lisi','male','1995-5-10',10000,'2015-5-5','good boy');INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)V ALUES(3,'wangwu','male','1995-5-10',10000,'2015-5-5','good boy');批量插⼊:INSERT INTO emp V ALUES(4,'zs','m','2015-09-01',10000,'2015-09-01',NULL),(5,'li','m','2015-09-01',10000,'2015-09-01',NULL),(6,'ww','m','2015-09-01',10000,'2015-09-01',NULL);4.2.2 修改操作UPDATE:语法:UPDATE 表名SET 列名1=列值1,列名2=列值2 。。。WHERE 列名=值练习:将所有员⼯薪⽔修改为5000元。UPDA TE emp SET salary=5000将姓名为’zs’的员⼯薪⽔修改为3000元。UPDA TE emp SET salary=3000 WHERE name=’ zhangsan’;将姓名为’aaa’的员⼯薪⽔修改为4000元,job改为ccc。UPDATE emp SET salary=4000,gender='female' WHERE name='lisi';将wu的薪⽔在原有基础上增加1000元。UPDATE emp SET salary=salary+1000 WHERE gender='male';4.2.3 删除操作DELETE:语法:DELETE FROM 表名【WHERE 列名=值】练习:删除表中名称为’zs’的记录。DELETE FROM emp WHERE name=‘zs’;删除表中所有记录。DELETE FROM emp;使⽤truncate删除表中记录。TRUNCATE TABLE emp;DELETE 删除表中的数据,表结构还在;删除后的数据可以找回TRUNCATE 删除是把表直接DROP掉,然后再创建⼀个同样的新表。删除的数据不能找回。执⾏速度⽐DELETE快。4.3 DQL操作DQL数据查询语⾔(重要)数据库执⾏DQL语句不会对数据进⾏改变,⽽是让数据库发送结果集给客户端。查询返回的结果集是⼀张虚拟表。查询关键字:SELECT语法:SELECT 列名FROM表名【WHERE --> GROUP BY -->HA VING--> ORDER BY】语法:SELECT selection_list /*要查询的列名称*/FROM table_list /*要查询的表名称*/WHERE condition /*⾏条件*/GROUP BY grouping_columns /*对结果分组*/HA VING condition /*分组后的⾏条件*/ORDER BY sorting_columns /*对结果分组*/LIMIT offset_start, row_count /*结果限定*/创建名:学⽣表:stu字段名称字段类型说明sid char(6) 学⽣学号sname varchar(50) 学⽣姓名age int 学⽣年龄gender varchar(50) 学⽣性别CREATE TABLE stu (sid CHAR(6),sname V ARCHAR(50),age INT,gender V ARCHAR(50));INSERT INTO stu V ALUES('S_1001', 'liuYi', 35, 'male');INSERT INTO stu V ALUES('S_1002', 'chenEr', 15, 'female');INSERT INTO stu V ALUES('S_1003', 'zhangSan', 95, 'male');INSERT INTO stu V ALUES('S_1004', 'liSi', 65, 'female');INSERT INTO stu V ALUES('S_1005', 'wangWu', 55, 'male');INSERT INTO stu V ALUES('S_1006', 'zhaoLiu', 75, 'female');INSERT INTO stu V ALUES('S_1007', 'sunQi', 25, 'male');INSERT INTO stu V ALUES('S_1008', 'zhouBa', 45, 'female');INSERT INTO stu V ALUES('S_1009', 'wuJiu', 85, 'male');INSERT INTO stu V ALUES('S_1010', 'zhengShi', 5, 'female');INSERT INTO stu V ALUES('S_1011', 'xxx', NULL, NULL);●雇员表:emp字段名称字段类型说明empno int 员⼯编号ename varchar(50) 员⼯姓名job varchar(50) 员⼯⼯作mgr int 领导编号hiredate date ⼊职⽇期sal decimal(7,2) ⽉薪comm decimal(7,2) 奖⾦deptno int 部分编号CREATE TABLE emp(empno INT,ename V ARCHAR(50),job V ARCHAR(50),mgr INT,hiredate DATE,sal DECIMAL(7,2),comm decimal(7,2),deptno INT) ;INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20); INSERT INTO empvalues(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30); INSERT INTO empvalues(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30); INSERT INTO empvalues(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20); INSERT INTO empvalues(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30); INSERT INTO empvalues(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30); INSERT INTO empvalues(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10); INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20); INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10); INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30); INSERT INTOemp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20); INSERT INTO empvalues(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30); INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20); INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);●部分表:dept字段名称字段类型说明deptno int 部分编码dname varchar(50) 部分名称loc varchar(50) 部分所在地点CREATE TABLE dept(deptno INT,dname varchar(14),loc varchar(13));INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK');INSERT INTO dept values(20, 'RESEARCH', 'DALLAS');INSERT INTO dept values(30, 'SALES', 'CHICAGO');INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON');1基础查询1.1查询所有列SELECT * FROM stu;1.2查询指定列SELECT sid, sname, age FROM stu;2条件查询2.1条件查询介绍条件查询就是在查询时给出WHERE⼦句,在WHERE⼦句中可以使⽤如下运算符及关键字:●=、!=、<>、<、<=、>、>=;●BETWEEN…AND;●IN(set);●IS NULL;IS NOT NULL●AND;●OR;●NOT;2.2查询性别为⼥,并且年龄50的记录SELECT * FROM stuWHERE gender='female' AND ge<50;2.3查询学号为S_1001,或者姓名为liSi的记录SELECT * FROM stuWHERE sid ='S_1001' OR sname='liSi';2.4查询学号为S_1001,S_1002,S_1003的记录SELECT * FROM stuWHERE sid IN ('S_1001','S_1002','S_1003');2.5查询学号不是S_1001,S_1002,S_1003的记录SELECT * FROM tab_studentWHERE s_number NOT IN ('S_1001','S_1002','S_1003');2.6查询年龄为null的记录SELECT * FROM stuWHERE age IS NULL;2.7查询年龄在20到40之间的学⽣记录SELECT *FROM stuWHERE age>=20 AND age<=40;或者SELECT *FROM stuWHERE age BETWEEN 20 AND 40;2.8查询性别⾮男的学⽣记录SELECT *FROM stuWHERE gender!='male';或者SELECT *FROM stuWHERE gender<>'male';或者SELECT *FROM stuWHERE NOT gender='male';2.9查询姓名不为null的学⽣记录SELECT *FROM stuWHERE sname IS NOT NULL;或者SELECT *FROM stuWHERE NOT sname IS NULL;3模糊查询当想查询姓名中包含a字母的学⽣时就需要使⽤模糊查询了。模糊查询需要使⽤关键字LIKE。通配符:_ 任意⼀个字符%:任意0~n个字符'%张%' '张_'3.1查询姓名由5个字母构成的学⽣记录SELECT *FROM stuWHERE sname LIKE '_____';模糊查询必须使⽤LIKE关键字。其中“_”匹配任意⼀个字母,5个“_”表⽰5个任意字母。3.2查询姓名由5个字母构成,并且第5个字母为“i”的学⽣记录SELECT *FROM stuWHERE sname LIKE '____i';3.3查询姓名以“z”开头的学⽣记录SELECT *FROM stuWHERE sname LIKE 'z%';其中“%”匹配0~n个任何字母。3.4查询姓名中第2个字母为“i”的学⽣记录SELECT *FROM stuWHERE sname LIKE '_i%';3.5查询姓名中包含“a”字母的学⽣记录SELECT *FROM stuWHERE sname LIKE '%a%';4字段控制查询4.1去除重复记录去除重复记录(两⾏或两⾏以上记录中系列的上的数据都相同),例如emp表中sal字段就存在相同的记录。当只查询emp表的sal字段时,那么会出现重复记录,那么想去除重复记录,需要使⽤DISTINCT:SELECT DISTINCT sal FROM emp;4.2查看雇员的⽉薪与佣⾦之和因为sal和comm两列的类型都是数值类型,所以可以做加运算。如果sal或comm中有⼀个字段不是数值类型,那么会出错。SELECT *,sal+comm FROM emp;comm列有很多记录的值为NULL,因为任何东西与NULL相加结果还是NULL,所以结算结果可能会出现NULL。下⾯使⽤了把NULL转换成数值0的函数IFNULL:SELECT *,sal+IFNULL(comm,0) FROM emp;4.3给列名添加别名在上⾯查询中出现列名为sal+IFNULL(comm,0),这很不美观,现在我们给这⼀列给出⼀个别名,为total:SELECT *, sal+IFNULL(comm,0) AS total FROM emp;给列起别名时,是可以省略AS关键字的:SELECT *,sal+IFNULL(comm,0) total FROM emp;5排序order by 列名asc(默认) desc5.1查询所有学⽣记录,按年龄升序排序SELECT *FROM stuORDER BY sage ASC;或者SELECT *FROM stuORDER BY sage;5.2查询所有学⽣记录,按年龄降序排序SELECT *FROM stuORDER BY age DESC;5.3查询所有雇员,按⽉薪降序排序,如果⽉薪相同时,按编号升序排序SELECT * FROM empORDER BY sal DESC,empno ASC;6聚合函数sum avg max min count聚合函数是⽤来做纵向运算的函数:●COUNT():统计指定列不为NULL的记录⾏数;●MAX():计算指定列的最⼤值,如果指定列是字符串类型,那么使⽤字符串排序运算;●MIN():计算指定列的最⼩值,如果指定列是字符串类型,那么使⽤字符串排序运算;●SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;●A VG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;6.1COUNT当需要纵向统计时可以使⽤COUNT()。●查询emp表中记录数:SELECT COUNT(*) AS cnt FROM emp;●查询emp表中有佣⾦的⼈数:SELECT COUNT(comm) cnt FROM emp;注意,因为count()函数中给出的是comm列,那么只统计comm列⾮NULL的⾏数。●查询emp表中⽉薪⼤于2500的⼈数:SELECT COUNT(*) FROM empWHERE sal > 2500;●统计⽉薪与佣⾦之和⼤于2500元的⼈数:SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;●查询有佣⾦的⼈数,有领导的⼈数:SELECT COUNT(comm), COUNT(mgr) FROM emp;6.2SUM和AVG当需要纵向求和时使⽤sum()函数。●查询所有雇员⽉薪和:SELECT SUM(sal) FROM emp;●查询所有雇员⽉薪和,以及所有雇员佣⾦和:SELECT SUM(sal), SUM(comm) FROM emp;●查询所有雇员⽉薪+佣⾦和:SELECT SUM(sal+IFNULL(comm,0)) FROM emp;●统计所有员⼯平均⼯资:SELECT AVG(sal) FROM emp;6.3MAX和MIN●查询最⾼⼯资和最低⼯资:SELECT MAX(sal), MIN(sal) FROM emp;7分组查询当需要分组查询时需要使⽤GROUP BY⼦句,例如查询每个部门的⼯资和,这说明要使⽤部门来分组。注:凡和聚合函数同时出现的列名,⼀定要写在group by 之后7.1分组查询●查询每个部门的部门编号和每个部门的⼯资和:SELECT deptno, SUM(sal)FROM empGROUP BY deptno;●查询每个部门的部门编号以及每个部门的⼈数:SELECT deptno,COUNT(*)FROM empGROUP BY deptno;●查询每个部门的部门编号以及每个部门⼯资⼤于1500的⼈数:SELECT deptno,COUNT(*)FROM empWHERE sal>1500GROUP BY deptno;7.2HAVING⼦句●查询⼯资总和⼤于9000的部门编号以及⼯资和:SELECT deptno, SUM(sal)FROM empGROUP BY deptnoHA VING SUM(sal) > 9000;注:having与where的区别:是在分组后对数据进⾏过滤.where是在分组前对数据进⾏过滤后⾯可以使⽤聚合函数(统计函数)where后⾯不可以使⽤聚合函数。WHERE是对分组前记录的条件,如果某⾏记录没有满⾜WHERE⼦句的条件,那么这⾏记录不会参加分组;⽽HA VING是对分组后数据的约束。8LIMIT ⽅⾔LIMIT⽤来限定查询结果的起始⾏,以及总⾏数。8.1查询5⾏记录,起始⾏从0开始SELECT * FROM emp LIMIT 0, 5;注意,起始⾏从0开始,即第⼀⾏开始!8.2查询10⾏记录,起始⾏从3开始SELECT * FROM emp LIMIT 3, 10;8.3分页查询如果⼀页记录为10条,希望查看第3页记录应该怎么查呢?●第⼀页记录起始⾏为0,⼀共查询10⾏;●第⼆页记录起始⾏为10,⼀共查询10⾏;●第三页记录起始⾏为20,⼀共查询10⾏;8.3查询代码的书写顺序和执⾏顺序查询语句书写顺序:select – from- where- group by- having- order by-limit 查询语句执⾏顺序:from - where -group by -having - select - order by-limit六、数据的完整性作⽤:保证⽤户输⼊的数据保存到数据库中是正确的。确保数据的完整性= 在创建表时给表中添加约束完整性的分类:> 实体完整性> 域完整性> 引⽤完整性1、实体完整性实体:即表中的⼀⾏(⼀条记录)代表⼀个实体(entity)实体完整性的作⽤:标识每⼀⾏数据不重复。约束类型:主键约束(primary key)唯⼀约束(unique) ⾃动增长列(auto_increment) 1.1主键约束(primary key)特点:数据唯⼀,且不能为null例:第⼀种添加⽅式:CREATE TABLE student(Id int primary key,Name varchar(50));第⼀种添加⽅式:此种⽅式优势在于,可以创建联合主键CREATE TABLE student(id int,Name varchar(50),Primary key(id));CREATE TABLE student(id int,Name varchar(50),Primary key(id,name));第三种添加⽅式:CREATE TABLE student(Id int,Name varchar(50));ALTER TABLE studentADD PRIMARY KEY (id);1.2唯⼀约束(unique):CREATE TABLE student(Id int primary key,Name varchar(50) unique);1.3⾃动增长列(auto_increment)给主键添加⾃动增长的数值,列只能是整数类型,但是如果删除之前增长的序号,后⾯再添加的时候序号不会重新开始,⽽是会接着被删除的那⼀列的序号CREATE TABLE student(Id int primary key auto_increment,Name varchar(50));INSERT INTO student(name) values(‘tom’);2、域完整性域完整性的作⽤:限制此单元格的数据正确,不对照此列的其它单元格⽐较域代表当前单元格域完整性约束:数据类型⾮空约束(not null)默认值约束(default)Check约束(mysql不⽀持)check();1.1 数据类型:(数值类型、⽇期类型、字符串类型)1.2 ⾮空约束:not nullCREATE TABLE student(Id int pirmary key,Name varchar(50) not null,Sex varchar(10));INSERT INTO student values(1,’tom’,null);1.3 默认值约束defaultCREATE TABLE student(Id int pirmary key,Name varchar(50) not null,Sex varchar(10) default ‘男’);insert into student1 values(1,'tom','⼥');insert into student1 values(2,'jerry',default);3、引⽤完整性要有外键必须先有主键,主键和外键的类型必须⼀致
2023年6月21日发(作者:)
sql数据库⽰例,适合初学者⼀、数据库概述数据库(DataBase,DB):指长期保存在计算机的存储设备上,按照⼀定规则组织起来,可以被各种⽤户或应⽤共享的数据集合。(⽂件系统)数据库管理系统(DataBase Management System,DBMS):指⼀种操作和管理数据库的⼤型软件,⽤于建⽴、使⽤和维护数据库,对数据库进⾏统⼀管理和控制,以保证数据库的安全性和完整性。⽤户通过数据库管理系统访问数据库中的数据。数据库软件应该为数据库管理系统,数据库是通过数据库管理系统创建和操作的。数据库:存储、维护和管理数据的集合。⼆、数据库的安装与配置* 安装* 参照图解* ⼀路下⼀步* 配置* 参照图解* 到选择字符集时停登录Mysql:mysql -u root -p abc* 卸载1.停⽌mysql服务net stop mysql 启动mysql服务net start mysql2.卸载mysql3.找到mysql 安装⽬录下的 datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"* 修改密码运⾏cmd* 安装成功了打开cmd --> mysql -uroot -p你的密码* 修改mysql root⽤户密码1) 停⽌mysql服务运⾏输⼊ 停⽌mysql服务或者cmd --> net stop mysql2) 在cmd下输⼊mysqld--skip-grant-tables 启动服务器光标不动(不要关闭该窗⼝)3) 新打开cmd 输⼊mysql -u root -p 不需要密码use mysql;update user set password=password('abc') WHERE User='root';4) 关闭两个cmd窗⼝在任务管理器结束mysqld 进程5) 在服务管理页⾯重启mysql 服务密码修改完成数据库中⼀⾏记录与对象之间的关系。列:字段⾏:⼀条记录(实体)public class User{private int id;private String name;private int age;}三、sql概述SQL:Structure Query Language。(结构化查询语⾔)SQL被美国国家标准局(ANSI)确定为关系型数据库语⾔的美国标准,后来被国际化标准组织(ISO)采纳为关系数据库语⾔的国际标准。各数据库⼚商都⽀持ISO的SQL标准。普通话各数据库⼚商在标准的基础上做了⾃⼰的扩展。⽅⾔四、Sql的分类DDL**(Data Definition Language):数据定义语⾔,⽤来定义数据库对象:库、表、列等;CREATE、ALTER、DROPDML***(Data Manipulation Language):数据操作语⾔,⽤来定义数据库记录(数据);INSERT、UPDA TE、DELETEDCL(Data Control Language):数据控制语⾔,⽤来定义访问权限和安全级别;DQL*****(Data Query Language):数据查询语⾔,⽤来查询记录(数据)。SELECT* 注意:sql语句以;结尾4.1 DDL:操作数据库、表、列等使⽤的关键字:CREATE、ALTER、DROP* 4.1.1操作数据库创建c reate database mydb1;Create database mydb2 character set gbk;Create database mydb3 character set gbk COLLATE gbk_chinese_ci;查询查看当前数据库服务器中的所有数据库show databases;查看前⾯创建的mydb2数据库的定义信息Show create database mydb2;删除前⾯创建的mydb3数据库Drop database mydb3;修改查看服务器中的数据库,并把mydb2的字符集修改为utf8;alter database mydb2 character set utf8;删除drop database mydb3;* 其他:查看当前使⽤的数据库select database();切换数据库use mydb2;* 4.1.2操作数据表* 语法:create table 表名(字段1 字段类型,字段2 字段类型,...字段n 字段类型);* 常⽤数据类型:int:整型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:sstimestamp:时间戳类型yyyy-MM-dd hh:mm:ss 会⾃动赋值datetime:⽇期时间类型yyyy-MM-dd hh:mm:ss当前数据库中的所有表SHOW TABLES;查看表的字段信息DESC employee;在上⾯员⼯表的基本上增加⼀个image列。ALTER TABLE employee ADD image blob;修改job列,使其长度为60。ALTER TABLE employee MODIFY job varchar(60);删除image列,⼀次只能删⼀列。ALTER TABLE employee DROP image;表名改为user。RENAME TABLE employee TO user;查看表格的创建细节SHOW CREATE TABLE user;修改表的字符集为gbkALTER TABLE user CHARACTER SET gbk;列名name修改为usernameALTER TABLE user CHANGE name username varchar(100);删除表DROP TABLE user ;4.2 DML操作(重要)查询表中的所有数据SELECT * FROM 表名;DML是对表中的数据进⾏增、删、改的操作。不要与DDL混淆了。INSERT 、UPDATE、DELETE⼩知识:在mysql中,字符串类型和⽇期类型都要⽤单引号括起来。'tom' '2015-09-04' 空值:null4.2.1插⼊操作:INSERT:语法:INSERT INTO 表名(列名1,列名2 ...)V ALUES(列值1,列值2...);注意:列名与列值的类型、个数、顺序要⼀⼀对应。可以把列名当做java中的形参,把列值当做实参。值不要超出列定义的长度。如果插⼊空值,请使⽤null插⼊的⽇期和字符⼀样,都使⽤引号括起来。练习:create table emp(id int,name varchar(100),gender varchar(10),birthday date,salary float(10,2),entry_date date,resume text);INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)V ALUES(1,'zhangsan','female','1990-5-10',10000,'2015-5-5-','good girl');INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)V ALUES(2,'lisi','male','1995-5-10',10000,'2015-5-5','good boy');INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)V ALUES(3,'wangwu','male','1995-5-10',10000,'2015-5-5','good boy');批量插⼊:INSERT INTO emp V ALUES(4,'zs','m','2015-09-01',10000,'2015-09-01',NULL),(5,'li','m','2015-09-01',10000,'2015-09-01',NULL),(6,'ww','m','2015-09-01',10000,'2015-09-01',NULL);4.2.2 修改操作UPDATE:语法:UPDATE 表名SET 列名1=列值1,列名2=列值2 。。。WHERE 列名=值练习:将所有员⼯薪⽔修改为5000元。UPDA TE emp SET salary=5000将姓名为’zs’的员⼯薪⽔修改为3000元。UPDA TE emp SET salary=3000 WHERE name=’ zhangsan’;将姓名为’aaa’的员⼯薪⽔修改为4000元,job改为ccc。UPDATE emp SET salary=4000,gender='female' WHERE name='lisi';将wu的薪⽔在原有基础上增加1000元。UPDATE emp SET salary=salary+1000 WHERE gender='male';4.2.3 删除操作DELETE:语法:DELETE FROM 表名【WHERE 列名=值】练习:删除表中名称为’zs’的记录。DELETE FROM emp WHERE name=‘zs’;删除表中所有记录。DELETE FROM emp;使⽤truncate删除表中记录。TRUNCATE TABLE emp;DELETE 删除表中的数据,表结构还在;删除后的数据可以找回TRUNCATE 删除是把表直接DROP掉,然后再创建⼀个同样的新表。删除的数据不能找回。执⾏速度⽐DELETE快。4.3 DQL操作DQL数据查询语⾔(重要)数据库执⾏DQL语句不会对数据进⾏改变,⽽是让数据库发送结果集给客户端。查询返回的结果集是⼀张虚拟表。查询关键字:SELECT语法:SELECT 列名FROM表名【WHERE --> GROUP BY -->HA VING--> ORDER BY】语法:SELECT selection_list /*要查询的列名称*/FROM table_list /*要查询的表名称*/WHERE condition /*⾏条件*/GROUP BY grouping_columns /*对结果分组*/HA VING condition /*分组后的⾏条件*/ORDER BY sorting_columns /*对结果分组*/LIMIT offset_start, row_count /*结果限定*/创建名:学⽣表:stu字段名称字段类型说明sid char(6) 学⽣学号sname varchar(50) 学⽣姓名age int 学⽣年龄gender varchar(50) 学⽣性别CREATE TABLE stu (sid CHAR(6),sname V ARCHAR(50),age INT,gender V ARCHAR(50));INSERT INTO stu V ALUES('S_1001', 'liuYi', 35, 'male');INSERT INTO stu V ALUES('S_1002', 'chenEr', 15, 'female');INSERT INTO stu V ALUES('S_1003', 'zhangSan', 95, 'male');INSERT INTO stu V ALUES('S_1004', 'liSi', 65, 'female');INSERT INTO stu V ALUES('S_1005', 'wangWu', 55, 'male');INSERT INTO stu V ALUES('S_1006', 'zhaoLiu', 75, 'female');INSERT INTO stu V ALUES('S_1007', 'sunQi', 25, 'male');INSERT INTO stu V ALUES('S_1008', 'zhouBa', 45, 'female');INSERT INTO stu V ALUES('S_1009', 'wuJiu', 85, 'male');INSERT INTO stu V ALUES('S_1010', 'zhengShi', 5, 'female');INSERT INTO stu V ALUES('S_1011', 'xxx', NULL, NULL);●雇员表:emp字段名称字段类型说明empno int 员⼯编号ename varchar(50) 员⼯姓名job varchar(50) 员⼯⼯作mgr int 领导编号hiredate date ⼊职⽇期sal decimal(7,2) ⽉薪comm decimal(7,2) 奖⾦deptno int 部分编号CREATE TABLE emp(empno INT,ename V ARCHAR(50),job V ARCHAR(50),mgr INT,hiredate DATE,sal DECIMAL(7,2),comm decimal(7,2),deptno INT) ;INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20); INSERT INTO empvalues(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30); INSERT INTO empvalues(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30); INSERT INTO empvalues(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20); INSERT INTO empvalues(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30); INSERT INTO empvalues(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30); INSERT INTO empvalues(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10); INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20); INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10); INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30); INSERT INTOemp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20); INSERT INTO empvalues(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30); INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20); INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);●部分表:dept字段名称字段类型说明deptno int 部分编码dname varchar(50) 部分名称loc varchar(50) 部分所在地点CREATE TABLE dept(deptno INT,dname varchar(14),loc varchar(13));INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK');INSERT INTO dept values(20, 'RESEARCH', 'DALLAS');INSERT INTO dept values(30, 'SALES', 'CHICAGO');INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON');1基础查询1.1查询所有列SELECT * FROM stu;1.2查询指定列SELECT sid, sname, age FROM stu;2条件查询2.1条件查询介绍条件查询就是在查询时给出WHERE⼦句,在WHERE⼦句中可以使⽤如下运算符及关键字:●=、!=、<>、<、<=、>、>=;●BETWEEN…AND;●IN(set);●IS NULL;IS NOT NULL●AND;●OR;●NOT;2.2查询性别为⼥,并且年龄50的记录SELECT * FROM stuWHERE gender='female' AND ge<50;2.3查询学号为S_1001,或者姓名为liSi的记录SELECT * FROM stuWHERE sid ='S_1001' OR sname='liSi';2.4查询学号为S_1001,S_1002,S_1003的记录SELECT * FROM stuWHERE sid IN ('S_1001','S_1002','S_1003');2.5查询学号不是S_1001,S_1002,S_1003的记录SELECT * FROM tab_studentWHERE s_number NOT IN ('S_1001','S_1002','S_1003');2.6查询年龄为null的记录SELECT * FROM stuWHERE age IS NULL;2.7查询年龄在20到40之间的学⽣记录SELECT *FROM stuWHERE age>=20 AND age<=40;或者SELECT *FROM stuWHERE age BETWEEN 20 AND 40;2.8查询性别⾮男的学⽣记录SELECT *FROM stuWHERE gender!='male';或者SELECT *FROM stuWHERE gender<>'male';或者SELECT *FROM stuWHERE NOT gender='male';2.9查询姓名不为null的学⽣记录SELECT *FROM stuWHERE sname IS NOT NULL;或者SELECT *FROM stuWHERE NOT sname IS NULL;3模糊查询当想查询姓名中包含a字母的学⽣时就需要使⽤模糊查询了。模糊查询需要使⽤关键字LIKE。通配符:_ 任意⼀个字符%:任意0~n个字符'%张%' '张_'3.1查询姓名由5个字母构成的学⽣记录SELECT *FROM stuWHERE sname LIKE '_____';模糊查询必须使⽤LIKE关键字。其中“_”匹配任意⼀个字母,5个“_”表⽰5个任意字母。3.2查询姓名由5个字母构成,并且第5个字母为“i”的学⽣记录SELECT *FROM stuWHERE sname LIKE '____i';3.3查询姓名以“z”开头的学⽣记录SELECT *FROM stuWHERE sname LIKE 'z%';其中“%”匹配0~n个任何字母。3.4查询姓名中第2个字母为“i”的学⽣记录SELECT *FROM stuWHERE sname LIKE '_i%';3.5查询姓名中包含“a”字母的学⽣记录SELECT *FROM stuWHERE sname LIKE '%a%';4字段控制查询4.1去除重复记录去除重复记录(两⾏或两⾏以上记录中系列的上的数据都相同),例如emp表中sal字段就存在相同的记录。当只查询emp表的sal字段时,那么会出现重复记录,那么想去除重复记录,需要使⽤DISTINCT:SELECT DISTINCT sal FROM emp;4.2查看雇员的⽉薪与佣⾦之和因为sal和comm两列的类型都是数值类型,所以可以做加运算。如果sal或comm中有⼀个字段不是数值类型,那么会出错。SELECT *,sal+comm FROM emp;comm列有很多记录的值为NULL,因为任何东西与NULL相加结果还是NULL,所以结算结果可能会出现NULL。下⾯使⽤了把NULL转换成数值0的函数IFNULL:SELECT *,sal+IFNULL(comm,0) FROM emp;4.3给列名添加别名在上⾯查询中出现列名为sal+IFNULL(comm,0),这很不美观,现在我们给这⼀列给出⼀个别名,为total:SELECT *, sal+IFNULL(comm,0) AS total FROM emp;给列起别名时,是可以省略AS关键字的:SELECT *,sal+IFNULL(comm,0) total FROM emp;5排序order by 列名asc(默认) desc5.1查询所有学⽣记录,按年龄升序排序SELECT *FROM stuORDER BY sage ASC;或者SELECT *FROM stuORDER BY sage;5.2查询所有学⽣记录,按年龄降序排序SELECT *FROM stuORDER BY age DESC;5.3查询所有雇员,按⽉薪降序排序,如果⽉薪相同时,按编号升序排序SELECT * FROM empORDER BY sal DESC,empno ASC;6聚合函数sum avg max min count聚合函数是⽤来做纵向运算的函数:●COUNT():统计指定列不为NULL的记录⾏数;●MAX():计算指定列的最⼤值,如果指定列是字符串类型,那么使⽤字符串排序运算;●MIN():计算指定列的最⼩值,如果指定列是字符串类型,那么使⽤字符串排序运算;●SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;●A VG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;6.1COUNT当需要纵向统计时可以使⽤COUNT()。●查询emp表中记录数:SELECT COUNT(*) AS cnt FROM emp;●查询emp表中有佣⾦的⼈数:SELECT COUNT(comm) cnt FROM emp;注意,因为count()函数中给出的是comm列,那么只统计comm列⾮NULL的⾏数。●查询emp表中⽉薪⼤于2500的⼈数:SELECT COUNT(*) FROM empWHERE sal > 2500;●统计⽉薪与佣⾦之和⼤于2500元的⼈数:SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;●查询有佣⾦的⼈数,有领导的⼈数:SELECT COUNT(comm), COUNT(mgr) FROM emp;6.2SUM和AVG当需要纵向求和时使⽤sum()函数。●查询所有雇员⽉薪和:SELECT SUM(sal) FROM emp;●查询所有雇员⽉薪和,以及所有雇员佣⾦和:SELECT SUM(sal), SUM(comm) FROM emp;●查询所有雇员⽉薪+佣⾦和:SELECT SUM(sal+IFNULL(comm,0)) FROM emp;●统计所有员⼯平均⼯资:SELECT AVG(sal) FROM emp;6.3MAX和MIN●查询最⾼⼯资和最低⼯资:SELECT MAX(sal), MIN(sal) FROM emp;7分组查询当需要分组查询时需要使⽤GROUP BY⼦句,例如查询每个部门的⼯资和,这说明要使⽤部门来分组。注:凡和聚合函数同时出现的列名,⼀定要写在group by 之后7.1分组查询●查询每个部门的部门编号和每个部门的⼯资和:SELECT deptno, SUM(sal)FROM empGROUP BY deptno;●查询每个部门的部门编号以及每个部门的⼈数:SELECT deptno,COUNT(*)FROM empGROUP BY deptno;●查询每个部门的部门编号以及每个部门⼯资⼤于1500的⼈数:SELECT deptno,COUNT(*)FROM empWHERE sal>1500GROUP BY deptno;7.2HAVING⼦句●查询⼯资总和⼤于9000的部门编号以及⼯资和:SELECT deptno, SUM(sal)FROM empGROUP BY deptnoHA VING SUM(sal) > 9000;注:having与where的区别:是在分组后对数据进⾏过滤.where是在分组前对数据进⾏过滤后⾯可以使⽤聚合函数(统计函数)where后⾯不可以使⽤聚合函数。WHERE是对分组前记录的条件,如果某⾏记录没有满⾜WHERE⼦句的条件,那么这⾏记录不会参加分组;⽽HA VING是对分组后数据的约束。8LIMIT ⽅⾔LIMIT⽤来限定查询结果的起始⾏,以及总⾏数。8.1查询5⾏记录,起始⾏从0开始SELECT * FROM emp LIMIT 0, 5;注意,起始⾏从0开始,即第⼀⾏开始!8.2查询10⾏记录,起始⾏从3开始SELECT * FROM emp LIMIT 3, 10;8.3分页查询如果⼀页记录为10条,希望查看第3页记录应该怎么查呢?●第⼀页记录起始⾏为0,⼀共查询10⾏;●第⼆页记录起始⾏为10,⼀共查询10⾏;●第三页记录起始⾏为20,⼀共查询10⾏;8.3查询代码的书写顺序和执⾏顺序查询语句书写顺序:select – from- where- group by- having- order by-limit 查询语句执⾏顺序:from - where -group by -having - select - order by-limit六、数据的完整性作⽤:保证⽤户输⼊的数据保存到数据库中是正确的。确保数据的完整性= 在创建表时给表中添加约束完整性的分类:> 实体完整性> 域完整性> 引⽤完整性1、实体完整性实体:即表中的⼀⾏(⼀条记录)代表⼀个实体(entity)实体完整性的作⽤:标识每⼀⾏数据不重复。约束类型:主键约束(primary key)唯⼀约束(unique) ⾃动增长列(auto_increment) 1.1主键约束(primary key)特点:数据唯⼀,且不能为null例:第⼀种添加⽅式:CREATE TABLE student(Id int primary key,Name varchar(50));第⼀种添加⽅式:此种⽅式优势在于,可以创建联合主键CREATE TABLE student(id int,Name varchar(50),Primary key(id));CREATE TABLE student(id int,Name varchar(50),Primary key(id,name));第三种添加⽅式:CREATE TABLE student(Id int,Name varchar(50));ALTER TABLE studentADD PRIMARY KEY (id);1.2唯⼀约束(unique):CREATE TABLE student(Id int primary key,Name varchar(50) unique);1.3⾃动增长列(auto_increment)给主键添加⾃动增长的数值,列只能是整数类型,但是如果删除之前增长的序号,后⾯再添加的时候序号不会重新开始,⽽是会接着被删除的那⼀列的序号CREATE TABLE student(Id int primary key auto_increment,Name varchar(50));INSERT INTO student(name) values(‘tom’);2、域完整性域完整性的作⽤:限制此单元格的数据正确,不对照此列的其它单元格⽐较域代表当前单元格域完整性约束:数据类型⾮空约束(not null)默认值约束(default)Check约束(mysql不⽀持)check();1.1 数据类型:(数值类型、⽇期类型、字符串类型)1.2 ⾮空约束:not nullCREATE TABLE student(Id int pirmary key,Name varchar(50) not null,Sex varchar(10));INSERT INTO student values(1,’tom’,null);1.3 默认值约束defaultCREATE TABLE student(Id int pirmary key,Name varchar(50) not null,Sex varchar(10) default ‘男’);insert into student1 values(1,'tom','⼥');insert into student1 values(2,'jerry',default);3、引⽤完整性要有外键必须先有主键,主键和外键的类型必须⼀致
发布评论