Введение в базу данных_04

Оператор MySQL

Операторы MySQL в основном включают три категории: операторы сравнения, арифметические операторы, логические операторы.

арифметический оператор

加+、减-、乘*、除/、求余%

mysql> select 1+2;
+-----+
| 1+2 |
+-----+
| 3 |
+-----+
1 row in set (0.00 sec)
mysql> select 1/2;
+--------+
| 1/2 |
+--------+
| 0.5000 |
+--------+
1 row in set (0.00 sec)
mysql> select 5%2;
+------+
| 5%2 |
+------+
| 1 |
+------+
1 row in set (0.00 sec)

спецоперация

mysql> select '5a'+2;
+--------+
| '5a'+2 |
+--------+
| 7 |
+--------+
1 row in set, 1 warning (0.00 sec)
mysql> select 'a5'+2;
+--------+
| 'a5'+2 |
+--------+
| 2 |
+--------+
1 row in set, 1 warning (0.00 sec)
mysql> select 123.45%2.52;
+-------------+
| 123.45%2.52 |
+-------------+
| 2.49 |
+-------------+
1 row in set (0.00 sec)
mysql> select -123.45%2.52;
+--------------+
| -123.45%2.52 |
+--------------+
| -2.49 |
+--------------+
1 row in set (0.00 sec)

оператор сравнения

оператор грамматика иллюстрировать
"=" а=б истина, если два операнда, участвующих в вычислении, равны, в противном случае ложь
!= или <> а!=б или а<>б true[1], если два операнда не равны, иначе false[0]
< а<б Возвращает true, если a меньше b, иначе false
> а>б истина, если a больше, чем b
<= а<=б меньше или равно
>= а>=б больше или равно

в или не в

  • in используется для определения того, является ли значение столбца заданным значением.При использовании оператора in указанное значение является дискретными данными, а не непрерывным значением.
    • выберите * из tb_student, где возраст в (18,28,15)含义是 age=18 или age=28 или age=15
    • выберите * из tb_student, где возраст не в (18,28,15)含义是 age!=18 и age!=28 и
      age!=15
    • Запросите значения баллов Сунь Цюань, Хуан Гая, Чжан Саня и Ли Си.
    • – Запросить результаты Чжан Сан и Ли Си
      , выбрать балл из tb_student, где имя='Чжан Сан' или имя='Ли Си',
      выбрать балл из tb_stuent, где имя в('Чжан Сан','Ли Си') – в нет ограничений на количество данных

между и

Используется для определения того, находятся ли данные в указанном диапазоне, непрерывное значение

  • Запросите информацию обо всех учащихся, которые сдали оценки и не являются отличными
-- 写法1:使用条件拼接
select * from tb_student where score>=60 and score<=85;
-- 写法2
select * from tb_student where score between 60 and 85;
--如果需要的是不在指定范围内部
select * from tb_student where score not between 50 and 85;

нравится/не нравится

В основном для нечетких запросов к данным строкового типа, подстановочным знакам _ и %

Поиск студентов по фамилии не Чжан

 select * from tb_student where name not like '张%'

regexp должен оценивать регулярное выражение строкового типа в mysql, а не regexp

<=> true, если два числа совпадают, даже если они равны нулю

является нулевым/не является нулевым

Определить, пусто ли оно, вернуть true, если оно пусто

Логические операторы

грамматика иллюстрировать
&& или и a и b пишут a&&b Логическое И, если два операнда, участвующих в вычислении, истинны, иначе ложно
-|| или или a или b или a-||b Логический или, если он участвует в вычислении двойной инверсии, пока одна сторона ложна, он возвращает ложь
не или! не а или !а Логическое НЕ, результат истинен, если операнд ложен

практические вопросы

образец таблицы данных

