创建数据库
CREATE DATABASE demo_lhm
USE demo_lhm
删除数据库
drop database demo_lhm
数据库定义语言
创建表
creat table 表名(
列名 数据类型
)
CHAR(10)表示定长,长度固定,不够则用空格补位 VARCHAR(10)表示变长,即长度可变,小于十个字符即可
实体完整性:
PRIMARY KEY 主键,
域完整性:
NOT NULL 不能为空的约束
UNIQUE 满足唯一性
DEFAULT '男' 默认为男
AUTO_INCREMENT 自增长
引用完整性:
REFERENCES 表名(c_id) 给学生表增加外键,外键一般和约束同时使用
CONSTRAINT FOREIGN KEY(当前表的外键名) REFERENCES 表名(主键名) 添加外键约束
创建学生表
CREATE TABLE t_student(
s_id INT PRIMARY KEY AUTO_INCREMENT,
s_name VARCHAR(10) NOT NULL,
s_sex VARCHAR(2) DEFAULT '男' ,
s_phone INT UNIQUE,
s_cid INT,
CONSTRAINT FOREIGN KEY(s_cid) REFERENCES t_class(c_id)
)
创建班级表(主表)
CREATE TABLE t_class(
c_id INT PRIMARY KEY AUTO_INCREMENT,
c_name VARCHAR(20)
)
数据库操作语言
增加一个成绩的列,数据类型为int
ALTER TABLE t_student ADD s_grade INT
修改某一列
ALTER TABLE 表名 CHANGE 原列名 新列名 数据类型
ALTER TABLE t_student CHANGE s_grade s_addrss VARCHAR(10)
删除某一列
ALTER TABLE t_student DROP s_addrss
添加数据
INSERT INTO t_student (s_name,s_sex,s_phone)VALUE('王五','女',321)
INSERT INTO t_student VALUE(NULL,'六四','女',4326,2),
(NULL,'s是','女',324,1),
(NULL,'六四','女',241,2)
添加默认项
INSERT INTO t_student VALUE(NULL,'wehddi',DEFAULT,134,1)
修改所有数据
UPDATE t_student SET s_name='六四'
有筛选的修改数据
UPDATE t_student SET s_name='张三' WHERE s_sex='男'
删除所有数据
DELETE FROM t_student
有筛选的删除数据
DELETE FROM t_student WHERE s_phone=241
清空所有数据
TRUNCATE TABLE t_student
备份当前修改完成的表到新的表
CREATE TABLE 新表名 LIKE 当前表名;
INSERT INTO 新表名 SELECT * FROM 当前表名
creat table 新表名 select * from 当前表名
查询所有
SELECT * FROM 表名
查询某些信息
SELECT stud_name,stud_phone FROM students
有筛选的查询
SELECT * FROM students WHERE stud_age>23 AND stud_sex='男'
SELECT * FROM students WHERE stud_age>23 OR stud_education='大专'
SELECT * FROM students WHERE stud_age NOT IN (22,23)
模糊查询
%: 表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,使用两个百分号(%%)表示。
_: 表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句
[ ]: 表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。
如果 [ ] 内有一系列字符(01234、abcde之类的)则可略写为“0-4”、“a-e”
[^ ] : 表示不在括号所列之内的单个字符。其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
表的前缀,当同时查询2个表的时候使用
SELECT t1.stud_name AS '学生姓名',t1.stud_phone AS '学生电话' FROM students t1 WHERE stud_id=2
计算值
SELECT stud_name,stud_age+10 AS '学生年龄+10' FROM students
查询所有不重复的学生性别
DISTINCT 排除重复数据,当一行的数据的某一列不一样时,也不会被排除
SELECT DISTINCT stud_sex FROM students
查询没有入学日期的人
SELECT * FROM students WHERE stud_birthday IS NULL
顺序排列,默认是升序
SELECT stud_name,stud_age FROM students ORDER BY stud_age DESC 降序
SELECT stud_name,stud_age FROM students ORDER BY stud_age ASC 升序
查询年龄最大的五位学生的信息
SELECT * FROM students ORDER BY stud_age DESC LIMIT 5
LIMIT 2,3 第一个数字代表从第几条开始(从0开始),第二个数字代表返回多少条数据
SELECT * FROM students ORDER BY stud_age DESC LIMIT 2,3
查询年龄最大的两个男生
SELECT * FROM students WHERE stud_sex='男' ORDER BY stud_age DESC LIMIT 2
查询从第三条数据开始,到第10条数据结束的记录,要求商品单价大于100 或者销售数量大于50
SELECT * FROM (SELECT * FROM sales LIMIT 2,8) result WHERE result.xs_sale>100 OR result.xs_count>50
聚合函数:
查询一共多少学生
SELECT COUNT(*) AS '学生人数' FROM students
查询年龄最大的学生
SELECT MAX(stud_age) AS '最大年龄' FROM students
查询年龄最小的学生是谁
SELECT stud_name FROM students WHERE stud_age=(SELECT MIN(stud_age) FROM students)
所有学生年龄的总和
SELECT SUM(stud_age) FROM students
所有学生年龄的平均值
SELECT AVG(stud_age) FROM students
SELECT AVG(IFNULL(stud_age,0)) FROM students
SELECT SUM(stud_age)/COUNT(*) FROM students
查询每个学历的人数
当进行分组时,投影列一定是聚合函数列和分组列
SELECT COUNT(*) ,stud_education FROM students GROUP BY stud_education
查询每个学历的男生人数
SELECT COUNT(*) ,stud_education FROM students WHERE stud_sex='男' GROUP BY stud_education
查询男生数量大于1的学历并且升序排列
SELECT COUNT(*) AS 'stunum' ,stud_education -- 4
FROM students -- 1
WHERE stud_sex='男' -- 2
GROUP BY stud_education -- 3
HAVING stunum>1 -- 5
ORDER BY stunum ASC -- 6