create table if not exists tb_student(
id bigint not null auto_increment,
name varchar(32) not null,
age int default 16,
sex boolean default 1,
dept varchar(32),
primary key(id)
) engine=innodb default charset utf8;
-- 插入测试数据
insert into tb_student values(null,'小胖',18,1,'软工'),(null,'东方',16,0,'机
壳'),(null,'仗义',19,1,'大数据');
  • Запросить имена и годы рождения всех учащихся
select name, 2022-age as birth_year from tb_student;
  • Запросить имя и год рождения студентки по фамилии Ли
select name, 2022-age as birth_year from tb_student where name like '李%';

  • Запросите имя, факультет и возраст студентов в возрасте от 18 до 23 лет.
select name,dept,age from tb_student where age>=18 and age<=23 -- 注意两头相等
select name,dept,age from tb_student where age between 18 and 23 --小值在前
select name,dept,age from tb_student where age in(18,23,22,20,21,19)
  • Запросите имя, факультет и возраст студентов, чей возраст не находится между 18 и 23 годами.
select name,dept,age from tb_student where age<18 or age>23;
select name,dept,age from tb_student where age not between 18 and 23;
  • Запросите имена и пол всех студентов факультетов программной инженерии, обсадных труб и больших данных.
select name,sex from tb_student where dept in('软工','机壳','大数据');
select name,sex from tb_student where dept='软工' or dept='机壳' or dept='大数据';
  • Запросите имена и пол всех студентов, которые не занимаются программной инженерией, корпусом или отделом больших данных.
select name,sex from tb_student where dept not in('软工','机壳','大数据');
select name,sex from tb_student where dept!='软工' and dept!='机壳' anddept!='大数据';
  • Запросить имя и возраст ученика Чжан xx
select name,age from tb_student where name like '张__';
select name,age from tb_student where name like '张%' and length(name)=3; 
--length针对中文的处理为获取其中所占字节数,不是字符数
  • Запросить информацию о студенте с Fang в имени
select * from tb_student where name like '%方%';
  • Запросить информацию об ученике, определяемую по возрасту
    • Обратите внимание, что =null или !=null неверны, вы должны использовать null или не null
select * from tb_student where age is not null;
  • Запрос информации об учащихся с неопределенным полом
select * from tb_student where sex is null;
  • Запросить информацию об отделении студента
    • отличительный автоматически удаляет повторяющиеся значения, все отображает все данные
select all dept from tb_student; -- all不会去除重复值,默认all
select distinct dept from tb_student;
  • Запросить отдел запросов и информацию о возрасте учащихся
mysql> select * from tb_student;
+----+--------+------+------+--------+
| id | name | age | sex | dept |
+----+--------+------+------+--------+
| 1 | 小胖 | 18 | 1 | 软工 |
| 2 | 东方 | 16 | 0 | 机壳 |
| 3 | 仗义 | 19 | 1 | 大数据 |
| 4 | 张骞 | 16 | 1 | 软工 |
| 5 | 张小骞 | 16 | 1 | 软工 |
+----+--------+------+------+--------+
5 rows in set (0.00 sec)
试图取消软工 16这条数据的重复
-- 语法错误
mysql> select distinct dept,distinct age from tb_student;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual
that corresponds to your MySQL server version for the right syntax to use
near 'distinct age from tb_student' at line 1
--正确的写法
select distinct dept,age from tb_student;

Вопрос: Как MySQL справляется, если auto_increment достигает верхнего предела?

auto_increment по умолчанию начинается с 1, а верхний предел зависит от типа данных столбца. Если столбец id в таблице уже имеет указанное значение, то max(id)+1

create table t1(
id int primary key auto_increment,
name varchar(20)
);
insert into t1 values(2147483646,'zhangsan');
insert into t1(name) values('lisi');
mysql> select * from t1;
+------------+----------+
| id | name |
+------------+----------+
| 2147483646 | zhangsan |
| 2147483647 | lisi |
+------------+----------+
2 rows in set (0.00 sec)
insert into t1(name) values('wangwu');
ERROR 1062 (23000): Duplicate entry '2147483647' for key 'PRIMARY' -- 意思是
再次生成了最大的int2147483647作为主键,此时主键冲突

Если данные удалены, система базы данных по-прежнему будет записывать сгенерированные данные, вместо того, чтобы начинать с новых, она будет продолжать добавлять 1 на предыдущей основе.

mysql> delete from t1 where name='lisi'; -- 2147483647
Query OK, 1 row affected (0.01 sec)
mysql> select * from t1;
+------------+----------+
| id | name |
+------------+----------+
| 2147483646 | zhangsan |
+------------+----------+
1 row in set (0.00 sec)
mysql> insert into t1(name) values('wangwu'); -- 2147483647
Query OK, 1 row affected (0.00 sec)

Если вам нужно снова начать генерировать непрерывные целые числа, вы можете только удалить все данные в таблице

truncate table t1; -- 删除整表数据,不能使用delete from

Предложение: поскольку данные, сгенерированные auto_increment, начинаются с 1, отрицательных целых чисел не будет, поэтому обычно рекомендуется использовать bigint без знака.

5 типов агрегатных функций

Агрегатные функции используются для обработки данных в коллекции, а не построчно.

Count подсчитывает количество строк, суммирование суммы, максимальное максимальное значение, минимальное минимальное значение, среднее среднее значение

считать

грамматикаcount([all/distinct] 列名称/*)

Получить общее количество учеников

select count(*) from tb_student;
select count(1) from tb_student;
select count(distinct dept) from tb_student; -- 获取系的个数
mysql> select * from tb_student;
+----+--------+------+------+--------+
| id | name | age | sex | dept |
+----+--------+------+------+--------+
| 1 | 小胖 | 18 | 1 | 软工 |
| 2 | 东方 | 16 | 0 | 机壳 |
| 3 | 仗义 | 19 | 1 | 大数据 |
| 4 | 张骞 | 16 | 1 | 软工 |
| 5 | 张小骞 | 16 | 1 | 软工 |
| 6 | 从来 | 16 | 1 | NULL |
+----+--------+------+------+--------+
6 rows in set (0.00 sec)
select count(dept) from tb_student; -- 进行计数统计时,null不参与统计

Необходимо подсчитать количество студентов, обучающихся на курсе №1

select count(*) from tb_choice where cid=1;

Если предположить, что результаты переэкзаменовки нужно записывать в таблицу выбора, а значит, курсы будут повторяться, то вопрос 1: первичный ключ (cid, sid) неверный,

Количество учащихся Курс № счет
1 3 45
1 3 70

Ошибка выборочного подсчета из-за двойного подсчета

select count(distinct sid) from tb_choice where cid=1;

Статистика

Для столбцов числового типа не используйте для других типов. макс мин сумма среднее

  • max/min можно использовать для сравнения типа даты, последняя дата является самой большой
ysql> select * from tb_student;
+----+--------+------+------+--------+
| id | name | age | sex | dept |
+----+--------+------+------+--------+
| 1 | 小胖 | 18 | 1 | 软工 |
| 2 | 东方 | 16 | 0 | 机壳 |
| 3 | 仗义 | 19 | 1 | 大数据 |
| 4 | 张骞 | 16 | 1 | 软工 |
| 5 | 张小骞 | 16 | 1 | 软工 |
| 6 | 从来 | 16 | 1 | NULL |
| 7 | 张展 | 16 | 1 | NULL |
+----+--------+------+------+--------+
7 rows in set (0.00 sec)
mysql> select max(age) from tb_student;
+----------+
| max(age) |
+----------+
| 19 |
+----------+
1 row in set (0.00 sec)
mysql> select min(age) from tb_student;
+----------+
| min(age) |
+----------+
| 16 |
+----------+
1 row in set (0.00 sec)
mysql> select avg(age) from tb_student; -- null值不参与计算,除非使用空值处理函数
将其转换为确定数值才可以
+----------+
| avg(age) |
+----------+
| 16.7143 |
+----------+
1 row in set (0.00 sec)
mysql> select sum(age) from tb_student;
+----------+
| sum(age) |
+----------+
| 101 |
+----------+
1 row in set (0.00 sec)

Запросите самые высокие и средние оценки студентов, прошедших курс №1.

select max(score),avg(score) from tb_choice where cid=1;
mysql> select sum(age),max(age),min(age),avg(age) from tb_student;
+----------+----------+----------+----------+
| sum(age) | max(age) | min(age) | avg(age) |
+----------+----------+----------+----------+
| 101 | 19 | 16 | 16.8333 |
+----------+----------+----------+----------+
1 row in set (0.00 sec)

вопрос

select count(*), select count(1)иselect count(列名称)

  • Имя столбца является первичным ключом count(имя столбца) быстрее, чем count(1); если имя столбца не является первичным ключом, count(1) быстрее, чем count(имя столбца
    )
  • Если в таблице несколько столбцов и нет первичного ключа, count(1) работает быстрее, чем count(), если есть первичный ключ, `count(имя столбца первичного ключа) является самым быстрым
    , если в таблице есть только один столбец count (
    ) самый быстрый
  • count(1) будет подсчитывать все записи в таблице, включая записи, поля которых пусты; count(имя столбца) не будет учитываться, если столбец пуст
  • MySQL оптимизирован для различных механизмов хранения.MyISAM будет записывать общее количество строк в таблице для использования в запросе count()
    ; Innodb будет выбирать наименьшую стоимость индекса для выполнения при сканировании таблицы, поэтому в Innodb count(
    ) . никакой разницы с
    count(1), и эффективность выполнения такая же.Только count (имя столбца) должен оценивать столбец с нулевым значением,
    поэтому эффективность ниже

Результаты группового запроса

Вы можете использовать предложение group by для группировки результатов запроса, часто используя агрегатные функции.

  • Если группировка не используется, для обработки всех данных результатов запроса используются агрегатные функции.
  • Если используется группировка, воздействуйте на данные результатов каждого группового запроса.

Получите средний возраст мальчиков и девочек

  • Сгруппируйте по полу в соответствии с полом и поместите разные половые значения в разные группы
  • Среднее значение — это агрегатная функция, которая обрабатывается для данных в наборе.
mysql> select sex,avg(age) from tb_student group by sex;
+------+----------+
| sex | avg(age) |
+------+----------+
| 1 | 17.0000 |
| 0 | 16.0000 |
| NULL | 16.0000 |
+------+----------+
3 rows in set (0.00 sec)

Примечание. Если имя столбца, которого нет в агрегатной функции, после select должно появиться после group by, в противном случае синтаксис неверен.

имея может условно выбрать группы

Средний возраст учащихся разного пола, которым необходимо охватить более 2-х учеников

  • группировка по полу
  • Группа для подсчета должна состоять из более чем 2 человек, а группа с меньшим или равным 2 человекам отображаться не будет.
select sex,avg(age) from tb_student group by sex having count(1)>2;

Упражнение 1. Запрос количества студентов, прошедших более 3 курсов

  • Сгруппировать по номеру ученика
  • Обрабатывать только группу, количество строк данных в которой больше 3, если количество строк данных в группе меньше 3, она не будет обработана.
select sid from tb_choice group by sid having count(*)>3;

Упражнение 2. Запросите количество студентов, прошедших 3 курса с оценкой 90 или выше, и количество курсов с оценкой 90 или выше.

  • Данные, которые необходимо сгруппировать, должны содержать более 90 точек.
  • Сгруппировать по номеру ученика
  • Количество курсов в группе должно быть больше или равно 3
select sid, count(*) from tb_choice
where score>=90
group by sid having count(cid) >=3;

Разница между иметь и где

Будут выведены и отображены только данные, соответствующие условиям.

Самая большая разница в том, что объекты действия различны.

  • Предложение where используется в базовой таблице или представлении для выбора кортежей, удовлетворяющих условию.
  • Предложение have используется для группировки и выбирает группы, которые соответствуют условиям из нескольких групп.

Сортировка обработки

В SQL результаты запроса можно сортировать
Синтаксисselect ... from ... order by 列名称1 [asc/desc],列名称2 [asc/desc],...

  • В процессе сортировки сначала сортировать по имени столбца 1, если соответствующие значения столбца 1 равны, то сортировать по значению столбца, соответствующему имени столбца 2
  • Обратите внимание, что по умолчанию используется сортировка в соответствии с естественным порядком указанного столбца.Если вам нужно изменить порядок, используйте ключевое слово desc, а asc является положительным порядком для вывода информации об учащихся в соответствии с возрастом учащихся от самого старшего
    до молодой
select * from tb_student order by age desc;

упражняться

mysql> select * from tb_student order by age desc;
+----+--------+------+------+--------+
| id | name | age | sex | dept |
+----+--------+------+------+--------+
| 3 | 仗义 | 19 | 1 | 大数据 |
| 1 | 小胖 | 18 | 1 | 软工 |
| 2 | 东方 | 16 | 0 | 机壳 |
| 4 | 张骞 | 16 | 1 | 软工 |
| 5 | 张小骞 | 16 | 1 | 软工 |
| 6 | 从来 | 16 | 1 | NULL |
| 8 | 张展 | 16 | 0 | NULL |
+----+--------+------+------+--------+
7 rows in set (0.00 sec)
mysql> select * from tb_student order by age;
+----+--------+------+------+--------+
| id | name | age | sex | dept |
+----+--------+------+------+--------+
| 2 | 东方 | 16 | 0 | 机壳 |
| 4 | 张骞 | 16 | 1 | 软工 |
| 5 | 张小骞 | 16 | 1 | 软工 |
| 6 | 从来 | 16 | 1 | NULL |
| 8 | 张展 | 16 | 0 | NULL |
| 1 | 小胖 | 18 | 1 | 软工 |
| 3 | 仗义 | 19 | 1 | 大数据 |
+----+--------+------+------+--------+
7 rows in set (0.00 sec)
mysql> select * from tb_student order by age desc,id desc;
+----+--------+------+------+--------+
| id | name | age | sex | dept |
+----+--------+------+------+--------+
| 3 | 仗义 | 19 | 1 | 大数据 |
| 1 | 小胖 | 18 | 1 | 软工 |
| 8 | 张展 | 16 | 0 | NULL |
| 6 | 从来 | 16 | 1 | NULL |
| 5 | 张小骞 | 16 | 1 | 软工 |
| 4 | 张骞 | 16 | 1 | 软工 |
| 2 | 东方 | 16 | 0 | 机壳 |
+----+--------+------+------+--------+
7 rows in set (0.00 sec)

упражнение

Определить студентов (количество студентов, имя, пол), курсы (номер курса, название курса), факультативы (количество студентов, номер курса, оценки)

create table if not exists tb_student(
id bigint primary key auto_increment,
name varchar(32) not null,
sex boolean default 1
)engine=innodb default charset utf8;
create table if not exists tb_course(
id bigint primary key auto_increment,
title varchar(32) not null
)engine=innodb default charset utf8;
create table if not exists tb_choice(
sid bigint not null, -- 如果需要进行数据等值判定时,最好数据类型一致
cid bigint not null,
score numeric(4,1),
primary key(sid,cid)
)engine=innodb default charset utf8;

сравнение данных

Если данные в одной таблице совпадают с данными в другой таблице, лучше всего обеспечить согласованность типов данных.

mysql> select '1'=1; -- 进行比较时,如果参与比较的一方是数值类型时,字符串会自动转换为
数值进行比较,所以'1a'=1返回为true
+-------+
| '1'=1 |
+-------+
| 1 |
+-------+
1 row in set (0.00 sec)
mysql> select 'a'='A'; -- 进行字符串比较时,不区分大小写
+---------+
| 'a'='A' |
+---------+
| 1 |
+---------+
1 row in set (0.00 sec)

Supongo que te gusta

Origin blog.csdn.net/qq_39756007/article/details/127015459
Recomendado
Clasificación